我刚刚更新并安装了一整套 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=""
}'