リセット時にUSBストレージが別のデバイスを使用することを防ぐ

リセット時にUSBストレージが別のデバイスを使用することを防ぐ

USB エンクロージャにハード ドライブがあり、データ復旧を行っています。ドライブの状態は非常に悪く、読み取り時に頻繁にリセットされます。

デバイスは として登録されます/dev/sdb。 場合によっては、おそらく数千回のリセットに 1 回程度、何らかの理由で に切り替わります/dev/sdc。 元に戻す唯一の方法は、USB 接続を物理的に数秒間取り外してから再度接続することです。その時点で、デバイスは/dev/sdb再び として登録されます。

これは私にとって非常に混乱を招き、多くの問題を引き起こします。私が行っている操作の中には、数時間または数日かかるものもあり、そのプロセスのどの時点でも(例えば、仕事中や寝ている間)このようなことが起こると、私はいつ何が起こったのかをその時点から再開するか、最初からやり直すか。どちらも非常に困難です。

私が予想し、問題ない「通常の」リセット セットは次のようになります。

6月12日 11:15:28 ubuntuカーネル: [199944.703449] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 11:15:29 ubuntuカーネル: [199945.574141] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 11:15:29 ubuntuカーネル: [199946.017483] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 11:15:30 ubuntuカーネル: [199946.460816] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 11:15:30 ubuntuカーネル: [199946.904151] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 11:15:30 ubuntuカーネル: [199947.347659] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 11:15:31 ubuntuカーネル: [199947.690737] sd 16:0:0:0: [sdb] 未処理のエラーコード
6月12日 11:15:31 ubuntuカーネル: [199947.690747] sd 16:0:0:0: [sdb] 結果: hostbyte=DID_ERROR driverbyte=DRIVER_OK
6月12日 11:15:31 ubuntuカーネル: [199947.690757] sd 16:0:0:0: [sdb] CDB: 読み取り(10): 28 00 00 01 1d cd 00 00 01 00
6月12日 11:15:31 ubuntuカーネル: [199947.690780] end_request: I/Oエラー、dev sdb、セクター73165
6月12日 11:15:35 ubuntuカーネル: [199951.585312] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 11:15:36 ubuntuカーネル: [199952.455995] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 11:15:36 ubuntuカーネル: [199952.899329] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 11:15:36 ubuntuカーネル: [199953.342669] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 11:15:37 ubuntuカーネル: [199953.786009] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 11:15:37 ubuntuカーネル: [199954.229346] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 11:15:38 ubuntuカーネル: [199954.572710] sd 16:0:0:0: [sdb] 未処理のエラーコード
6月12日 11:15:38 ubuntuカーネル: [199954.572721] sd 16:0:0:0: [sdb] 結果: hostbyte=DID_ERROR driverbyte=DRIVER_OK
6月12日 11:15:38 ubuntuカーネル: [199954.572730] sd 16:0:0:0: [sdb] CDB: 読み取り(10): 28 00 00 01 1d cd 00 00 01 00
6月12日 11:15:38 ubuntuカーネル: [199954.572754] end_request: I/Oエラー、dev sdb、セクター73165

これは予想される動作です。 に切り替わる問題のあるリセットはsdc次のようになります。

6月12日 12:57:42 ubuntuカーネル: [206070.288681] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 12:57:43 ubuntuカーネル: [206070.732013] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 12:57:43 ubuntuカーネル: [206071.175603] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 12:57:44 ubuntuカーネル: [206071.618695] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 12:57:44 ubuntuカーネル: [206072.062224] usb 1-1.2: ehci_hcdを使用して高速USBデバイス番号23をリセット
6月12日 12:57:44 ubuntuカーネル: [206072.095010] usb 1-1.2: USB切断、デバイス番号23
6月12日 12:57:44 ubuntuカーネル: [206072.098317] scsi 16:0:0:0: オフラインデバイスへのI/Oを拒否しています
6月12日 12:57:44 ubuntuカーネル: [206072.098327] scsi 16:0:0:0: [sdb] 要求を強制終了
6月12日 12:57:44 ubuntuカーネル: [206072.098345] scsi 16:0:0:0: [sdb] 未処理のエラーコード
6月12日 12:57:44 ubuntuカーネル: [206072.098349] scsi 16:0:0:0: [sdb] 結果: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
6月12日 12:57:44 ubuntuカーネル: [206072.098356] scsi 16:0:0:0: [sdb] CDB: 読み取り(10): 28 00 03 66 90 8b 00 00 01 00
6月12日 12:57:44 ubuntuカーネル: [206072.098387] end_request: I/Oエラー、dev sdb、セクター57053323
6月12日 12:57:44 ubuntuカーネル: [206072.309890] usb 1-1.2: ehci_hcdを使用した新しい高速USBデバイス番号26
6月12日 12:57:45 ubuntu mtp-probe: バス1、デバイス26をチェックしています: "/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2"
6月12日 12:57:45 ubuntu mtp-probe: バス: 1、デバイス: 26 は MTP デバイスではありませんでした
6月12日 12:57:45 ubuntuカーネル: [206072.755377] scsi17: usb-storage 1-1.2:1.0
6月12日 12:57:46 ubuntuカーネル: [206074.240443] scsi 17:0:0:0: ダイレクトアクセス HTS72101 0G9SA00 PQ: 0 ANSI: 6
6月12日 12:57:46 ubuntuカーネル: [206074.242675] sd 17:0:0:0: SCSI汎用SG2タイプ0を接続
6月12日 12:57:46 ubuntuカーネル: [206074.243800] sd 17:0:0:0: [sdc] 195371568 512バイトの論理ブロック: (100 GB/93.1 GiB)

問題はリセットではなく USB の切断から始まります。これは回避する必要がある問題です。

どうにかして強制的にオンのままにしておきたいのですが/dev/sdb、何か方法はありますか?

あるいは、このタイプのハードリセットは避けられないように思えますが、これを防ぐために一時的に変更できる設定はどこかにありますか? 再試行タイマーか何かでしょうか? または、/dev/sdb再利用できるようにすぐに再び使用可能になるように強制する方法はありますか?

現在実行しているアプリケーションは、起動時にデバイスを一度開き、回復を試行している間ずっと開いたままにします。このアプリケーションは私が作成し、その動作を制御できるため、コードによる解決策も可能ですが、まずはシステム レベルの解決策があるかどうかを確認したいと思います (ソフトウェアによる回避策はまだ試していませんが、もっと簡単な方法があるかどうかを確認したいと思います)。

ログには電源関連の問題は見当たりませんが、電源の問題ではないかとも思っています。まだ電源付きハブを試していません。マシンは Lenovo ThinkPad T520 (AC 電源で動作) で、これまで USB 電流の供給が不十分になったことはありません。

システムは、Ubuntu 12.04 LTS、カーネル 3.2.0-64、64 ビットです。

答え1

/dev/disk/by-xxx パスを介してデバイスにアクセスします。

これらのパスはデバイス/パーティションに対して同じままで、適切な/dev/sdXYデバイス自体へのシンボリックリンクがシステムによって維持されます。そのため、デバイスが別のデバイスに再接続する可能性がある一方で、バーチャルデバイスによっては、使用できるパスは変わりません。

/dev/disk/by-uuid/

  • すべてのドライブ/デバイスには一意の UUID があるため、それに基づいたパスを使用すると、どの「デバイス」につながるかに関係なく、常に同じになります。たとえば、私のシステムでは次のようになります。

    xenon-lornix:/> ll /dev/disk/by-uuid/
    total 0
    lrwxrwxrwx 1 root root 10 Jun 10 02:33 24c80c49-3f88-4343-9b91-c34087e49102 -> ../../sda5
    lrwxrwxrwx 1 root root 10 Jun 10 02:33 b2254550-cc90-46e4-a84f-cb32bca8f83d -> ../../sda1
    
  • パスは/dev/disk/by-uuid/b2254550-cc90-46e4-a84f-cb32bca8f83d、sda/sdb/sdc などであるかどうかに関係なく、常にそのドライブのパーティション 1 を指します。

他にも利用できる方法があります:

/dev/disk/ラベル別/

    xenon-lornix:/> ll /dev/disk/by-label/
    total 0
    lrwxrwxrwx 1 root root 10 Jun 10 02:33 swap -> ../../sda5
    lrwxrwxrwx 1 root root 10 Jun 10 02:33 xenon -> ../../sda1

私は常にパーティションにラベルを付けています。こうすることで、/dev/sdc が WD 1TB なのか、Samsung 2TB なのか、1GB フラッシュ ドライブなのかを気にする必要がなく、特定のユニットをファイル/使用/マウントするのが非常に簡単になります。

取り付けも簡単になります:(/etc/fstab

    LABEL=xenon   /   ext4   defaults,... and so forth

迂回路パスは、特定のデバイスへの物理接続を技術的に関連付けるので便利です。おそらく、ドライブが適切なパーティション情報でうまく動作せず、奇妙なラベルが付けられる場合などに役立ちます。

関連情報