谁能解释一下Linux内核的makefile中的目标 "oldconfig "到底是做什么的? 我看到在一些构建文档中提到了它,但从未解释过它的具体作用。
它读取现有的用于旧内核的
.config
文件,并提示用户在当前的内核源中找到文件中没有的选项。当把现有的配置移到一个新的内核上时,这很有用。
如前所述
作者:伊格纳西奥
在你更新内核源之后,它会为你更新你的
.config
,比如说用
git pull
。
It tries to keep your existing options.
有一个这样的脚本是有帮助的,因为。
可能增加了新的选项,或删除了旧的选项
内核的Kconfig配置格式有以下选项。
select
depends
这些选项关系使得手动配置的解决更加困难。
让我们手动修改.config以了解它是如何解析配置的
首先生成一个默认的配置。
make defconfig
现在手动编辑生成的.config
文件以模拟内核更新并运行。
make oldconfig
来看看会发生什么。一些结论。
Lines of type:
# 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
,则不算数。
Lines of type:
# 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
If we edit:
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
,这将使其不一致。
Bonuses
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内核.配置文件中非交互式地开启功能?
Angelo Babudro
发布于
2015-07-28
0
人赞同
在你运行
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
ted
:
不要以root身份构建内核!见
youtube.com/watch?v=fMeH7wqOwXA#t=15m44s