在 udev 腳本中掛載 fuse.mergerfs
我使用 udev 規則來辨識何時插入了特定的 USB 記憶棒。插入後,會啟動一個 bash 腳本,該腳本會掛載一些設備。在我按照此處所述對 systemd-udev 服務進行了一些更改後,效果非常好。
但是,其中一個安裝失敗。它是一個熔斷器合併支架。命令本身似乎成功了,但是在
ls
掛載文件夾上執行時,我得到一個奇怪的輸出,我無法訪問該文件夾:d????????? ? ? ? ? ? mountpoint
但是,如果我從終端手動執行 mount 命令,一切都很好。
無論是在啟動期間插入棒還是在系統已經啟動後插入它也無關緊要。
mount
當被 udev 腳本呼叫時,掛載 fuse-mergerfs 設備不起作用。你有什麼想法?
$$ Using RUN in udev rules $$僅適用於短期腳本,因為如果它們在超時後仍然執行,它們將被殺死。
即實現文件系統的 FUSE 後台程序被殺死。
想到的另一種選擇:如果你有
systemd-mount
命令,你可以嘗試使用它來代替你的mount
命令。它將創建一個瞬態.mount
單元(而不是一個.service
單元),並mount
在該單元內執行程序。我引用的來源試圖為長時間執行的程序提供更通用的解決方案:
https://yakking.branchable.com/posts/systemd-2-udevd/
如果你需要一個執行時間更長的服務,那麼你應該將它與一個 systemd 單元集成,通過定義如下的單元:
cat >/etc/systemd/system/my-service@.service <<'EOF' [Unit] Description=My Service [Service] Type=simple ExecStart=/path/to/your/script %I EOF
並添加
ENV{SYSTEMD_WANTS}="my-service@%k.service"
到 udev 規則。這將執行 /path/to/your/script 並將路徑傳遞給剛剛出現的設備。
不幸的是,上述說明不適用於您的情況。
您的問題不在於您的腳本本身在返回之前花費了太長時間。問題是您的腳本在啟動“後台程序”後返回;實現 FUSE 文件系統的程序。當腳本完成時,
systemd
認為它需要清理並殺死腳本啟動的所有剩餘程序。這種情況與傳統的 sysvinit 腳本非常相似。所以我們可以使用與他們相同的解決方案:
將 systemd 服務寫入
mount
FUSE 文件系統時,不要使用Type=simple
或Type=oneshot
. 改為使用Type=forking
。