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

问题描述:

任何人都可以解释什么目标“oldconfig”完全在Linux内核的生成文件?我在某些构建文档中看到它被引用,但从来没有解释它确切地做了什么。“make oldconfig”在Linux内核makefile中做了什么?

它读取现有的.config文件,并提示用户在当前内核源文件中找不到的选项。这在采取现有配置并将其移至新内核时非常有用。

+0

谢谢,非常有帮助。 – 2010-11-16 16:11:10

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

运行'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 
+2

不要以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 

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

类型的
  1. 线:

    # 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,它不算。类型的

  2. 线:

    # 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问我们。

  3. 不符合相关条件的配置文件不会出现在.config上。其他人都这样做。

    例如,设置:

    CONFIG_DEBUG_INFO=y 
    

    并运行make oldconfig。它现在会问我们:DEBUG_INFO_REDUCEDDEBUG_INFO_SPLIT等configs。

    之前,这些属性没有出现在defconfig上。

    如果我们看一下lib/Kconfig.debug它们被定义下,我们看到,他们依赖于DEBUG_INFO

    config DEBUG_INFO_REDUCED 
        bool "Reduce debugging information" 
        depends on DEBUG_INFO 
    

    所以当DEBUG_INFO被关闭,他们并没有显示在所有。

  4. 配置文件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

  5. 要求约束条件不满足的配置。

    例如,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 alldefconfigmake 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次产生一个。

+3

尝试:“是”“| make oldconfig' – 2017-02-20 20:21:57