質問
私のUSBドライブ(/ dev / sdd)で次のコマンドを使用した後:
# physically plugging usb-drive in at /dev/sdd
> umount /dev/sdd1
> eject /dev/sdd
最後のジョブを元に戻すことはできません。プログラムでドライブを再マウントするにはどうすればよいですか?
デバイスに物理的にアクセスできず、再起動する方法もありません。
何を試してみましたか?
ご覧のとおり、一般的な作業は機能しません。
> mount /dev/sdd1
mount: /dev/sdd1: can't find in /etc/fstab.
/dev/sdd1
もう存在しないことを確認できます。
> ls /dev/sdd*
/dev/sdd
それでは、同じユーティリティをもう一度使用してポップアップをキャンセルしてみましょう。
> eject --trayclose /dev/sdd
> ls /dev/sdd*
/dev/sdd
何も起こらないようですので、USBドライブをドライバにバインドしてみましょう。
> udevadm info /dev/sdd | grep DEVPATH
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/host6/target6:0:0/6:0:0:0/block/sdd
> echo -n "1-1:1.0" > /sys/bus/usb/drivers/usb-storage/unbind
> ls -d /sys/bus/usb/drivers/usb-storage/1-1\:1.0
ls: cannot access '/sys/bus/usb/drivers/usb-storage/1-1:1.0': No such file or directory
> echo -n "1-1:1.0" > /sys/bus/usb/drivers/usb-storage/bind
> ls -d /sys/bus/usb/drivers/usb-storage/1-1\:1.0
1-1:1.0
いいですね。バインド解除とバインディングが成功しました。これは問題ではなく、解決策でもありません。また、デバイスの電源がまだ入っているようです。何かを誘発してみましょう。
> udevadm trigger --name-match=/dev/sdd
これも問題が解決しないようです。さて、パーティションテーブルは/dev/sdd
存在しますが/dev/sdd1
存在しないので、もう一度読んでみましょう。私はこれを達成するために3つの異なる方法を見つけました。
> partprobe /dev/sdd
Error: Error opening /dev/sdd: No medium found
> hdparm -z /dev/sdd
/dev/sdd:
re-reading partition table
> partx -u /dev/sdd
partx: cannot open /dev/sdd: No medium found
> ls /dev/sdd*
/dev/sdd
まだ/dev/sdd1
。もう一度検索してみてください。
> echo 1 > /sys/block/sdd/device/rescan
> ls /dev/sdd*
/dev/sdd
fdisk
まだ何もありません。この文が言う内容を確認してみましょう。
> fdisk -l | grep sdd
まあ。その後、USBドライブをリセットしようとしました。
> echo 0 > /sys/bus/usb/devices/1-1\:1.0/authorized
> echo 1 > /sys/bus/usb/devices/1-1\:1.0/authorized
> ls /dev/sdd*
ls: cannot access '/dev/sdd*': No such file or directory
状況をさらに悪化させることは試行錯誤が失敗することです。あきらめます。私がここで何を見逃しているのでしょうか?
*顔の手のひら*eject
なぜですか? !
実際、私はLinuxがI / Oエラーの後にUSBドライブをマウントしたくない別の問題を解決するためにこのソリューションが必要でした。 USBドライブを物理的に再挿入すると問題が解決するため、プログラムでこれを行う方法を知っておく必要があります。これで元の問題が解決しなくてもキャンセルする方法を知りたいですeject
。
編集:詳細
の追加ソースです。kernel.org USBホットプラグ情報、何が起こるべきか教えてください:
- デバイスを処理できるドライバを探します。これにはカーネルモジュールのロードを含めることができます。最新のドライバは module-init-tools を使用して、対応するデバイス(およびクラス)サポートをユーザーユーティリティに公開できます。
- ドライバをデバイスにバインドします。バスフレームワークは、これを実行するためにデバイスドライバのプローブ()ルーチンを使用します。
- 別のサブシステムに新しいデバイスを設定するように指示します。プリントキューの有効化、ネットワーク起動、ディスクパーティションのマウントなどが必要な場合があります。場合によっては、これはドライバー固有の作業になります。
まだ最後のステップがもっと必要なようです。 USBドライブに電力が供給され、LinuxがUSBドライブと通信できることを示す「取り出し」後、USBドライブの状態に関する追加情報がサポートされています。
> cat /sys/block/sdd/device/state
running
> cat /sys/block/sdd/device/power/runtime_status
active
> cat /sys/block/sdd/device/power/runtime_suspended_time
0
> cat /sys/block/sdd/device/power/control
on
答え1
デバイスがCDROMドライブでない場合は、eject
通常のSCSI「START STOP」コマンドに戻り、「eject」オプションを設定してください。
逆の「START STOP」は、「start」オプションを使用して送信できますsg_start -s
。 sg_start は、ほとんどのディストリビューションで sg3_utils パッケージの一部として提供されます。
この場合、sg_start -s
ドライブを再起動するだけで十分です。 sg_start --load
不要。 (私はこれが起こったポップアップ作業だとは思わないので、これは私にとって意味があります)。
他のユーザーはこれがうまくいかないと主張しています。 USBドライブコントローラ(特に小型フラッシュドライブ)は少し奇妙になる可能性があるため、一部のドライブがこのコマンドを拒否しても驚くことはありません。
https://unix.stackexchange.com/a/394961/29483
フラッシュROMスティックのUSBコントローラは、通常、デバイスの電源を切り、それ以上の相互作用を防ぐ方法で反応します。つまり、USBサブシステムから完全に消えて再びアクセスするには、最初に再列挙する必要があります。
たとえば、CD/DVDドライブに転送されると、同じコマンドがディスクを取り出し、「START STOP」コマンドの既存の「LOAD」オプションを使用してディスクを再ロードします。ただし、この説明はリムーバブルメディアを搭載したデバイスにのみ適用されます。