【问题标题】:Add New Kernel Parameter To Custom Linux Image Generated By Yocto向 Yocto 生成的自定义 Linux 映像添加新内核参数
【发布时间】:2019-07-17 07:56:49
【问题描述】:

我正在尝试使用 Yocto project 为我的嵌入式设备生成自定义 Linux 映像。

我需要在生成的图像的/etc/sysctl.conf 中添加一个持久的自定义内核参数。

kernel.core_pipe_limit = 1

/etc/sysctl.confprocps 包生成,该包附带Yocto 基本系统(meta/recipes-extended/procps/procps/sysctl.conf)。但是,我认为不推荐在基本系统中编辑sysctl.conf

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

我该怎么做?


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

【问题讨论】:

  • 你没有/etc/sysctl.d/ 吗?检查你的 sysctl --system 做了什么。
  • 是的,有/etc/sysctl.d。但是在 Yocto 构建的最终图像中添加条目的正确方法是什么?

标签: linux linux-kernel embedded-linux yocto procps


【解决方案1】:

您可以在图像配方或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】:

    只需在/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 做到这一点?即使用正确更新的sysctl.conf(或sysctl.d/xxx.conf)创建自定义 Linux 映像。
    【解决方案3】:

    我认为上面的答案是错误的。已经有一个提供 sysctl.conf 的配方。它是procps。您需要做的是使用 bbappend 覆盖默认配置。更多关于在online Yocto documention上追加文件

    创建一个procps文件夹,procps_%.bbappendsystctl.conf在recipes-extended在你的层,如

    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。

    【讨论】:

    • 这个解决方案的好处是它准确地记录了原始配方提供的默认文件的更改!赞一个!
    • 我给出了 3 个解决方案,中间是 procps bbappend :)
    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 2019-12-07
    • 2021-05-31
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多