我想将远程计算机上的目录挂载到我的/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
卸载目录并使设备失败。
问题:
- 我是否有理由
*.mount
更喜欢单位而不是*.service
单位? - 如果我真的应该使用
*.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 - 我认为他们可能有一个卸载助手。
至于那些问题:
- 您可以使用服务单元执行任何操作,就像您可以使用 SysV 风格的初始化脚本执行任何操作一样,但 systemd 的理念是我们了解常见的系统管理任务,并提供最少的描述性语法来实现您所需要的功能,而不会使事情过于复杂(这使得维护变得更加困难)。如果您可以使用安装单元来安装文件系统,那么这比基本上编写脚本更好。当然,基础设施必须能够支持您需要做的事情,虽然用户挂载单元的当前状态比几年前好得多,但截至 Ubuntu 21.04 - FUSE 文件仍然不是 100%系统。
- 为了让
fuse.sshfs
用户安装单元停止(卸载),我在/sbin/umount.fuse.sshfs
as中创建了一个 umount 帮助程序
#!/bin/sh
/bin/fusermount -u "$1"
然后停止挂载单元效果很好 - systemd 将调用 umount 帮助程序并正确卸载文件系统(不要umount
从 umount 帮助程序调用,因为umount
也会调用帮助程序,并且您将进入一个无限循环,该循环将消耗所有 pid)。这可能不是一个很好的解决方案,systemd 应该做umount
当你作为用户调用它时所做的事情(我实际上无法弄清楚它的作用),但它对我有用。