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)를 찾으려고 시도하고 실패하면 호출됩니다 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 도우미를 호출하고 파일 시스템을 올바르게 마운트합니다( 도우미도 호출되고 모든 pid를 소비하는 무한 루프에 빠지게 되므로 umountumount 도우미에서 호출 하지 마십시오 ). umount이것은 아마도 훌륭한 솔루션은 아닐 것입니다. systemd는 umount사용자로서 호출할 때 수행하는 작업을 수행해야 하지만(실제로 수행하는 작업을 알 수는 없습니다) 저에게는 효과적이었습니다.

관련 정보