代码之家  ›  专栏  ›  技术社区  ›  fred basset

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

  •  66
  • fred basset  · 技术社区  · 15 年前

    有人能解释一下目标“oldconfig”在Linux内核makefile中到底做了什么吗?我在一些构建文档中看到了它的引用,但是从来没有解释过它的确切功能。

    6 回复  |  直到 11 年前
        1
  •  113
  •   Ignacio Vazquez-Abrams    15 年前

    它读懂了现存的东西 .config 文件,并提示用户在当前内核源中输入文件中未找到的选项。在使用现有配置并将其移动到新内核时,这很有用。

        2
  •  22
  •   Melebius    7 年前

    在你跑之前 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
    
        3
  •  20
  •   Ciro Santilli OurBigBook.com    9 年前

    摘要

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

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

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

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

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

      • 互相暗示 select
      • 依靠另一个通道 depends

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

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

    首先生成默认配置:

    make defconfig
    

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

    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_DEBUG_INFO ,不算数。

    2. 类型行:

      #未设置配置XXX
      

      总是用于否定属性,尽管:

      CONFIG_XXX=n
      

      也被理解为否定。

      例如,如果删除 # CONFIG_DEBUG_INFO is not set 然后回答:

      用debug info(debug_info)[N/y/?](新)
      

      具有 N ,则输出文件包含:

      #未设置配置调试信息
      

      而不是:

      CONFIG_DEBUG_INFO=n
      

      另外,如果我们手动将行修改为:

      配置调试信息=n
      

      然后跑 创建oldconfig ,则该行被修改为:

      #未设置配置调试信息
      

      没有 oldconfig 问我们。

    3. 不满足其依赖项的配置,不显示在 .配置 . 其他人都会。

      例如,设置:

      CONFIG_DEBUG_INFO=y
      

      然后跑 创建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
      

      所以当 调试信息 他们一点也没出现。

    4. 配置 selected 打开后,配置将自动设置,而不询问用户。

      例如,如果 CONFIG_X86=y 我们删除了这条线:

      CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
      

      然后跑 创建oldconfig ,不需要询问我们就可以重新创建该行,不像 调试信息 .

      这是因为 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. 要求不满足其约束的配置。

      例如, 定义 已设置:

      CONFIG_64BIT=y
      CONFIG_RCU_FANOUT=64
      

      如果我们编辑:

      CONFIG_64BIT=n
      

      然后跑 创建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 设置在 .配置 ,这将使其不一致。

    奖金

    make olddefconfig 将每个选项设置为其默认值,而不进行交互询问。它会自动运行 make 以确保 .配置 是一致的,以防你像我们一样手动修改它。另见: https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree

    make alldefconfig 就像 生成oldefconfig ,但它也接受要合并的配置片段。这个目标被 merge_config.sh 脚本: https://stackoverflow.com/a/39440863/895245

    如果你想自动化 .配置 修改,这不太简单: How do you non-interactively turn on features in a Linux kernel .config file?

        4
  •  5
  •   Å imon Tóth    15 年前

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

        5
  •  2
  •   Nan Xiao Jonathan Wakely    11 年前

    从这个 page :

    Make oldconfig接受.config并按照 Kconfig文件并生成与 Kconfig规则。如果缺少配置值,则 oldconfig会找他们的。

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

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

        6
  •  0
  •   Danial    9 年前

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