在 yocto 映像中启动时强制 FSCK

Force FSCK on boot in yocto image

我想对我的 bitbake 图片执行文件系统检查。如果我理解正确,我需要将 fsck=forcefsck.repair=yes 添加到 /proc/cmdline。这种方法正确吗?修改 /proc/cmdline 的正确方法是什么?

编辑:我 运行 oe-pkgdata-util find-path /proc/cmdlineERROR: Unable to find any package producing path /proc/cmdline 退出。因此,我推测它是在内核编译期间生成的。对吗?

;tldr 将你的东西添加到 U-Boot 中的 bootargs 变量

首先,是的,您的方法是正确的——您需要在引导时将两个参数 fsck=forcefsck.repair=yes 作为引导参数传递给您的内核。但是你看错了方向。所有这些都是关于引导和 Linux 内核的,实际上与 Yocto 或 bitbake 无关。

有几种方法可以将引导参数传递给内核,例如

  • 硬编码到内核代码中(暴力选项,你必须挖掘源代码:))
  • 使用 CONFIG_CMDLINE 内核配置(docs 说引导加载程序参数将附加到它)
  • 通过引导加载程序传递参数(最灵活和可用的方式)
  • 通过 .dtb-file (Device Tree Binary file, more of this here)
  • 传递参数
  • 发明其他东西,因为 Linux 内核是一把 DIY 瑞士军刀

使用 CONFIG_CMDLINE 很简单 - 只需将您附加到此变量,例如

CONFIG_CMDLINE=" loglevel=3 fsck=force fsck.repair=yes"

有关在 Yocto 中调整内核配置的更多信息 here

最好的方法 是使用引导加载程序将参数传递给内核。在 Yocto 中,您可能使用 U-Boot 作为引导加载程序,因此 bootargs 环境变量(在 U-​​Boot 环境中,而不是在 linux 用户空间环境中)是 what you need.

首先,尝试搜索文件uEnv.txt。它可以在 /boot 文件夹中的主分区上找到,也可以在单独的引导分区上找到。此文件包含 U-Boot 的一些额外配置选项。例如,可能为内核指定了默认控制台 - 选项 console=...。你可以在那里的某个地方附加你的东西。可能会有用于向内核添加引导参数的特定选项。在 U-Boot 内部,此类选项将在引导过程中附加到 bootargs

如果你在你的设备上找到 uEnv.txt,那么它应该在 Yocto 的某个地方。搜索 BSP 元层。

如果你的设备没有这样的文件,坏消息 - 你将不得不挖掘一些 U-Boot 代码))实际上将 bootargs 环境变量设置为适当值的命令是这个

env set bootargs ${bootargs} fsck=force fsck.repair=yes

U-Boot 被打包为单个二进制文件并通过一些偏移写入存储设备(SD 卡或其他)。这里重要的是,在普通启动过程中,您无法手动访问 U-Boot - 它只是自动加载,做一些事情并加载内核。

不过,您可以连接到设备的默认调试控制台(可能使用 UART)并在那里手动输入命令,但此启动顺序将无法重现 - 下次启动设备时,将不会应用此命令.

这就是为什么您需要将此命令准确地嵌入到 U-Boot 源代码中 - 以便在每次启动时立即应用命令。

内部 U-Boot 源查找您设备的配置文件。这应该是 .h-文件(C 头文件),其中包含您的电路板名称作为其名称的一部分,其中包含变量 BOOTENV_BOOTCOMMAND and/or BOOTENV。此变量定义 U-Boot 的引导脚本。也就是说,特定设备的启动顺序是不变的——在启动期间应该不需要任何手动交互。也就是说,在每次引导期间,U-Boot 都在做几乎相同的事情。正是这些东西以长 C 字符串的形式硬编码在 BOOTENV_BOOTCOMMAND and/or BOOTENV 中,带有 U-Boot 的引导脚本(就像 bash-script)。

在那里你可以添加这个命令

env set bootargs ${bootargs} fsck=force fsck.repair=yes

或者您可能会发现 bootargs 定义本身,例如 bootargs=...,因此请在此处添加参数。

还要考虑用户空间实用程序 fsck。您可以配置 systemd 在系统启动时触发它,然后定期触发它。这实际上不是您想要的,但也许这也适合您的情况。