USBドライブの挿入方法は?

USBドライブの挿入方法は?

質問

私の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」オプションを使用してディスクを再ロードします。ただし、この説明はリムーバブルメディアを搭載したデバイスにのみ適用されます。

関連情報