谁能解释一下目标“ oldconfig”在Linux内核makefile中到底做了什么?我在某些构建文档中看到了它的引用,但从未解释它的确切功能。
Answers:
它读取现有.config
文件,并提示用户输入当前内核源中未在文件中找到的选项。当采用现有配置并将其移至新内核时,这很有用。
在运行之前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
概要
如Ignacio所述,它.config
会在您更新内核源代码后为您更新您的代码,例如使用git pull
。
它试图保留您现有的选项。
拥有一个脚本对此很有帮助,因为:
可能已添加新选项,或已删除旧选项
内核的Kconfig配置格式具有以下选项:
select
depends
这些选项关系使手动配置解析更加困难。
让我们手动修改.config以了解其如何解析配置
首先使用以下命令生成默认配置:
make defconfig
现在,.config
手动编辑生成的文件以模拟内核更新并运行:
make oldconfig
看看会发生什么。一些结论:
类型行:
# CONFIG_XXX is not set
不仅仅是注释,而是实际上表明未设置参数。
例如,如果我们删除该行:
# 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
,等CONFIGS。
这些属性未显示在 defconfig
之前。
如果我们查看lib/Kconfig.debug
它们的定义位置,就会发现它们取决于DEBUG_INFO
:
config DEBUG_INFO_REDUCED
bool "Reduce debugging information"
depends on DEBUG_INFO
所以什么时候 DEBUG_INFO
他们离开的时候,他们根本没有露面。
的配置是 selected
通过开启CONFIGS自动设置而无需询问用户。
例如,如果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
并选择强制该选项为true。另请参阅: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
,但是我们在上64
设置了.config
,这将使其不一致。
奖金
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 //stackoverflow.com/a/39440863/895245
而且,如果要自动执行.config
修改,那不是太简单:如何非交互地打开Linux内核.config文件中的功能?