web-dev-qa-db-ja.com

リセット時にUSBストレージが別のデバイスを使用しないようにする

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

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

これは非常に混乱を招き、私にとって多くの問題を引き起こします。私が実行している操作の一部は数時間または数日かかる可能性があり、これがそのプロセスの任意の時点で発生した場合(たとえば、仕事中または睡眠中)、 いつ発生したかを判断し、その時点から再開するか、最初からやり直す必要があります。どちらも非常に難しいです。

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

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

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

6月12日12:57:42ubuntuカーネル:[206070.288681] usb 1-1.2:ehci_hcd 
を使用して高速USBデバイス番号23をリセット6月12日12:57:43ubuntuカーネル:[206070.732013] usb 1-1.2 :ehci_hcd 
を使用して高速USBデバイス番号23をリセット6月12日12:57:43ubuntuカーネル:[206071.175603] usb 1-1.2:ehci_hcd 
 Junを使用して高速USBデバイス番号23をリセット12 12:57:44 ubuntuカーネル:[206071.618695] usb 1-1.2:ehci_hcd 
を使用して高速USBデバイス番号23をリセットします。6月12日12:57:44ubuntuカーネル:[206072.062224] usb 1-1.2: ehci_hcd 
 Jun 12 12:57:44 ubuntu kernel:[206072.095010] usb 1-1.2:USB切断、デバイス番号23 
 Jun 12 12:57:を使用して高速USBデバイス番号23をリセットします。 44 ubuntuカーネル:[206072.098317] scsi 16:0:0:0:オフラインデバイスへのI/Oを拒否
 6月12日12:57:44ubuntuカーネル:[206072.098327] scsi 16:0:0:0: [sdb]強制終了リクエスト
 6月12日12:57:44ubuntuカーネル:[206072.098345] scsi 16:0:0:0:[sdb]未処理のエラーコード
 6月12日12:57:44 ubuntu k ernel:[206072.098349] scsi 16:0:0:0:[sdb]結果:hostbyte = DID_NO_CONNECT driverbyte = DRIVER_OK 
 Jun 12 12:57:44 ubuntuカーネル:[206072.098356] scsi 16:0:0: 0:[sdb] CDB:Read(10):28 00 03 66 90 8b 00 00 01 00 
 Jun 12 12:57:44 ubuntuカーネル:[206072.098387] end_request:I/Oエラー、dev sdb、セクター57053323 
 6月12日12:57:44ubuntuカーネル:[206072.309890] usb 1-1.2:ehci_hcd 
 6月12日12:57:45ubuntumtp-を使用した新しい高速USBデバイス番号26プローブ:バス1のチェック、デバイス26: "/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2" 
 6月12日12:57:45ubuntu mtp-probe:バス:1、デバイス:26はMTPデバイスではありませんでした
 6月12日12:57:45ubuntuカーネル:[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:46ubuntuカーネル:[206074.242675] sd 17:0:0:0:添付されたscsi汎用sg2タイプ0 
 6月12日12:57:46ubuntuカーネル:[206 074.243800] sd 17:0:0:0:[sdc] 195371568 512バイト論理ブロック:(100 GB/93.1 GiB)

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

どういうわけか/dev/sdbにとどまるように強制したいと思います。これを行う方法はありますか?

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

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

また、ログには電力関連の問題は見られませんが、おそらく電力の問題ではないかと思います。パワードハブはまだ試していません。マシンはLenovoThinkPad T520(AC電源で動作)であり、過去に利用可能なUSB電流に関して私が失敗したことはありません。

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

2
Jason C

/ 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/by-label /

    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がWD1TB、Samsung 2TB、または1GBフラッシュドライブのいずれであるかを考えるのではなく、特定のユニットをファイル/使用/マウントするのを非常に簡単にします。

また、マウントが簡単になります:(from / etc/fstab

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

by-pathパスは、特定のデバイスへの物理接続を技術的に関連付けるため便利です。ドライブが適切なパーティション情報でうまく機能しない場合や、奇数のラベルなどが付けられている場合に便利です。

2
lornix