使用 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当你作为用户调用它时所做的事情(我实际上无法弄清楚它的作用),但它对我有用。

相关内容