【问题标题】:How do you non-interactively turn on features in a Linux kernel .config file?如何以非交互方式打开 Linux 内核 .config 文件中的功能?
【发布时间】:2011-09-21 18:59:27
【问题描述】:

我有一种情况,我们的软件需要与几种不同的 Linux 内核发行版/内核树一起工作。 (包括 Android 分叉)

在尝试自动化构建过程时,我发现我们需要支持的特定构建的某些 defconfig 文件不包含我们所依赖的内核模块。

例如,假设我在.config 中需要一个名为XXX 的选项。对于某些依赖项,我可以这样做:

sed -i 's/# CONFIG_XXX is not set/CONFIG_XXX=m/' .config

对于其他人来说,这并不容易,因为依赖关系可能跨越多行 .config 语句。

是否有更受支持的非交互方式来执行此操作,还是我坚持编写更复杂的搜索和替换脚本?

【问题讨论】:

  • 您可以为每个构建创建一组包含正确内容的 .config 文件吗?
  • @ed.,不错的主意。不过,我宁愿不这样做,因为我需要支持各种各样的内核,而且为每个内核设置一个单独的默认 .config 会做更多的工作,因为我只需要包含几个额外的配置选项。 (只是它们经常爆发成大量的子选项,这些子选项也必须修改,而且我不知道.config 中的选项名称是否会在内核版本之间发生变化。)我想这是一个很好的论据不过,为每个支持的内核构建手动创建一个.config。 ;-)
  • 您可以手动创建一些并使用 diff/patch 修改类似的。也许……
  • @ed.,好主意。如果补丁没有完全应用,我可以将其称为构建失败。

标签: linux build linux-kernel


【解决方案1】:

内核有一个工具 (./scripts/config) 可以更改 .config 上的特定选项。这是一个例子:

./scripts/config --set-val CONFIG_OPTION y

虽然,它不会检查 .config 文件的有效性。

【讨论】:

    【解决方案2】:

    merge_config.sh 配置片段

    $ cd linux
    $ git checkout v4.9
    $ make x86_64_defconfig
    $ grep -E 'CONFIG_(DEBUG_INFO|GDB_SCRIPTS)[= ]' .config
    # CONFIG_DEBUG_INFO is not set
    $ # GDB_SCRIPTS depends on CONFIG_DEBUG_INFO in lib/Kconfig.debug.
    $ cat <<EOF >.config-fragment
    > CONFIG_DEBUG_INFO=y
    > CONFIG_GDB_SCRIPTS=y
    > EOF
    $ # Order is important here. Must be first base config, then fragment.
    $ ./scripts/kconfig/merge_config.sh .config .config-fragment
    $ grep -E 'CONFIG_(DEBUG_INFO|GDB_SCRIPTS)[= ]' .config
    CONFIG_DEBUG_INFO=y
    CONFIG_GDB_SCRIPTS=y
    

    不幸的是,进程替换不起作用

    ./scripts/kconfig/merge_config.sh arch/x86/configs/x86_64_defconfig \
        <( printf 'CONFIG_DEBUG_INFO=y\nCONFIG_GDB_SCRIPTS=y\n' ) 
    

    因为:https://unix.stackexchange.com/a/164109/32558

    merge_config.shmake alldefconfig 目标的简单前端。

    交叉编译时,运行merge_config.sh时必须导出ARCH,例如:

    export ARCH=arm64
    export CROSS_COMPILE=aarch64-linux-gnu-
    make defconfig
    ./scripts/kconfig/merge_config.sh .config .config-fragment
    

    可以使用KCONFIG_CONFIG 环境变量显式指定合并的输出文件;否则它只会覆盖.config:

    KCONFIG_CONFIG=some/path/.config ./scripts/kconfig/merge_config.sh .config .config-fragment
    

    Buildroot 使用 BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES: How do I configure the Linux kernel within Buildroot? 自动化它

    相关:https://unix.stackexchange.com/questions/19905/how-to-non-interactively-configure-the-linux-kernel-build 20 天前迁移 :-)

    【讨论】:

    • 从使用 menuconfig 所做的更改创建配置 sn-ps(记得将更改保存为 .config.new):make x86_x64_defconfig; make menuconfig; diff -u .config{,.new} | sed -ne '4,$s/^+//p' &gt; config-snippet
    【解决方案3】:

    是的,一些配置选项会在不同版本之间更改名称,有时作为细微语义变化的指示。

    我编写了 python 类来将一组配置片段合并到基本内核配置文件中。不过,这对你来说太过分了;您可以执行与 sed 脚本相同的操作;你不限于单行。

    sed -ir 's/^(CONFIG_XXX=.*|# CONFIG_XXX is not set)/CONFIG_XXX=m/;
             s/^(CONFIG_FOO=.*|# CONFIG_FOO is not set)/CONFIG_FOO=m/;
             s/^(CONFIG_BAR=.*|# CONFIG_BAR is not set)/CONFIG_BAR=m/' .config
    

    或者甚至创建一个单独的脚本。比如说,config.sed 包含以下行:

    s/^(CONFIG_XXX=.*|# CONFIG_XXX is not set)/CONFIG_XXX=m/;
    s/^(CONFIG_FOO=.*|# CONFIG_FOO is not set)/CONFIG_FOO=m/;
    s/^(CONFIG_BAR=.*|# CONFIG_BAR is not set)/CONFIG_BAR=m/;
    

    然后就可以运行了

    sed -ire config.sed .config
    

    希望有帮助!

    【讨论】:

    • +1 感谢您的回复和其他想法。我只是在考虑解析 Kconfig 文件以获取 actual 依赖项,但正如您所说,这可能是矫枉过正。
    • 啊,为此您可能需要使用非交互式配置补丁。我认为 Arjan van de Ven 多年前最初为 Red Hat 内核编写了它们,我们将它们的一个变体用于 rPath 内核。可能最容易从当前的 Fedora 内核 SRPM 中提取它们;我想他们还在那里。这将在应用您的更改后采用默认值,这可能会满足您的需求。
    • -ire config.sed 在 GNU sed 下不起作用,它更喜欢内联表达式。 sed -i -re "``cat ../../config.sed``" .config 是适合我的。注意双反引号是单反是现实生活中的,我这里只用它来逃避。
    • scripts/kconfig/merge_config.sh 是一个内置脚本,也使用sed: stackoverflow.com/a/39440863/895245
    • 我为此苦苦挣扎了好一阵子。我需要将-r 作为单独的参数而不是短参数集群。从 Ubuntu 16.x+ 开始,我的 GNU sed 认为 r-i 的备份文件扩展参数,而不是“使用扩展正则表达式”!
    【解决方案4】:

    在更新任何和所有配置依赖项的同时对单个配置进行一系列简单的翻转:

    单选项方法

    ./scripts/config --set-val CONFIG_OPTION y
    ./scripts/config --enable CONFIG_BRIDGE
    ./scripts/config --enable CONFIG_MODULES
    ./scripts/config --disable CONFIG_X25
    ./scripts/config --module CONFIG_NFT
    make oldconfig
    (updates dependencies; may prompt with new dependencies, but old deps silently goes away)
    

    多文件合并方法

    如果您想要有选择地合并到主.config 文件中的.config-* 文件的几个小sn-ps,请执行:

    # Merge IP fragment CONFIG_ settings into the main .config file
    ./scripts/kconfig/merge_config.sh .config .config-fragment
    # Merge  Notebook HW-specific CONFIG_ settings into main .config file
    ./scripts/kconfig/merge_config.sh .config .config-notebook-toshiba
    
    # Auto-add/auto-remove CONFIG_ dependencies
    make oldconfig
    

    参考文献

    【讨论】:

      猜你喜欢
      • 2018-04-13
      • 2021-12-06
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      相关资源
      最近更新 更多