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

systemd 246.6이 있는 Ubuntu 21.04에서도 동일한 문제가 있습니다. 마운트 장치를 마운트 해제하려고 하면 systemd는 먼저 마운트 해제 도우미를 찾으려고 시도합니다 /sbin/umount.<type>(예: sshfs의 경우 /sbin/umount.fuse.sshfs). 실패하면 호출됩니다 umount2(<where>). 사용자의 systemd에 의해 실행되면 실패합니다.

이것이 @fra-san에 왜 작동하는지 잘 모르겠습니다. 마운트 해제 도우미가 있을 수 있다고 생각합니다.

그 질문에 관해서는:

  1. SysV 스타일 init 스크립트로 무엇이든 할 수 있는 것처럼 서비스 유닛으로 무엇이든 할 수 있지만 systemd의 아이디어는 일반적인 시스템 관리 작업을 이해하고 지나치게 복잡하지 않고 필요한 것을 달성하기 위해 최소한의 설명 구문을 제공한다는 것입니다( 그러면 유지 관리가 더 어려워집니다.) 마운트 장치를 사용하여 파일 시스템을 마운트할 수 있다면 기본적으로 스크립트를 작성하는 것보다 낫습니다. 물론 인프라는 필요한 작업을 지원할 수 있어야 하며 사용자 마운트 장치의 현재 상태는 Ubuntu 21.04 기준으로 몇 년 전보다 훨씬 나아졌지만 FUSE 파일의 경우 여전히 100%는 아닙니다. 시스템.
  2. fuse.sshfs사용자 마운트 장치를 중지(마운트 해제) 하기 위해 /sbin/umount.fuse.sshfs다음과 같이 마운트 해제 도우미를 만들었습니다.
#!/bin/sh
/bin/fusermount -u "$1"

그런 다음 마운트 장치를 중지하면 잘 작동합니다. systemd는 umount 도우미를 호출하고 파일 시스템을 올바르게 마운트 해제합니다( 도우미를 호출 umount하면 umount 도우미에서 호출하지 말고 umount모든 pid를 소비하는 무한 루프에 빠지게 됩니다). 이것은 훌륭한 솔루션이 아닐 가능성이 높으며 systemd는 umount사용자로서 호출할 때 수행하는 작업을 수행해야 하지만(실제로 수행하는 작업이 무엇인지 알 수는 없음) 저에게는 작동합니다.

관련 정보