任何人都可以解释目标“oldconfig”在Linux内核makefile中的作用吗?我在一些构建文档中看到它被引用但从未解释过它的确切内容。
答案 0 :(得分:109)
它读取现有的.config
文件,并提示用户输入当前内核源中未在文件中找到的选项。这在获取现有配置并将其移动到新内核时非常有用。
答案 1 :(得分:20)
在运行'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
答案 2 :(得分:15)
<强>摘要强>
如上所述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
等配置。
这些属性之前没有出现在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
并选择强制该选项为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
修改,那不是太简单:How do you non-interactively turn on features in a Linux kernel .config file?
答案 3 :(得分:5)
使用新/更改/删除选项更新旧配置。
答案 4 :(得分:2)
从此page:
make oldconfig接受.config并通过规则运行它 Kconfig文件并生成一个与.con一致的.config Kconfig规则。如果缺少CONFIG值,则make oldconfig会要求他们。
如果.config已经与Kconfig中的规则一致, 然后make oldconfig本质上是一个无操作。
如果要运行make oldconfig,然后运行make oldconfig a 第二次,第二次不会引起任何额外的改变 制成。
答案 5 :(得分:0)
这是折磨。它们不会包含通用配置文件,而是让您返回9000次以生成一个。