在基于 Yocto Linux 的嵌入式设备上,我的 rootfs 是 RO,而我有一个用于 RW 数据的附加分区。现在我想在启动时自动挂载覆盖到存储在不同分区上的 /etc 。这是我的 fstab:
/dev/mmcblk0p6 /data_local ext4 defaults,sync,noexec,rw 0 2
[...]
overlay /etc overlay defaults,lowerdir=/etc,upperdir=/data_local/overlayfs/upper/etc,workdir=/data_local/overlayfs/workdir,X-mount.mkdir,x-systemd.requires=/data_local,x-systemd.before=local-fs.target,x-systemd.before=systemd-networkd 0 0
但是,此操作会失败,因为首次启动时缺少 upperdir 和 workdir 目录。如何让 fstab 或 systemd.mount 自动创建这些目录?
答案1
我最终使用了 Yocto 的 overridefs-etc.bbclass 功能,该功能自 Yocto 4.0 起可用。文档位于:https://docs.yoctoproject.org/ref-manual/classes.html#ref-classes-overlayfs-etc
bbclass 修补 /sbin/init 中的 init 进程,以便在安装覆盖之前在运行时创建文件夹。看:https://git.yoctoproject.org/poky/plain/meta/files/overlayfs-etc-preinit.sh.in
将其添加到您的图像中非常简单:
添加到您的 machine.conf:
OVERLAYFS_ETC_MOUNT_POINT = "/data_local"
OVERLAYFS_ETC_DEVICE = "/dev/mmcblk0p6"
OVERLAYFS_ETC_FSTYPE = "ext4"
OVERLAYFS_ETC_MOUNT_OPTIONS = "defaults,sync"
添加到您的图像:
IMAGE_FEATURES:append = " overlayfs-etc"
当然,您必须确保您的启动介质有一个额外的读写安装分区可用(在闪存到 SD 卡的映像中) - 在我的例子中是 mmcblk0p6。