fstab 中的影子绑定挂载

fstab 中的影子绑定挂载

我有一个自定义的非默认 Ubuntu 安装,其中我使用其他 Linux 发行版的启动管理器 (rEFInd)。因此,我不希望 Ubuntu 看到我的 EFI 分区,原则上它与那里的内容无关(昨晚当我做一个rm -rf /*...时,它已经救了我的屁股)。但是,由于我使用 btrfs 作为文件系统,因此我的/boot目录必须位于 UEFI 可读分区中,例如 EFI 分区。因此,我对这个难题的解决方案是通过如下命令esp:\EFI\ubuntu将EFI 分区的子目录进行影子绑定挂载:/boot

mount /dev/sdb2 /boot
mount --bind /boot/EFI/ubuntu /boot

这非常有效。 Ubuntu 可以访问 /boot 分区,它可以自由地将其 vmlinuz 和 initramfs 放入其中,并且我的引导管理器会自动检测安装。引导和更新按预期进行。到目前为止,唯一需要注意的是,我需要使用命令来挂载 /boot。因此,像任何负责任的系统管理员一样,我创建了一个 fstab 条目:

UUID=XXXX-XXXX      /boot   vfat    rw,relatime 0 0
/boot/EFI/ubuntu    /boot   none    bind        0 0

尽管与上面的命令类似,但在启动时整个 EFI 分区仍保持挂载状态。第二行,执行影子绑定挂载,似乎没有执行。有没有办法在 fstab 中完成这项工作,如果没有,在初始安装后尽快执行绑定安装的可靠方法是什么?

答案1

正如 @RamanSailopal 所建议的,答案(当然)在 dmesg 中。问题的根源在于 systemd 从 fstab 条目创建单元文件,并且无论出于何种原因,它们必须具有映射到挂载点的文件名。换句话说,不允许每个安装点进行多次安装。

我通过创建一个 systemd 服务文件来解决这个问题,该文件将自身作为 的依赖项注入local-fs.target,无论如何都像常规的 systemd 安装单元一样:

/etc/systemd/system/boot-shadow-mount.service:

# Performs the shadow bind mount to hide the ESP at /boot
# and instead expose the ubuntu subdirectory.

[Unit]
Description=/boot shadow bind mount
Requires=boot.mount
Conflicts=umount.target

[Service]
Type=oneshot
ExecStart=/bin/mount --bind /boot/EFI/ubuntu /boot
ExecStop=/bin/umount /boot
RemainAfterExit=True

[Install]
RequiredBy=local-fs.target unattended-upgrades.service

相关内容