奇妙に聞こえますが、次のように実行されるシェルスクリプトがあります。udevルール、接続されているUSBデバイスをシステムファイルツリーにマウントします。 USBデバイスがシステムに接続されると、スクリプトが実行されるため、ルールが良いようです。 syslogを介してスクリプトの進行状況を監視し、スムーズに進行します。マウントコマンド0を返すと、次のように表示されます。
root[1023]: mount: /dev/sda1 mounted on /media/partitionlabel.
ただし、最終的にデバイスはインストールされず、一覧表示されません。/etc/mtab - /proc/mounts - findmnt - マウント。走れば削除デバイスには、デバイスがインストールされていないというメッセージも表示されます。
ただし、端末で root としてスクリプトを手動で実行すると、完全に実行され、デバイスがマウントされますが、実行されるとそうではありません。ウデブ。
これがタイミングの問題ではないことを確認するために、スクリプトの先頭に8秒のスリープ時間を追加し、ルールファイル名から数字を削除してこれを保証しました。Udevdルールキューの一番下に新しいルールを配置し、スクリプトは成功せずに他のシステムルールの後に実行されます。
システムログ:
(機器接続後)
kernel: usb 1-1.2: new high-speed USB device number 12 using dwc_otg
kernel: usb 1-1.2: New USB device found, idVendor=058f, idProduct=6387
kernel: usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
kernel: usb 1-1.2: Product: Mass Storage
kernel: usb 1-1.2: Manufacturer: Generic
kernel: usb 1-1.2: SerialNumber: 24DCF568
kernel: usb-storage 1-1.2:1.0: USB Mass Storage device detected
kernel: scsi host6: usb-storage 1-1.2:1.0
kernel: scsi 6:0:0:0: Direct-Access Generic Flash Disk 8.07 PQ: 0 ANSI: 4
kernel: sd 6:0:0:0: [sda] 1968128 512-byte logical blocks: (1.00 GB/961 MiB)
kernel: sd 6:0:0:0: [sda] Write Protect is off
kernel: sd 6:0:0:0: [sda] Mode Sense: 23 00 00 00
kernel: sd 6:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
kernel: sda: sda1
kernel: sda: p1 size 1968126 extends beyond EOD, enabling native capacity
kernel: sda: sda1
kernel: sda: p1 size 1968126 extends beyond EOD, truncated
kernel: sd 6:0:0:0: [sda] Attached SCSI removable disk
root[1004]: /usr/local/sbin/udev-auto-mount.sh - status: started to automount sda1
root[1019]: /usr/local/sbin/udev-auto-mount.sh - status: Device Label is partitionlabel and Filesystem is vfat.
root[1021]: /usr/local/sbin/udev-auto-mount.sh - status: mounting the device sda1 by filesystem vfat to /media/partitionlabel.
root[1023]: mount: /dev/sda1 mounted on /media/partitionlabel.
root[1024]: /usr/local/sbin/udev-auto-mount.sh status: mount command proceed for vfat, retval is 0
root[1025]: /usr/local/sbin/udev-auto-mount.sh - status: succeed!
構成:
/etc/udev/rules.d/local-rules:
次に定義される規則ウデブ例:
# /etc/udev/rules.d/local-rules
ENV{ID_BUS}=="usb", ACTION=="add", ENV{DEVTYPE}=="partition", \
RUN+="/usr/local/sbin/udev-automounter.sh %k $ENV{ID_FS_LABEL_ENC}"
udev-automount.sh
このスクリプトは、udevルールで定義されている他のスクリプトによって開始されます。とても直説的だからマウントポイントファイルシステムの種類といくつかの一般的なオプションを使用してUSBデバイスをマウントポイントにマウントします。マウントコマンドに "-v"オプションを追加してより冗長にし、すべての出力をsyslogにリダイレクトして実行方法を確認できましたが、それほど多くはありません。
#!/bin/sh
## /usr/local/sbin/udec-auto-mount.sh
##
logger -s "$0 - status: started to automount ${1}"
DEVICE=$1
sleep 8
#...
#...
# Checking inputs, getting filesystem type (ID_FS_TYPE), partition label
# (ID_FS_LABEL) and ...
mkdir "/media/${ID_FS_LABEL}"
logger -s "$0 - status: mounting the device ${DEVICE} by filesystem ${ID_FS_TYPE} to /media/${ID_FS_LABEL}."
case $ID_FS_TYPE in
vfat) mount -v -t vfat -o sync,noatime,nosuid,nodev /dev/${DEVICE} "/media/${ID_FS_LABEL}" 2>&1 | logger
let retVal=$?
logger -s "$0 status: mount command proceed for vfat, retval is ${retVal}"
;;
*) mount -v -t auto -o sync,noatime /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
esac
if [ ${retVal} -eq 0 ]; then
logger -s "$0 - status: succeed!"
exit 0
else
logger -s "$0 Error: unable to mount the device ${DEVICE}, retval is ${retVal}"
rmdir "/media/${ID_FS_LABEL}"
fi
exit 0
おそらく役に立ちます:
時々、スクリプトがUSBデバイスをマウントできなかった後にデバイスを取り外すと、システムログに次のエラーが表示されます。
kernel: usb 1-1.2: USB disconnect, device number 11
systemd-udevd[143]: error: /dev/sda: No such file or directory
systemd-udevd[977]: inotify_add_watch(7, /dev/sda, 10) failed: No such file or directory
編集する:
これは「インストール済み」バージョンです。
$ mount -V:
mount from util-linux 2.27.1 (libmount 2.27.0: assert, debug)
答え1
systemdがインストールされているシステムでパーティションを再フォーマットして再インストールしようとすると、この問題が発生する可能性があります。
ディスクを暗号化された状態から暗号化されていない状態に移動し、mnt-disk
systemdで生成された.mount(mnt-diskは/etc/fstabへのマウントパスです)が存在しなくなった古いパスを参照することでmount
混乱を引き起こしました。
ただ行ってsystemctl daemon-reload
インストールしてください。
答え2
注文
mount ... | logger
rc=$?
期待どおりに動作しません。パイプの戻り値は、そのパイプの最後の要素の戻り値です。
$> false | true; echo $?
0
Bashを使用している場合は、以下を試してくださいPIPESTATUS
。
$> false | true; echo $? ${PIPESTATUS[0]}
0 1
$> true | false; echo $? {PIPESTATUS[0]}
1 0
PIPESTATUS
配列変数です。詳細はbashのマニュアルページにあります。他の殻にも同様のものがあるかもしれません。PIPESTATUS
答え3
ついに答えを見つけたここ。
事実問題はsystemd-udevd
元の成功にあるudev
。systemd-udevd
独自のルートファイルシステムイメージを作成し、「udev」ルールがデバイスをマウントすると、次からマウントしてアクセスできます。
/proc/{PID of systemd-udevd service}/root/{path to mount point}
ただし、デフォルトのルートファイルシステムでは表示されません/
。
archlinux
ウィキ(ここ)提案:
udev
警告:リムーバブルドライブをマウントするには、ルールからマウントを呼び出さないでください。 FUSEファイルシステムの場合、転送エンドポイントが接続されていませんエラーが発生します。代わりにudisks
、それを使用して自動マウントを適切に処理したり、udevルール内でマウント操作を実行してコピーしたり/usr/lib/systemd/system/systemd-udevd.service
でき/etc/systemd/system/systemd-udevd.service
ます。[3]これは長期実行プロセスを呼び出すためのものではないことに注意してください。MountFlags=slave
MountFlags=shared
udev
解決策:
/usr/lib/systemd/system/systemd-udevd.service
そのディレクトリにコピーし/etc/systemd/sytem/
ます。MountFlags=slave
MountFlags=shared