
我剛剛更新並安裝了一整套 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=""
}'