在由Yocto生成的定制Linux镜像中添加新内核参数

7
我正在尝试使用 Yocto项目为我的嵌入式设备生成自定义Linux镜像。
我需要将一个持久的自定义内核参数添加到生成的镜像的/etc/sysctl.conf中。
即:
kernel.core_pipe_limit = 1

/etc/sysctl.conf是由附带于Yocto基础系统的procps软件包(meta/recipes-extended/procps/procps/sysctl.conf)生成的。然而,我认为编辑基础系统中的sysctl.conf并不是推荐的方法。

我正在使用一个新层来定义我的自定义配置。我希望有一种方法可以通过自定义层向基础软件包应用补丁,在部署基础层之后。

我该如何做到这一点?


我知道如何通过更新 /etc/sysctl.conf(或更好地,/etc/sysctl.d/xxx.conf)来持久地更改内核变量。我的问题是,如何生成已应用必要更新的 Linux 镜像?

1
你没有/etc/sysctl.d/吗?检查一下你的sysctl --system做了什么。 - KamilCuk
是的,有 /etc/sysctl.d 目录。但是在 Yocto 最终构建的镜像中添加条目的正确方式是什么? - Anubis
3个回答

5
你可以在镜像配方或 local.conf 中添加类似以下的内容:
set_kernel_opt(){
    mkdir -p ${IMAGE_ROOTFS}/etc/sysctl.d
    echo 'kernel.core_pipe_limit = 1' > ${IMAGE_ROOTFS}/etc/sysctl.d/kernel_core_pipe_limit.conf
}

ROOTFS_POSTPROCESS_COMMAND += "set_kernel_opt;"

如果您想覆盖 /etc/sysctl.conf 文件,您可以创建一个 meta-custom/recipes-extended/procps/procps_%.bbappend 文件,其中包含如下内容:
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"

然后创建一个名为meta-custom/recipes-extended/procps/files的文件夹,并将您自己的sysctl.conf文件复制到其中。


最后,您可以创建一个meta-custom/recipe-custom/custom-config/custom-config.bb食谱:

LICENSE = "CLOSED"

SRC_URI = " \
   file://kernel_core_pipe_limit.conf \
"

PV = "1.0"

S = "${WORKDIR}"

inherit allarch

do_install() {
    install -d ${D}${sysconfdir}/sysctl.d
    install -m 0644 ${B}/kernel_core_pipe_limit.conf ${D}${sysconfdir}/sysctl.d/
}

do_configure[noexec] = "1"
do_compile[noexec] = "1"

将您的kernel_core_pipe_limit.conf复制到meta-custom/recipe-custom/custom-config/files/中。


2
上面的答案在我看来是错误的。已经有一种提供sysctl.conf的配方了,那就是procps。您需要做的是使用bbappend覆盖默认配置。关于附加文件的更多信息,请参见在线Yocto文档
在您的层中的recipes-extended中创建一个procps文件夹、procps_%.bbappendsystctl.conf
meta-my-layer/recipes-extended/
└── procps
    ├── files
    │   └── sysctl.conf
    └── procps_%.bbappend

procps_%.bbappend:

FILESEXTRAPATHS_prepend := "${THISDIR}/files:"`

(sysctl.conf的示例):

fs.protected_hardlinks = 1
fs.protected_symlinks = 1

如果您想保持默认配置并进行追加,则只需要添加一个do_install_append步骤,并使用echo命令来追加您的文本。


1
这个解决方案的好处在于它准确地记录了与原始配方提供的默认文件的更改!赞! - Martin H.
1
我提供了3个解决方案,中间是procps bbappend :) - Nayfe

1
只需在 /etc/sysctl.d 目录下创建一个扩展名为 .conf 的文件即可。
echo 'kernel.core_pipe_limit = 1' > /etc/sysctl.d/bla_bla_change_kernel_core_pipe_limit.conf

来自man sysctl

 --system
              Load settings from all system configuration files. Files are
              read from directories in the following list in given order
              from top to bottom.  Once a file of a given filename is
              loaded, any file of the same name in subsequent directories is
              ignored.
              /run/sysctl.d/*.conf
              /etc/sysctl.d/*.conf
              /usr/local/lib/sysctl.d/*.conf
              /usr/lib/sysctl.d/*.conf
              /lib/sysctl.d/*.conf
              /etc/sysctl.conf

应在系统启动时调用sysctl --system命令。在使用systemd的系统上,可以通过systemd-sysctl.service服务来实现此操作。因此,它应该加载所有的/etc/sysctl.d文件夹中的文件。其语法与/etc/sysct.conf语法文件相同。

谢谢您的回答。但是我该如何将其与我的确切问题联系起来?如何让 Yocto 这样做?即创建自定义 Linux 镜像并正确更新 sysctl.conf(或 sysctl.d/xxx.conf)。 - Anubis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接