當兩個裝置共用相同的安裝點時,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=""
       }'

相關內容