web-dev-qa-db-ja.com

Linux-mountコマンドがゼロ/ 0を返すが機能しない

奇妙に聞こえますが、接続されたUSBデバイスをシステムファイルツリーにマウントするためにdev rulesによってトリガーされるシェルスクリプトがあります。スクリプトは、USBデバイスがシステムに接続されたときに実行されるため、ルールは問題ないようです。私は、syslogによってスクリプトの進行状況を監視し、それもうまくいきますmountコマンドでさえゼロを返します、そしてそれは言う:

 root[1023]: mount: /dev/sda1 mounted on /media/partitionlabel.

しかし、最後にはデバイスはマウントされず、/ etc/mtab-/ proc/mounts-findmnt-mountにリストされません。また、デバイスでmountを実行すると、デバイスがマウントされていないことも表示されます。

ただし、ターミナルからrootとしてスクリプトを手動で実行すると、スクリプトは完全に機能し、デバイスはマウントされますが、devで実行した場合はマウントされません。

スクリプトの開始に8秒のスリープ時間を追加して、タイミングの問題ではないことを確認し、ルールファイル名から数値を削除してdevdが新しいルールを下部に配置するようにしましたルールのキュー、およびスクリプトは他のシステムルールの後に実行されますが、成功しません。

Syslog:

(デバイスが接続された直後)

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:

devで定義されているルールは次のとおりです。

# /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-auto-mount.sh

スクリプトは、udevルールで定義された別のスクリプトによって開始されます。それは非常に簡単で、mount pointディレクトリを作成し、そのファイルシステムタイプといくつかの通常のオプションを使用して、USBデバイスをマウントポイントにマウントします。 mountコマンドに「-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デバイスのマウントに失敗した後、デバイスを取り外すと、syslogに次のようなエラーが表示されることがあります。

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)
7
2i3r

最後に答え here が見つかりました。

実際の問題は、元のudevを引き継いだsystemd-udevdが原因でした。 systemd-udevdは、ルートファイルシステムの独自のミラーを作成します。「udev」ルールがデバイスをマウントすると、マウントされ、次の場所からアクセスできます。

/proc/{PID of systemd-udevd service}/root/{path to mount point}

しかし、メインのルートファイルシステム/からは見えません。

archlinuxのwiki( ここ )は次のことを提案しています:

警告:リムーバブルドライブをマウントするには、udevルールからmountを呼び出さないでください。 Fuseファイルシステムの場合、Transport endpoint not connectedエラーが発生します。代わりに、自動マウントを正しく処理するudisksを使用するか、udevルール内でマウントを機能させるには、/usr/lib/systemd/system/systemd-udevd.service/etc/systemd/system/systemd-udevd.serviceにコピーし、MountFlags=slaveMountFlags=sharedに置き換えます。 [3]ただし、udevは長時間実行されるプロセスを呼び出すためのものではないことに注意してください。

ソリューション:

/usr/lib/systemd/system/systemd-udevd.service/etc/systemd/sytem/ディレクトリにコピーし、MountFlags=slaveMountFlags=sharedに置き換えました。その後、システムを再起動し、すべてが正常に動作するようになりました。

0
2i3r

シーケンス

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のmanページをご覧ください。他のシェルはPIPESTATUSのようなものを持つかもしれません

1
Thomas Erker

Systemdを使用するシステムでは、パーティションを再フォーマットしてマウントし直そうとすると、この問題が発生する可能性があります。

ディスクを暗号化から非暗号化に移動し、systemdが生成したmnt-disk。mount to(ここで、mnt-diskは/ etc/fstabからのマウントパス)で、存在しなくなった古いパスを参照し、mountを混乱させます。

ただやっているsystemd daemon-reloadしてからマウントを行うと、動作します。

0
Smar