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。可能なオプションの1つは、.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を手動で設定する方法を知る必要がありますか?

使用の利点の1つ*.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ユーザーとして呼び出すときに何をするべきかをしなければなりませんが(実際に何をしているのかわかりません)、私にとっては効果的でした。

関連情報