Systemd

在 udev 腳本中掛載 fuse.mergerfs

  • February 2, 2019

我使用 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 服務寫入mountFUSE 文件系統時,不要使用 Type=simpleType=oneshot. 改為使用Type=forking

引用自:https://unix.stackexchange.com/questions/497266