使用 systemd 在用戶匯流排中掛載遠端檔案系統

使用 systemd 在用戶匯流排中掛載遠端檔案系統

我想將遠端電腦上的目錄掛載到我的/home/stew/shared.安裝sshfs並使用ssh-copy-id到我的遠端電腦後,我可以執行以下操作:

stew@stewbian:~$ sshfs [email protected]:/path/to/remote-dir ~/shared

然後卸載

stew@stewbian:~$ umount ~/shared

或者

stew@stewbian:~$ fusermount -u ~/shared

效果很好,但我想在stew登入時自動安裝它,並在stew登出時卸載它。一個可行的選擇是.service在使用者總線上使用 systemd :

# ~/.config/systemd/user/shared.service
[Unit]
Description=Mount ~/shared

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=sshfs %[email protected]:/path/to/remote-dir %h/shared
ExecStop=umount %h/shared

[Install]
WantedBy=default.target

systemctl --user {start,stop} shared.service效果也很棒!但我想知道.mount單位是否會更強大。


我嘗試使用像這樣的安裝單元:

# ~/.config/systemd/user/home-stew-shared.mount 
[Unit]
Description=~/shared

[Mount]
What=%[email protected]:/path/to/remote-dir
Where=%h/shared
Type=fuse.sshfs

[Install]
WantedBy=default.target

啟動這個安裝單元效果很好,但是停止它會導致以下問題:

$ systemctl --user status home-stew-shared.mount
● home-stew-shared.mount - ~/shared
     Loaded: loaded (/home/stew/.config/systemd/user/home-stew-shared.mount; static)
     Active: active (mounted) (Result: exit-code) since Mon 2021-05-24 16:49:40 CEST; 6min ago
     ...
May 24 16:49:40 stewbian systemd[1046]: Unmounting ~/shared...
May 24 16:49:40 stewbian umount[22256]: umount: /home/stew/shared: must be superuser to unmount.
May 24 16:49:40 stewbian systemd[1046]: home-stew-shared.mount: Mount process exited, code=exited, status=32/n/a
May 24 16:49:40 stewbian systemd[1046]: Failed unmounting ~/shared.

我可以$ umount ~/shared卸載目錄並使設備失敗。


問題:

  1. 我是否有理由*.mount更喜歡單位而不是*.service單位?
  2. 如果我真的應該使用*.mount,是否有技巧可以讓它在用戶總線上工作,或者我是否需要轉到系統總線並找出如何進行延遲安裝並手動設定 UID 和 GID ?

使用該服務的好處之一*.service是我可以將此服務添加到該服務中skel,因此每個用戶都將自動掛載自己的私人共享目錄,這些目錄可以在房屋中的所有電腦之間有效同步。檔案*.mount需要檔案名稱中的使用者名稱才能存取正確的主目錄。

答案1

我在 Ubuntu 21.04 和 systemd 246.6 上遇到同樣的問題 - 當你嘗試卸載掛載單元時,systemd 首先嘗試在/sbin/umount.<type>(即對於 sshfs 來說/sbin/umount.fuse.sshfs)找到 umount 幫助程序,當失敗時 - 它會調用umount2(<where>)- 然後當它由用戶的systemd運行時將會失敗。

我不確定為什麼這適用於@fra-san - 我認為他們可能有一個卸載助手。

至於那些問題:

  1. 您可以使用服務單元執行任何操作,就像您可以使用SysV 風格的初始化腳本執行任何操作一樣,但systemd 的理念是我們了解常見的系統管理任務,並提供最少的描述性語法來實現您所需要的功能,而不會使事情過於複雜(這使得維護變得更加困難)。如果您可以使用安裝單元來安裝檔案系統,那麼這比基本上編寫腳本更好。當然,基礎設施必須能夠支援您需要做的事情,雖然使用者掛載單元的當前狀態比幾年前好得多,但截至 Ubuntu 21.04 - FUSE 檔案仍然不是 100%系統。
  2. 為了讓fuse.sshfs使用者安裝單元停止(卸載),我在/sbin/umount.fuse.sshfsas中創建了一個 umount 幫助程序
#!/bin/sh
/bin/fusermount -u "$1"

然後停止掛載單元效果很好 - systemd 將調用 umount 幫助程序並正確卸載文件系統(不要umount從 umount 幫助程序調用,因為umount也會調用幫助程序,並且您將進入一個無限循環,該循環將消耗所有pid) 。這可能不是一個很好的解決方案,systemd 應該做umount當你作為用戶調用它時所做的事情(我實際上無法弄清楚它的作用),但它對我有用。

相關內容