【问题标题】:What does "make oldconfig" do exactly in the Linux kernel makefile?“make oldconfig”在 Linux 内核 makefile 中究竟做了什么?
【发布时间】:2011-05-09 21:01:30
【问题描述】:

谁能解释一下目标“oldconfig”在Linux内核makefile中的作用?我看到它在一些构建文档中被引用,但从未解释过它的确切作用。

【问题讨论】:

    标签: linux makefile linux-kernel


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      总结

      by Ignacio 所述,它会在您更新内核源代码后为您更新您的.config,例如git pull

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

      为此编写一个脚本会很有帮助,因为:

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

      • 内核的 Kconfig 配置格式具有以下选项:

        • 通过select相互暗示
        • 通过depends依赖另一个

        这些选项关系使手动配置解析更加困难。

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

      首先生成一个默认配置:

      make defconfig
      

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

      make oldconfig
      

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

      1. 类型的行:

        # CONFIG_XXX is not set
        

        不是单纯的cmets,而是实际表示没有设置参数。

        例如,如果我们删除该行:

        # 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 等配置。

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

        如果我们查看定义它们的lib/Kconfig.debug,我们会看到它们依赖于DEBUG_INFO

        config DEBUG_INFO_REDUCED
            bool "Reduce debugging information"
            depends on DEBUG_INFO
        

        所以当DEBUG_INFO 关闭时,他们根本没有出现。

      4. 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
        

        并选择强制该选项为真。另见: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_FANOUTinit/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,但它也接受配置片段进行合并。此目标由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】:

        在运行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
        

        【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          来自page

          Make oldconfig 获取 .config 并通过 Kconfig 文件并生成一个与 Kconfig 规则。如果缺少 CONFIG 值,则 make oldconfig 会要求他们。

          如果 .config 已经与 Kconfig 中的规则一致, 那么 make oldconfig 本质上是一个空操作。

          如果您要运行 make oldconfig,然后运行 ​​make oldconfig a 第二次,第二次不会导致任何额外的变化 制作。

          【讨论】:

            【解决方案6】:

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

            【讨论】:

            • 试试:yes "" | make oldconfig
            猜你喜欢
            • 2011-06-18
            • 2012-07-23
            • 2016-09-10
            • 2023-03-15
            • 2012-10-17
            • 2021-06-04
            • 1970-01-01
            • 2018-07-30
            相关资源
            最近更新 更多