systemdをバージョン239に更新した後、メディアデバイスの自動マウントのためのUdevルールが機能しなくなりました。

systemdをバージョン239に更新した後、メディアデバイスの自動マウントのためのUdevルールが機能しなくなりました。

しばらくメディアデバイスを自動的にマウントするために、udevルールが適用されました。

/etc/udev/rules.d/61-mount_media_by_label.rules

#
# To propagate udev's mountpoint to the user space, MountFlags must have a value "shared" in the /usr/lib/systemd/system/systemd-udevd.service.
#

# Ignore devices that aren't storage block-devices and block-devices that are already listed in /etc/fstab.
KERNEL!="sd[a-z][1-9]*", GOTO="mount_media_by_label_end"
PROGRAM="/bin/grep -e '^UUID=%E{ID_FS_UUID}' /etc/fstab", RESULT!="", GOTO="mount_media_by_label_end"

# Decide the name for device's mountpoint directory, based on device's label.
ENV{ID_FS_LABEL}!="", ENV{mountpoint}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{mountpoint}="usb-%k"

# If device is being plugged in, set options for mount command.
ACTION=="add", ENV{mount_options}="relatime"
ACTION=="add", ENV{ID_FS_TYPE}=="vfat|ntfs", ENV{mount_options}="%E{mount_options},utf8,gid=100,umask=002"

# If device is being plugged in, create mountpoint directory in /media and mount device node to it.
ACTION=="add", RUN+="/bin/mkdir -p /media/%E{mountpoint}", RUN+="/bin/mount -o %E{mount_options} /dev/%k /media/%E{mountpoint}"

# If device is being plugged out, unmount it and delete its mountpoint directory.
ACTION=="remove", ENV{mountpoint}!="", RUN+="/bin/umount -l /media/%E{mountpoint}", RUN+="/bin/rmdir /media/%E{mountpoint}"

# Label for early exit.
LABEL="mount_media_by_label_end"

MountFlagsこのルールを機能させるには、オプションの値をshared次のように変更します。
/usr/lib/systemd/system/systemd-udevd.service
systemdバージョンに更新しましたが、239ファイルが異なって見えました。
潜在的に問題になる可能性がある2つの変更点が見つかりました。

  1. MountFlagsこのオプションはデフォルト設定で指定されていません。
  2. PrivateMountsに設定された新しいオプションがありますyes

systemdから文書これで設定するだけで、PrivateMounts=noマウントポイントがユーザースペースに伝播されます。

しかし、これは事実ではありません。
頑張りました

  1. 変化PrivateMounts=no
  2. 変更PrivateMounts=noと追加MountFlags=shared

しかし、どちらも機能しません。

udevルール以上でメディアデバイスをマウントする正しい方法は何ですかsystemd v239

答え1

このアプローチは最適ではないかもしれません。たとえば、書き込み可能なntfs-3gNTFSマウントの使用をサポートしている場合、ntfs-3gudevを再起動するたびにプロセスが終了します。

Modern Security Theoryでは、デスクトップのインストール時にFUSEを使用することをお勧めします。みんなリムーバブルファイルシステム。 https://lwn.net/Articles/755593/

別のシステムデバイスを起動(および停止)する方法を理解し、好みの方法で作成できる場合は、より良いでしょう。したがって、Archユーザーは特別なドキュメントでこのモードを使用することを常に推奨します:-)。別個の systemd デバイスを使用すると、udev サービスに適用される制限を回避できます。

たとえば、systemdを起動する範囲単位でコマンドを使用しますsystemd-run --no-block --scope -- my mount command here

残念ながら、付属のデバイスにntfs-3g認識可能な名前を付けたい場合、100%正しいアプローチが何であるかすぐには明確ではありません。その名前の古いデバイスはまだ「アクティブ」として追跡されますが、プロセスが終了したばかりの場合は、サービスの起動を要求しても何もしません。問題を無視したり、名前にランダムなサフィックスを生成したり、この一連のイベントを除外したりできますが、より良い方法があるかもしれません。

FUSEでこれをテストしていませんが、これを行う方法はコマンドを使用することだと思いますsystemd-mount

スーパーユーザーの回答systemd-mountudevルールがまだ実行されている間はデバイスで使用すると正しく機能しない可能性があるため、お勧めします。これには多少バロック様式のソリューションが必要です。 (RUN+="/path/to/my/script %k"走るsystemd-run --no-block --scope --unit=mount-$1 sh -c "systemctl start /dev/$1; systemd-mount ...")。

これを行う方法は次のとおりです。

ENV{SYSTEMD_WANTS}=my-mounter@%k.service

# /etc/systemd/system/[email protected]
[Service]
Type=oneshot
ExecStart=systemd-mount %I

#!/bin/sh
# /usr/local/lib/my-mounter
# You can make this as complicated as you want.
# (Although curiously systemd-mount also reads SYSTEMD_MOUNT_WHERE and
# SYSTEMD_MOUNT_OPTIONS properties if you set them on the udev device.)
# You could also read udev properties yourself using 
# eval "$(udevadm info --query=property --export)"

DEVNAME="$1"
systemd-mount "/dev/$DEVNAME"

デフォルトを使用systemd-mountすると、削除時にファイルシステムが自動的にマウント解除されますが、自動的に作成されたマウントポイントディレクトリは後で消去されません(!)。


持つv239の2つの個別の変更-二つ以前の動作を取得するには、別のディレクティブに戻す必要があります。

  1. PrivateMounts=yes。に交換してくださいPrivateMounts=no
  2. SystemCallFilter=@system-service @module @raw-io

    このディレクティブの使用は v239 の新機能です。したがって、以前の動作を復元する最も簡単な方法は、完全に削除することです。

関連情報