在 yocto 映像中启动时强制 FSCK
Force FSCK on boot in yocto image
我想对我的 bitbake
图片执行文件系统检查。如果我理解正确,我需要将 fsck=force
和 fsck.repair=yes
添加到 /proc/cmdline
。这种方法正确吗?修改 /proc/cmdline
的正确方法是什么?
编辑:我 运行 oe-pkgdata-util find-path /proc/cmdline
以 ERROR: Unable to find any package producing path /proc/cmdline
退出。因此,我推测它是在内核编译期间生成的。对吗?
;tldr 将你的东西添加到 U-Boot 中的 bootargs
变量
首先,是的,您的方法是正确的——您需要在引导时将两个参数 fsck=force
和 fsck.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 在系统启动时触发它,然后定期触发它。这实际上不是您想要的,但也许这也适合您的情况。
我想对我的 bitbake
图片执行文件系统检查。如果我理解正确,我需要将 fsck=force
和 fsck.repair=yes
添加到 /proc/cmdline
。这种方法正确吗?修改 /proc/cmdline
的正确方法是什么?
编辑:我 运行 oe-pkgdata-util find-path /proc/cmdline
以 ERROR: Unable to find any package producing path /proc/cmdline
退出。因此,我推测它是在内核编译期间生成的。对吗?
;tldr 将你的东西添加到 U-Boot 中的 bootargs
变量
首先,是的,您的方法是正确的——您需要在引导时将两个参数 fsck=force
和 fsck.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 在系统启动时触发它,然后定期触发它。这实际上不是您想要的,但也许这也适合您的情况。