当两个设备共享相同的安装点时,systemd 会出现错误

当两个设备共享相同的安装点时,systemd 会出现错误

我刚刚更新并安装了一整套 debian 软件包,现在由于我特定的 fstab 文件配置而出现错误。我有 2 个驱动器,我从不同时安装它们,并且它们都有相同的安装点(/etc/fstab片段):

UUID=xxxx-xxxx /media/strontium vfat user,rw,exec,nofail 0 2                    
UUID=yyyy-yyyy /media/strontium vfat user,rw,exec,nofail 0 2

然而,安装后,systemd 抱怨这一点:

[518052.191024] systemd-fstab-generator[28811]: Failed to create mount unit file /run/systemd/generator/media-strontium.mount, as it already exists. Duplicate entry in /etc/fstab?

实际上我根本不想使用 systemd 来安装驱动器。我以前使用过sudo mount -a,这只是遍历我的/etc/fstab文件并安装插入的任何内容。

是否可以关闭 systemd 安装功能,以便我可以像以前一样手动安装自己的驱动器?

答案1

无论如何,我不知道这个 systemd 限制,因为挂载点目录名称被转换为 systemd 文件名。最简单的答案可能是从 fstab 中删除条目并编写一个小脚本来按需安装:

#!/bin/bash
( mount -U xxxx-xxxx /media/strontium -t vfat -o rw,exec ||
  mount -U yyyy-yyyy /media/strontium -t vfat -o rw,exec
) && echo ok

修改后,不要忘记/etc/fstab执行 asudo systemctl daemon-reload以确保 systemd 注意到您的更改。


如果您想保留条目,/etc/fstab可以使用使第二个安装点成为第一个安装点的符号链接,例如ln -s /media/strontium /media/strontium2。挂载完成后,将跟踪链接,因此它会像往常一样出现在目录中。在这种情况下,您必须noauto向这两行添加选项,否则 systemd 会感到困惑并立即卸载它认为是第一个条目的内容。

您可以使用真实目录,然后执行手动操作,而不是符号链接绑定挂载将该目录安装在所需位置:

mount --bind /media/strontium2 /media/strontium

您必须记住卸载此绑定安装以及第一个安装。


过去,您可以添加 udev 规则,以便在看到 UUID 出现时显式调用 mount,例如/etc/udev/rules.d/92-my.rules

ACTION=="add", ENV{ID_FS_UUID}=="xxxx-xxxx", RUN+="/usr/bin/mount /dev/%k /media/strontium"

但这不适用于最近的 systemd,因为它udevd在单独的挂载命名空间中运行,因此尽管它执行挂载,但您看不到它。我还不知道这个命名空间的原因,但原则上你可以通过创建一个 /etc/systemd/system/systemd-udevd.service包含两行的文件来覆盖这个功能

.include /usr/lib/systemd/system/systemd-udevd.service
MountFlags=shared 

如果您想要仍然自动的东西,那么另一种方法是监视有关块设备的事件udevd并执行显式挂载。例如,永久运行:

#!/bin/bash
# udevadm monitor outputs a stanza ending with a blank line
#  UDEV  [5291328.3] add  /devices/pci0000:00/.../usb3/..../block/sdd (block)
#  ACTION=add
#  DEVNAME=/dev/sdd
stdbuf -o L udevadm monitor -u -p -s 'block/disk' |
awk -F= '
$0~/^ACTION=/{ action = $2 }
$0~/^DEVNAME=/{ name = $2 }
$0~/^ID_FS_UUID=/{ uuid = $2 }
$0~/^$/{ if(action=="add" && (uuid=="xxxx-xxxx"||uuid=="yyyy-yyyy")
          system("sudo mount mount " name " /media/strontium -t vfat -o rw,exec")
         uuid=""
       }'

相关内容