自动挂载图像文件作为 UnionFS 覆盖

自动挂载图像文件作为 UnionFS 覆盖

我希望在系统启动时使用 UnionFS 自动挂载图像文件,并在库存 /etc 目录文件之上覆盖设置文件(例如 /etc/network/interfaces),以允许用户自定义。

我使用的是嵌入式 Linux 发行版(内核 3.14.28,以防万一您想知道),并且可以在系统到达登录提示后手动实现所需的结果。

我现在希望在系统启动期间自动化该过程。

我的想法是 /etc/fstab 将提供实现此目的所需的所有功能。但是,我在系统启动期间自动挂载 FAT 分区以及随后挂载 UnionFS 时遇到困难。

我的 /etc/fstab 如下所示:

# start: /etc/fstab file
/dev/root   /               auto       defaults              1  1
proc        /proc           proc       defaults              0  0
devpts      /dev/pts        devpts     mode=0620,gid=5       0  0
usbdevfs    /proc/bus/usb   usbdevfs   noauto                0  0
tmpfs       /run            tmpfs      mode=0755,nodev,nosuid,strictatime 0  0
tmpfs       /var/volatile   tmpfs      defaults              0  0

# mount the user data image and then mount the unionfs user setting overlays
/dev/mmcblk2p1/userdata.img      /userdata       vfat    loop,auto,rw,exec                               0       0
/userdata/etc               /etc            unionfs    dirs=/userdata/etc=rw:/etc=ro,auto   0       0
# end: /etc/fstab file

在启动过程中我看到:

...
EXT3-fs (mmcblk2p3): mounted filesystem with ordered data mode
VFS: Mounted root (ext3 filesystem) readonly on device 179:11.
devtmpfs: mounted
Freeing unused kernel memory: 352K (80e3b000 - 80e93000)
INIT: version 2.88 booting
unionfs: error accessing lower directory '/userdata/etc' (error -2)
unionfs: read_super: error while parsing options (err = -2)
Starting udev
udevd[187]: starting version 182
EXT3-fs (mmcblk2p5): using internal journal
EXT3-fs (mmcblk2p5): mounted filesystem with ordered data mode
FAT-fs (mmcblk1p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
EXT3-fs (mmcblk1p2): warning: mounting fs with errors, running e2fsck is recommended
EXT3-fs (mmcblk1p2): using internal journal
EXT3-fs (mmcblk1p2): mounted filesystem with ordered data mode
FAT-fs (mmcblk2p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
EXT3-fs (mmcblk2p2): using internal journal
EXT3-fs (mmcblk2p2): mounted filesystem with ordered data mode
EXT3-fs (mmcblk2p3): using internal journal
...

看来系统正在尝试在挂载点 (/userdata) 准备就绪之前执行 UnionFS 挂载。我的理解是 /etc/fstab 中列出的分区是按顺序挂载的。如果不是这种情况,请告诉我;)

所以,我的问题是:如何更改 /etc/fstab (以及任何其他文件)以获得我想要的自动挂载效果?

提前致谢

答案1

代码示例位于本文末尾。现在,systemd 会读取 fstab,然后尝试并行挂载 fs。 systemd 默认挂载脚本是在启动时创建的,您可以在以下位置找到它们

'run/systemd/generator'

您可以尝试在 fstab 中使用 noauto 参数,该参数仅在访问 fs 时才挂载。这可能有副作用,因此在某些情况下您必须尝试访问挂载点两次才能激活它。

也许可以通过给访问挂载点的程序一段延迟来解决这种情况。真的——我不知道这是不是真的。然而,另一个解决方案是制作一个 systemd 启动脚本,在其中覆盖 fstab 的读取。这可以通过两种方式完成,要么告诉 systemd 读取指定挂载选项的 rc.local 文件,要么(我认为)更正确的方法 - 仅为 systemd 编写脚本。

我给出的示例都来自我自己的安装脚本,这是我从其他示例中找到的。

稍后我将编辑这篇文章,添加我喜欢的帮助我创建这些脚本的资源的链接。这两个示例都需要两个文件。免责声明 我并不声称安装点符合标准。例如,我在根目录中安装一个文件夹。这只是我自己的尝试,而我对Linux还没有经验,并在我自己的测试平台系统上以我自己的方式做我自己的事情。这是一项正在进行的工作,目前完成得相当草率。这些例子仅供参考,并尽量比我更严格的标准。另外,我想人们可以通过多种方式改进这些文件。非常感谢您的意见和建议。

1.使用rc-local

#This file should be named /etc/systemd/system/rc-local.service
[Unit]
Description=/etc/rc.local Compatibility
ConditionFileIsExecutable=/usr/local/sbin/rc.local

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/rc.local
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target

#Local multi-user startup script.
#this file should be named as  /usr/local/sbin/rc.local and have the executable attribute set.
#!/bin/sh
mount -L BIGDATA /BIGDATA
#2do, If LABEL not found, Add failback  to  search for UUID 
LBL=$(blkid -s LABEL  $(mount | grep " / ") | cut -d "=" -f 2-2 | tr -d '"')

mount -t aufs -o dirs=/BIGDATA/mountslinks/dist-global_rw/newfiles_rw/home=rw:/BIGDATA/mountslinks/dist-global_rw/global_rw/home=rw:/BIGDATA/mountslinks/dist-local_rw/"$LBL"/home=rw none /home
mount -t aufs -o dirs=/BIGDATA/mountslinks/dist-global_rw/newfiles_rw/root=rw:/BIGDATA/mountslinks/dist-global_rw/global_rw/root=rw:/BIGDATA/mountslinks/dist-local_rw/"$LBL"/root=rw none /root

2.只使用systemd(我在几次重新启动后切换到这个方法。不是因为第一个方法不起作用 - 事实上,它工作得很好(在我的系统上) - 更多的是因为我首先也想学习这种方法,而且我认为这个更加面向未来。

#this one is an edited version of the one Automatically generated by systemd-fstab-generator

[Unit]
Before=local-fs.target
[Mount]
What=/dev/disk/by-label/BIGDATA
Where=/BIGDATA
Type=ext4
Options=defaults,nofail

[Install]
WantedBy=multi-user.target

[Unit]
Before=local-fs.target
Requires = BIGDATA.mount
After = BIGDATA.mount

[Mount]
What=noauto,x-systemd.requires=/BIGDATA,x-systemd.automount
Where=/home/peter
Type=aufs
Options=br=/BIGDATA/mountslinks/lubuntu/new_rw/home/peter=rw:/BIGDATA/mountslinks/lubuntu/local_rw/home/peter=rw:/BIGDATA/mountslinks/lubuntu/shared_rw/home/peter=rw


[Install]
WantedBy = multi-user.target

另外,我想 fstab 中的一个可以在 fstab 中添加参数,告诉 systemd 挂载顺序。

相关内容