“make oldconfig”在 Linux 内核 makefile 中究竟做了啥?
Posted
技术标签:
【中文标题】“make oldconfig”在 Linux 内核 makefile 中究竟做了啥?【英文标题】:What does "make oldconfig" do exactly in the Linux kernel makefile?“make oldconfig”在 Linux 内核 makefile 中究竟做了什么? 【发布时间】:2011-05-09 21:01:30 【问题描述】:谁能解释一下目标“oldconfig”在Linux内核makefile中的作用?我看到它在一些构建文档中被引用,但从未解释过它的确切作用。
【问题讨论】:
【参考方案1】:它读取用于旧内核的现有.config
文件,并提示用户在当前内核源代码中未在文件中找到的选项。这在采用现有配置并将其移动到新内核时很有用。
【讨论】:
【参考方案2】:总结
如by Ignacio 所述,它会在您更新内核源代码后为您更新您的.config
,例如git pull
。
它试图保留您现有的选择。
为此编写一个脚本会很有帮助,因为:
可能已添加新选项,或已删除旧选项
内核的 Kconfig 配置格式具有以下选项:
通过select
相互暗示
通过depends
依赖另一个
这些选项关系使手动配置解析更加困难。
让我们手动修改 .config 以了解它如何解析配置
首先生成一个默认配置:
make defconfig
现在手动编辑生成的.config
文件以模拟内核更新并运行:
make oldconfig
看看会发生什么。一些结论:
类型的行:
# CONFIG_XXX is not set
不是单纯的cmets,而是实际表示没有设置参数。
例如,如果我们删除该行:
# CONFIG_DEBUG_INFO is not set
然后运行make oldconfig
,它会问我们:
Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
结束后,.config
文件将被更新。
如果您更改行的任何字符,例如到# CONFIG_DEBUG_INFO
,不算数。
类型的行:
# CONFIG_XXX is not set
总是用于否定属性,虽然:
CONFIG_XXX=n
也可以理解为否定。
例如,如果您删除 # CONFIG_DEBUG_INFO is not set
并回答:
Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
使用N
,则输出文件包含:
# CONFIG_DEBUG_INFO is not set
而不是:
CONFIG_DEBUG_INFO=n
另外,如果我们手动修改该行为:
CONFIG_DEBUG_INFO=n
并运行make oldconfig
,然后该行被修改为:
# CONFIG_DEBUG_INFO is not set
没有oldconfig
询问我们。
不满足依赖关系的配置不会出现在.config
上。所有其他人都这样做。
例如设置:
CONFIG_DEBUG_INFO=y
然后运行make oldconfig
。它现在会要求我们提供:DEBUG_INFO_REDUCED
、DEBUG_INFO_SPLIT
等配置。
这些属性之前没有出现在defconfig
上。
如果我们查看定义它们的lib/Kconfig.debug
,我们会看到它们依赖于DEBUG_INFO
:
config DEBUG_INFO_REDUCED
bool "Reduce debugging information"
depends on DEBUG_INFO
所以当DEBUG_INFO
关闭时,他们根本没有出现。
selected
开启的配置会自动设置,无需询问用户。
例如,如果CONFIG_X86=y
并且我们删除该行:
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
然后运行make oldconfig
,与DEBUG_INFO
不同,该行无需询问我们即可重新创建。
这是因为arch/x86/Kconfig
包含:
config X86
def_bool y
[...]
select ARCH_MIGHT_HAVE_PC_PARPORT
并选择强制该选项为真。另见:https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig
要求不满足约束的配置。
例如,defconfig
已设置:
CONFIG_64BIT=y
CONFIG_RCU_FANOUT=64
如果我们编辑:
CONFIG_64BIT=n
然后运行make oldconfig
,它会问我们:
Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)
这是因为RCU_FANOUT
在init/Kconfig
中定义为:
config RCU_FANOUT
int "Tree-based hierarchical RCU fanout value"
range 2 64 if 64BIT
range 2 32 if !64BIT
因此,没有64BIT
,最大值为32
,但我们在.config
上设置了64
,这会使其不一致。
奖金
make olddefconfig
将每个选项设置为默认值,无需交互询问。它会在make
上自动运行,以确保.config
是一致的,以防您像我们一样手动修改它。另见:https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree
make alldefconfig
类似于make olddefconfig
,但它也接受配置片段进行合并。此目标由merge_config.sh
脚本使用:https://***.com/a/39440863/895245
如果你想自动修改.config
,那就不太简单了:How do you non-interactively turn on features in a Linux kernel .config file?
【讨论】:
【参考方案3】:在运行make oldconfig
之前,您需要将内核配置文件从旧内核复制到新内核的根目录中。
您可以在/boot/config-3.11.0
找到正在运行的系统上的旧内核配置文件的副本。或者,内核源代码在linux-3.11.0/arch/x86/configs/i386_defconfig / x86_64_defconfig
中有配置
如果你的内核源代码位于/usr/src/linux
:
cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig
【讨论】:
不要以root身份构建内核!见youtube.com/watch?v=fMeH7wqOwXA#t=15m44s【参考方案4】:使用新的/更改的/删除的选项更新旧配置。
【讨论】:
【参考方案5】:来自page:
Make oldconfig 获取 .config 并通过 Kconfig 文件并生成一个与 Kconfig 规则。如果缺少 CONFIG 值,则 make oldconfig 会要求他们。
如果 .config 已经与 Kconfig 中的规则一致, 那么 make oldconfig 本质上是一个空操作。
如果您要运行 make oldconfig,然后运行 make oldconfig a 第二次,第二次不会导致任何额外的变化 制作。
【讨论】:
【参考方案6】:这是一种折磨。它们不是包含一个通用的 conf 文件,而是让你点击 return 9000 次来生成一个。
【讨论】:
试试:yes "" | make oldconfig
以上是关于“make oldconfig”在 Linux 内核 makefile 中究竟做了啥?的主要内容,如果未能解决你的问题,请参考以下文章
linux应用中,在一个进程内如何获取本进程内其它线程的堆栈信息、