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

任何人都可以解释什么目标“oldconfig”完全在Linux内核的生成文件? 我看到它在一些构build文档中引用,但从来没有解释到底是什么。

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

在运行“make oldconfig”之前,您需要将旧内核的内核configuration文件复制到新内核的根目录中。

您可以在运行的系统上的/boot/config-3.11.0上find旧内核configuration文件的/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 

概要

正如Ignacio提到的那样 ,在更新内核源代码后,它会为你更新你的.config ,比如用git pull

它试图保持你现有的select。

有一个脚本是有帮助的,因为:

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

  • 内核的Kconfigconfiguration格式有以下选项:

    • 暗示彼此通过select
    • 取决于另一个通过depends

    这些选项关系使手动configuration解决更加困难。

让我们手动修改.config以了解如何parsingconfiguration

首先生成一个默认configuration:

 make defconfig 

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

 make oldconfig 

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

  1. 行types:

     # 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. 行types:

     # 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. 不符合依赖关系的configuration文件不会出现在.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_INFOclosures时,他们根本没有出现。

  4. 自动设置由开启的configurationselected的configuration,而不询问用户。

    例如,如果CONFIG_X86=y ,我们删除该行:

     CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y 

    并运行make oldconfig ,不需要问我们就可以重新创build该行,而不像DEBUG_INFO

    发生这种情况是因为arch/x86/Kconfig包含:

     config X86 def_bool y [...] select ARCH_MIGHT_HAVE_PC_PARPORT 

    并select强制该选项为true。 另见: https : //unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig

  5. 要求不符合约束条件的configuration。

    例如, 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 ,但是它也接受一个要合并的configuration片段。 该目标由merge_config.sh脚本使用: https : merge_config.sh

如果你想自动化.config修改,那不是太简单: 你如何非交互地打开Linux内核.config文件中的function?

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

从这个页面 :

使oldconfig获取.config并通过Kconfig文件的规则运行它,并生成一个与Kconfig规则一致的.config。 如果有缺失的CONFIG值,那么make oldconfig会询问它们。

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

如果要运行make oldconfig,然后再次运行make oldconfig,则第二次不会导致进行任何其他更改。

这是酷刑。 而不是包含一个通用的configuration文件,他们让你打回9000次产生一个。