ChatGPT解决这个技术问题 Extra ChatGPT

“make oldconfig”在 Linux 内核 makefile 中究竟做了什么?

谁能解释一下目标“oldconfig”在Linux内核makefile中到底做了什么?我看到它在一些构建文档中被引用,但从未解释它究竟做了什么。


C
Chan Kim

它读取用于旧内核的现有 .config 文件,并提示用户在当前内核源代码中未在文件中找到的选项。这在采用现有配置并将其移动到新内核时很有用。


C
Ciro Santilli Путлер Капут 六四事

概括

正如提到的 by Ignacio,它会在您更新内核源代码后为您更新您的 .config,例如使用 git pull

它试图保留您现有的选择。

有一个脚本是有帮助的,因为:

可能已添加新选项,或已删除旧选项

内核的 Kconfig 配置格式具有以下选项: 通过 select 暗示彼此依赖于另一个 viadepend 这些选项关系使手动配置解析更加困难。

通过选择相互暗示

依赖于另一个通过依赖

让我们手动修改 .config 以了解它如何解析配置

首先生成一个默认配置:

make defconfig

现在手动编辑生成的 .config 文件以模拟内核更新并运行:

make oldconfig

看看会发生什么。一些结论:

Lines of type: # CONFIG_XXX is not set 不是单纯的注释,而是实际表明该参数没有设置。例如,如果我们删除这行:# CONFIG_DEBUG_INFO is not set 并运行 make oldconfig,它会询问我们:Compile kernel with debug info (DEBUG_INFO) [N/y/?] (NEW) 当它结束时,.配置文件将被更新。如果您更改该行的任何字符,例如更改为# 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) with N,那么输出文件包含:# CONFIG_DEBUG_INFO is not set and not: CONFIG_DEBUG_INFO=n 另外,如果我们手动修改该行为: CONFIG_DEBUG_INFO=n 并运行 make oldconfig,那么该行将修改为: # CONFIG_DEBUG_INFO is not set without 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 “减少调试信息”依赖于 DEBUG_INFO 所以当 DEBUG_INFO 关闭时,它们根本没有出现。通过打开的配置选择的配置会自动设置,无需询问用户。例如,如果 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 hierarchy RCU fanout value (RCU_FANOUT) [32] (NEW) 这是因为 RCU_FANOUT在 init/Kconfig 中定义为: config RCU_FANOUT int "Tree-based hierarchy RCU fanout value" range 2 64 if 64BIT range 2 32 if !64BIT 因此,没有 64BIT,最大值为 32,但我们在 .配置,这将使其不一致。

奖金

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 修改,那就不太简单了:How do you non-interactively turn on features in a Linux kernel .config file?


M
Melebius

在运行 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
Š
Šimon Tóth

使用新/更改/删除选项更新旧配置。


D
Danial

这是一种折磨。它们不是包含一个通用的 conf 文件,而是让你点击 return 9000 次来生成一个。


尝试:yes "" | make oldconfig
N
Nan Xiao

从此page

Make oldconfig 获取 .config 并通过 Kconfig 文件的规则运行它,并生成与 Kconfig 规则一致的 .config。如果缺少 CONFIG 值,make oldconfig 将要求它们。如果 .config 已经与 Kconfig 中的规则一致,则 make oldconfig 本质上是无操作的。如果您要运行 make oldconfig,然后再次运行 make oldconfig,则第二次不会导致进行任何其他更改。