“make oldconfig”在Linux内核makefile中究竟做了什么?
任何人都可以解释什么目标“oldconfig”完全在Linux内核的生成文件? 我看到它在一些构build文档中引用,但从来没有解释到底是什么。
它读取现有的.config
文件,并提示用户在当前内核源文件中找不到的选项。 这在采取现有configuration并将其移至新内核时非常有用。
在运行“make oldconfig”之前,您需要将旧内核的内核configuration文件复制到新内核的根目录中。
您可以在运行的系统上的/boot/config-3.11.0
上find旧内核configuration文件的/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
。
它试图保持你现有的select。
有一个脚本是有帮助的,因为:
-
新的选项可能已被添加,或删除旧的选项
-
内核的Kconfigconfiguration格式有以下选项:
- 暗示彼此通过
select
- 取决于另一个通过
depends
这些选项关系使手动configuration解决更加困难。
- 暗示彼此通过
让我们手动修改.config以了解如何parsingconfiguration
首先生成一个默认configuration:
make defconfig
现在手动编辑生成的.config
文件来模拟内核更新并运行:
make oldconfig
看看会发生什么 一些结论:
-
行types:
# 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
,它不会被计数。 -
行types:
# 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
问我们。 -
不符合依赖关系的configuration文件不会出现在
.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
closures时,他们根本没有出现。 -
自动设置由开启的configuration
selected
的configuration,而不询问用户。例如,如果
CONFIG_X86=y
,我们删除该行:CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
并运行
make oldconfig
,不需要问我们就可以重新创build该行,而不像DEBUG_INFO
。发生这种情况是因为
arch/x86/Kconfig
包含:config X86 def_bool y [...] select ARCH_MIGHT_HAVE_PC_PARPORT
并select强制该选项为true。 另见: https : //unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig
-
要求不符合约束条件的configuration。
例如,
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
,但是它也接受一个要合并的configuration片段。 该目标由merge_config.sh
脚本使用: https : merge_config.sh
如果你想自动化.config
修改,那不是太简单: 你如何非交互地打开Linux内核.config文件中的function?
使用新的/更改/删除的选项更新旧的configuration。
从这个页面 :
使oldconfig获取.config并通过Kconfig文件的规则运行它,并生成一个与Kconfig规则一致的.config。 如果有缺失的CONFIG值,那么make oldconfig会询问它们。
如果.config已经与Kconfig中的规则保持一致,那么使oldconfig本质上是一个空操作。
如果要运行make oldconfig,然后再次运行make oldconfig,则第二次不会导致进行任何其他更改。
这是酷刑。 而不是包含一个通用的configuration文件,他们让你打回9000次产生一个。