Использование 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выходе из системы. Один из рабочих вариантов — использовать 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размонтировать каталог и вывести устройство из строя.


Вопросы:

  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), а когда это не удается - он вызывает umount2(<where>)- и это не удается при запуске systemd пользователя.

Я не уверен, почему это работает для @fra-san — думаю, у них может быть помощник по размонтированию.

Что касается этих вопросов:

  1. Вы можете сделать что угодно с сервисным юнитом, как вы могли бы сделать что угодно с помощью сценария инициализации в стиле SysV, но идея systemd заключается в том, что мы понимаем общие задачи управления системой и даем минимальный описательный синтаксис для достижения того, что вам нужно, без чрезмерного усложнения (что затрудняет поддержку). Если вы можете использовать юнит монтирования для монтирования файловых систем, это предпочтительнее, чем просто писать скрипт. Конечно, инфраструктура должна быть в состоянии поддерживать то, что вам нужно делать, и хотя текущий статус пользовательских юнитов монтирования намного лучше, чем несколько лет назад, начиная с Ubuntu 21.04, он все еще не на 100% готов для файловых систем FUSE.
  2. Чтобы fuse.sshfsостановить (размонтировать) пользовательские модули монтирования, я создал помощник umount /sbin/umount.fuse.sshfsв
#!/bin/sh
/bin/fusermount -u "$1"

то остановка модуля монтирования работает хорошо - systemd вызовет помощника umount и правильно размонтирует файловую систему (не вызывайте umountиз помощника umount, потому что umountон также вызывает помощников, и вы попадете в бесконечный цикл, который поглотит все pid). Это, вероятно, не лучшее решение, и systemd должен делать то, что umountделает, когда вы вызываете его как пользователь (что он на самом деле не может понять, что он делает), но у меня это работает.

Связанный контент