“make oldconfig”在Linux内核makefile中做了什么?
任何人都可以解释什么目标“oldconfig”完全在Linux内核的生成文件?我在某些构建文档中看到它被引用,但从来没有解释它确切地做了什么。“make oldconfig”在Linux内核makefile中做了什么?
它读取现有的.config
文件,并提示用户在当前内核源文件中找不到的选项。这在采取现有配置并将其移至新内核时非常有用。
用新的/更改/删除的选项更新旧配置。
运行'make oldconfig'之前您需要将内核配置文件从较旧的内核复制到新内核的根目录中。
您可以在正在运行的系统上找到旧内核配置文件的副本,地址为/boot/config-3.11.0
。另外,内核源代码在linux-3.11.0/arch/x86/configs/{i386_defconfig/x86_64_defconfig}
CONFIGS如果你的内核源位于位于/ usr/src/linux中
cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig
不要以root身份建立内核!请参阅https://www.youtube.com/watch?v=fMeH7wqOwXA#t=15m44s – ted 2015-01-17 17:20:15
从这个page:
使oldconfig会采取的.config和运行它通过 Kconfig文件的规则,并生成一个与.config配合使用的.config,与 Kconfig规则一致。如果缺少CONFIG值,make oldconfig将询问它们。
如果.config已经与Kconfig, 中的规则保持一致,那么使oldconfig本质上是空操作。
如果您要运行make oldconfig,然后再运行make oldconfig a 第二次,第二次不会引起任何额外的更改为 作出。
摘要
如前所述by 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://*.com/a/39440863/895245
如果你想自动化.config
修改,是不是太简单了:How do you non-interactively turn on features in a Linux kernel .config file?
它的折磨。而不是包含一个通用的配置文件,他们让你回归9000次产生一个。
尝试:“是”“| make oldconfig' – 2017-02-20 20:21:57
谢谢,非常有帮助。 – 2010-11-16 16:11:10