我应该修改哪个文件以在启动时安装用户覆盖

我应该修改哪个文件以在启动时安装用户覆盖

我正在开发一个带有 Arm Cortex A9 的嵌入式设备。内核版本为4.16.0,由buildroot 2018.05生成。存储内存是一个有多个分区的mmc。 U-boot读取一个分区中的uImage并启动内核。文件系统包含在内核映像中,并在启动时加载到 initramfs 中(配置:BR2_TARGET_ROOTFS_INITRAMFS)。

我想使用overlayfs来使用文件夹(在mmc中)作为“用户”文件系统,安装到/.

我已经尝试成功地覆盖/etc一个/data/etc通过将这些行添加到以下名称的目录/etc/fstab

/dev/mmcblk0p1 /data auto defaults 1 2
overlay /etc overlay x-systemd.requires=/data,lowerdir=/etc,upperdir=/data/etc,workdir=/data/work/etc 0 0

这是可行的,但覆盖层是在 systemd 启动其服务后安装的。因此,例如网络配置是 uImage 中的配置,而不是我的user文件系统中的配置。我想在启动 systemd 之前安装覆盖层,就在/安装之后。

我了解到,在启动时,系统会在 ram 中创建第一个内存空间,然后在其中提取 cpio 映像。然后/安装在那里,系统启动第一个程序:systemd:/sbin/initPID为1。我的理解正确吗?

我已经阅读了很多文章和问答网站,但我仍然不明白我必须在哪里进行更改才能在启动时执行覆盖。包含该操作的文件是什么mount /

答案1

此引导时操作位于 initramfs 中。您需要向您的 中添加一个脚本initramfs/scripts,可能是init-bottom为了根据需要(重新)挂载文件系统,然后生成一个新的 initramfs 包。

init该脚本在内核进程结束时在文件系统之前执行init。令人困惑的原因是因为设置代码并不直接位于文件系统上,而是位于 initramfs 文件中。

答案2

您需要找出叠加层的实际位置,并将其输入到文件中

/etc/fstab

就像您在正在运行的系统中输入它一样。

需要注意的是:您需要将该文件添加到 buildroot 覆盖文件系统中,以便在构建 rootfs 时,buildroot 包含修改后的文件系统表。

举个例子,假设您想要覆盖/dev/mmc0p0超过/家,您将执行以下步骤,使用 MYCOMP 和 MYBOARD 作为您的公司和董事会名称:

- create a filesystem structure in a seperate directory, as 
  specified in the buildroot manual chapter 9.1 "Recommended 
  directory structure", presumably under /tmp/br_ext
- in this directory you add board/MYCOMP/MYBOARD/rottfs_overlay/etc/fstab 
  and fill it with this information:

板/MYCOMP/MYBOARD/rottfs_overlay/etc/fstab:

  /dev/mmc0p0 /home ext4 defaults 0 1

然后,您可以使用以下命令在 buildroot 树中构建文件系统:

make BR2_EXTERNAL=/tmp/br_ext menuconfig
make

重新启动新文件系统后,覆盖层应该就位。

相关内容