ディスクマウントの Udev ルールが機能しません。

ディスクマウントの Udev ルールが機能しません。

/etc/udev/rules.d/81-external-disk.rulesには次のものがあります。

ENV{ID_FS_UUID}=="6826692e-79f4-4423-8467-cef4d5e840c5", RUN{program}+="/bin/mount -o nofail,x-systemd.device-timeout=1 -t ext4 -U 6826692e-79f4-4423-8467-cef4d5e840c5 /backup/external"

実行後:

udevadm control --reload ; udevadm trigger /dev/sdb1

何もしません。ただし、/bin/touch /tmp/xyz などのマウントコマンドを変更すると機能します。

バージョン:

[root@helsinki rules.d]# rpm -qa | grep udev
libgudev1-219-19.el7_2.12.x86_64
python-pyudev-0.15-7.el7_2.1.noarch
[root@helsinki rules.d]# rpm -qa | grep systemd
systemd-libs-219-19.el7_2.12.x86_64
systemd-219-19.el7_2.12.x86_64
systemd-sysv-219-19.el7_2.12.x86_64
[root@helsinki rules.d]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 

答え1

Ubuntu 18.04でも同じ問題が発生し、根本原因は同じです。この問題を解決するために上書きファイルを作成しますsystemd-udevd

sudo systemctl edit systemd-udevd

そして、以下を挿入してください:

[Service]
MountFlags=shared

(Ubuntu 20.04ではにMountFlags=shared置き換えてくださいPrivateMounts=no。)

ファイルを保存し、次を実行します。

sudo systemctl daemon-reload
sudo service systemd-udevd --full-restart

答え2

これはシステム化された機能です。元のudevコマンドは次のように置き換えられましたsystemd-udevd(該当するマニュアルページを参照)。 1つの違いは、独自のファイルシステム名前空間を作成するため、マウントは完了しますが、サブジェクト名前空間には表示されないことです。 (systemctl status systemd-udevdサービスのプライマリPIDを取得し、ファイルシステムの内容を見ると/proc/<pid>/mountinfo確認できます。)

プライベートファイルシステムの名前空間の代わりに共有ファイルシステムの名前空間を使用するように戻すには、次の内容を含む/etc/systemd/system/systemd-udevd.serviceファイルを作成します。

.include /usr/lib/systemd/system/systemd-udevd.service
[Service]
MountFlags=shared 

/etc/systemd/system/systemd-udevd.service.d/myoverride.confまたは、最後の2行だけを含む新しいディレクトリとファイル、つまり

[Service]
MountFlags=shared

そして、systemd-udevdサービスを再起動します。私はまだこれの結果を見つけていません。

答え3

現在、MountFlags設定に基づくいくつかのソリューションがありますが(以前の回答で述べたように)、開発者が過去にデフォルト設定を変更しているように見えることを考えると、絶対的な権限を取得するために将来のデフォルト設定を完全に削除することもできますあることが懸念されます。より多くの統制力を持つよう努めています。

したがって、代替ソリューションは次のようになります。 /usr/local/bin で、次を uysdm ファイルに入れます。

#!/bin/bash
umask 077
rp=`mktemp -d /tmp/uysd_XXXXX`
if [ $? != 0 ]; then
        exit 1
fi
mkfifo $rp/fifo

echo $rp/fifo "$*" >/var/uysd/fifo &
X=$!
res=`cat $rp/fifo`
stat=$?
rm -rf "$rp"
wait $X
if [ $? != 0 ]; then
        exit $?
fi
exit "$res"

次に、uysdmdファイルに入れます。

#!/bin/bash
# Up yours systemd mount daemon

if [ ! -e /var/uysd/fifo ]; then
        umask 0077
        mkdir -p /var/uysd
        mkfifo /var/uysd/fifo
fi

(
        while true; do (
                IFS=" "
                read rp mt </var/uysd/fifo
                if [ "$mt" = "" ]; then
                        exit 1
                fi
                echo "$mt" | xargs mount >&2
                echo $? >"$rp"
        ) done
) &

そして実行可能にしてください。

/lib/systemd/system/uysdmd.service ファイルを挿入します。

[Unit]
Description=Up Yours Systemd udev mount daemon

[Service]
ExecStart=/usr/local/bin/uysdmd
Type=forking

[Install]
WantedBy=systemd-udevd.service

次に sudo systemctl を有効にする uysdmd.service を実行し、最後に sudo systemctl restart systemd-udevd を実行します。

udevフックからマウントするのと同じように、uysdmプログラムを使用できるようになりました。

これは、uysdmコマンドで受け取ったマウント要求の実行を受け取るデーモンを生成します。

これは、udevイベントが同時に処理されるのではなく、順次処理されることに依存します。私の考えにはそうです。

関連情報