"make oldconfig"在Linux内核makefile中完全做了什么?

fre*_*set 75 linux makefile linux-kernel

任何人都可以解释目标"oldconfig"在Linux内核makefile中的作用吗?我看到它在一些构建文档中引用但从未解释它究竟做了什么.

Ign*_*ams 113

它读取现有.config文件并提示用户输入当前内核源中未在文件中找到的选项.这在获取现有配置并将其移动到新内核时非常有用.


Ang*_*dro 22

在运行'make oldconfig'之前您需要将内核配置文件从较旧的内核复制到新内核的根目录中.

您可以在正在运行的系统上找到旧内核配置文件的副本make oldconfig.或者,内核源代码有配置/boot/config-3.11.0

如果您的内核源代码位于/ usr/src/linux

cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig
Run Code Online (Sandbox Code Playgroud)

  • 不要以root身份构建内核!请参阅https://www.youtube.com/watch?v=fMeH7wqOwXA#t=15m44s (3认同)

Cir*_*四事件 20

摘要

正如Ignacio所提到,它.config会在您更新内核源代码后为您更新,例如git pull.

它会尝试保留您现有的选项.

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

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

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

    • 通过相互暗示 select
    • 取决于另一个通过 depends

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

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

首先生成一个默认配置:

make defconfig
Run Code Online (Sandbox Code Playgroud)

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

make oldconfig
Run Code Online (Sandbox Code Playgroud)

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

  1. 线型:

    # CONFIG_XXX is not set
    
    Run Code Online (Sandbox Code Playgroud)

    不仅仅是注释,但实际上表明该参数未设置.

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

    # CONFIG_DEBUG_INFO is not set
    
    Run Code Online (Sandbox Code Playgroud)

    然后跑make oldconfig,它会问我们:

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
    
    Run Code Online (Sandbox Code Playgroud)

    当它结束时,.config文件将被更新.

    如果您更改了该行的任何字符,例如# CONFIG_DEBUG_INFO,则不会计算.

  2. 线型:

    # CONFIG_XXX is not set
    
    Run Code Online (Sandbox Code Playgroud)

    总是用于否定财产,但是:

    CONFIG_XXX=n
    
    Run Code Online (Sandbox Code Playgroud)

    也被理解为否定.

    例如,如果您删除# CONFIG_DEBUG_INFO is not set并回答:

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
    
    Run Code Online (Sandbox Code Playgroud)

    with N,然后输出文件包含:

    # CONFIG_DEBUG_INFO is not set
    
    Run Code Online (Sandbox Code Playgroud)

    并不是:

    CONFIG_DEBUG_INFO=n
    
    Run Code Online (Sandbox Code Playgroud)

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

    CONFIG_DEBUG_INFO=n
    
    Run Code Online (Sandbox Code Playgroud)

    并运行make oldconfig,然后该行被修改为:

    # CONFIG_DEBUG_INFO is not set
    
    Run Code Online (Sandbox Code Playgroud)

    没有oldconfig问我们.

  3. 不符合依赖关系的配置不会出现在.config.所有其他人.

    例如,设置:

    CONFIG_DEBUG_INFO=y
    
    Run Code Online (Sandbox Code Playgroud)

    并运行make oldconfig.现在会问我们:DEBUG_INFO_REDUCED,DEBUG_INFO_SPLIT,等CONFIGS.

    那些属性没有出现在defconfig之前.

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

    config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
        depends on DEBUG_INFO
    
    Run Code Online (Sandbox Code Playgroud)

    所以当DEBUG_INFO它关闭时,它们根本没有显示出来.

  4. 这是CONFIGS selected通过开启CONFIGS自动设置而无需询问用户.

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

    CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
    
    Run Code Online (Sandbox Code Playgroud)

    并且运行make oldconfig,线条得到重新创建而不需要我们,不像DEBUG_INFO.

    这是因为arch/x86/Kconfig 包含:

    config X86
        def_bool y
        [...]
        select ARCH_MIGHT_HAVE_PC_PARPORT
    
    Run Code Online (Sandbox Code Playgroud)

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

  5. 要求提供不满足约束的配置.

    例如,defconfig已设置:

    CONFIG_64BIT=y
    CONFIG_RCU_FANOUT=64
    
    Run Code Online (Sandbox Code Playgroud)

    如果我们编辑:

    CONFIG_64BIT=n
    
    Run Code Online (Sandbox Code Playgroud)

    然后跑make oldconfig,它会问我们:

    Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)
    
    Run Code Online (Sandbox Code Playgroud)

    这是因为RCU_FANOUT定义init/Kconfig如下:

    config RCU_FANOUT
        int "Tree-based hierarchical RCU fanout value"
        range 2 64 if 64BIT
        range 2 32 if !64BIT
    
    Run Code Online (Sandbox Code Playgroud)

    因此,没有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修改,那不是太简单:你如何以非交互方式打开Linux内核.config文件中的功能?


Let*_*_Be 5

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