![我应该修改哪个文件以在启动时安装用户覆盖](https://linux22.com/image/164788/%E6%88%91%E5%BA%94%E8%AF%A5%E4%BF%AE%E6%94%B9%E5%93%AA%E4%B8%AA%E6%96%87%E4%BB%B6%E4%BB%A5%E5%9C%A8%E5%90%AF%E5%8A%A8%E6%97%B6%E5%AE%89%E8%A3%85%E7%94%A8%E6%88%B7%E8%A6%86%E7%9B%96.png)
我正在开发一个带有 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/init
PID为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
重新启动新文件系统后,覆盖层应该就位。