Я хотел бы смонтировать каталог с удаленной машины в моем /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
выходе из системы. Один из рабочих вариантов — использовать systemd .service
на пользовательской шине:
# ~/.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
), а когда это не удается - он вызывает umount2(<where>)
- и это не удается при запуске systemd пользователя.
Я не уверен, почему это работает для @fra-san — думаю, у них может быть помощник по размонтированию.
Что касается этих вопросов:
- Вы можете сделать что угодно с сервисным юнитом, как вы могли бы сделать что угодно с помощью сценария инициализации в стиле SysV, но идея systemd заключается в том, что мы понимаем общие задачи управления системой и даем минимальный описательный синтаксис для достижения того, что вам нужно, без чрезмерного усложнения (что затрудняет поддержку). Если вы можете использовать юнит монтирования для монтирования файловых систем, это предпочтительнее, чем просто писать скрипт. Конечно, инфраструктура должна быть в состоянии поддерживать то, что вам нужно делать, и хотя текущий статус пользовательских юнитов монтирования намного лучше, чем несколько лет назад, начиная с Ubuntu 21.04, он все еще не на 100% готов для файловых систем FUSE.
- Чтобы
fuse.sshfs
остановить (размонтировать) пользовательские модули монтирования, я создал помощник umount/sbin/umount.fuse.sshfs
в
#!/bin/sh
/bin/fusermount -u "$1"
то остановка модуля монтирования работает хорошо - systemd вызовет помощника umount и правильно размонтирует файловую систему (не вызывайте umount
из помощника umount, потому что umount
он также вызывает помощников, и вы попадете в бесконечный цикл, который поглотит все pid). Это, вероятно, не лучшее решение, и systemd должен делать то, что umount
делает, когда вы вызываете его как пользователь (что он на самом деле не может понять, что он делает), но у меня это работает.