如何在Linux内核.配置文件中非交互式地开启功能?

15 人关注

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

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

例如,让我们想象一下,在我的 .config 中需要一个叫做 XXX 的选项。对于某些依赖性,我可以这样做。

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

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

是否有一个更受支持的方法来非交互式地做这件事,或者我只能写一个更复杂的搜索和替换脚本?

4 个评论
ed.
你能不能为每次构建都创建一套内容正确的.配置文件?
@ed., 不是一个坏主意。但我不希望这样,因为我需要支持大量的内核,如果为每一个内核都有一个单独的默认 .config ,那将是相当多的工作,因为我只需要包括几个额外的配置选项。(只是它们通常会爆发出大量的子选项,这些子选项也必须被修改,而且我不知道 .config 中的选项名称是否会在不同的内核版本中改变)。我想这是为每个支持的内核版本手工创建一个 .config 的好理由。)
ed.
你可以手工创建一些,并使用diff/patch来修改类似的内容。也许...
@ed.,好主意。如果补丁不能干净地应用,我可以把它作为一个构建失败叫出来。
linux
build
linux-kernel
mpontillo
mpontillo
发布于 2011-09-22
4 个回答
Gustavo Bittencourt
Gustavo Bittencourt
发布于 2022-01-16
已采纳
0 人赞同

内核有一个工具(./scripts/config)来改变.config上的特定选项。下面是一个例子。

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

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

Ciro Santilli OurBigBook.com
Ciro Santilli OurBigBook.com
发布于 2022-01-16
0 人赞同

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
$ # 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

Process substitution does not遗憾的是,工作。

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

替换代码0】是make alldefconfig目标的一个简单前端。

When cross compiling, ARCH must be exported when you run merge_config.sh, e.g.:

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天迁移 :-)

ack
从使用menuconfig所作的更改中创建配置片段(记得将更改保存为 .config.new )。 make x86_x64_defconfig; make menuconfig; diff -u .config{,.new} | sed -ne '4,$s/^+//p' > config-snippet
mkj
mkj
发布于 2022-01-16
0 人赞同

是的,有些配置选项在不同的版本中会改变名称,有时是为了表明细微的语义变化。

我已经写了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文件以获得 当前 依赖关系,但正如你所说,这可能是矫枉过正。
mkj
啊,为此你可能想使用非交互式配置补丁。我想Arjan van de Ven在很多年前为Red Hat内核写了这些补丁,我们在rPath内核中也使用了它们的一个变种。 也许从目前的Fedora内核SRPMs中获取它们是最容易的;我想它们仍然在那里。这将在应用你的修改后采用默认值,这可能会达到你想要的效果。
-ire config.sed 在GNU sed下不工作,它更喜欢线内表达。 sed -i -re "``cat ../../config.sed``" .config 是对我有用的。请注意,双回车键在现实生活中是一个单回车键,我在这里只用它来转义。
scripts/kconfig/merge_config.sh 是一个内置的脚本,它也使用 sed stackoverflow.com/a/39440863/895245
我在这个问题上纠结了很久。我需要把 -r 作为一个单独的参数,而不是放在短参数群中。我的GNU sed 在Ubuntu 16.x+中认为 r -i 的备份文件扩展参数,而不是 "使用扩展的regex"!
John Greene
John Greene
发布于 2022-01-16
0 人赞同

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

Single Option approach

./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)

Multiple-File Merge approach

如果你有几个小的.config-*文件片段,你想有选择地合并到主.config文件中,请执行。

# 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