Mount

使用 systemd 在使用者匯流排中掛載遠端文件系統

  • June 5, 2021

我想在我的/home/stew/shared. 安裝sshfs並使用ssh-copy-id到我的遠端機器後,我可以這樣做:

stew@stewbian:~$ sshfs stew@192.168.1.9:/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 %u@192.168.1.9:/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=%u@192.168.1.9:/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文件需要文件名中的使用者名才能訪問正確的首頁。

我在帶有 systemd 246.6 的 Ubuntu 21.04 上遇到了同樣的問題 - 當您嘗試解除安裝掛載單元時,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
#!/bin/sh
/bin/fusermount -u "$1"

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

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