
我有一個 USB 外殼中的硬碟驅動器,我正在對其進行一些資料復原。該驅動器的狀態非常糟糕,並且在讀取時經常重置。
該設備註冊為/dev/sdb
.有時,大約每幾千次重置中就會有一次,由於某種原因它會切換到/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 Jun 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 Jun 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 Jun 12 12:57:44 ubuntu 核心:[206072.095010] USB 1-1.2:USB 斷開連接,裝置號 23 Jun 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]終止請求 Jun 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 儲存 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(使用交流電源運行),過去在可用 USB 電流方面從未讓我失望過。
系統是Ubuntu 12.04 LTS,核心3.2.0-64,64位元。
答案1
透過/dev/disk/by-xxx路徑存取裝置。
對於設備/分區,這些路徑保持不變,並帶有指向正確的 /dev/sdXY 設備本身的符號鏈接,由系統維護。因此,雖然該設備可能會重新連接到另一個設備虛擬的設備,您可以使用的路徑不會改變。
/dev/disk/by-uuid/
每個磁碟機/裝置都有一個唯一的 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
將始終指向該磁碟機的分割區 1,無論它是 sda/sdb/sdc 等。
還有其他方法可用:
/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、三星 2TB 還是 1GB 隨身碟。
也讓安裝更容易:(來自/etc/fstab)
LABEL=xenon / ext4 defaults,... and so forth
這旁路路徑可能很有用,因為它在技術上將物理連接關聯到特定設備,如果驅動器不能很好地處理正確的分區信息,給出奇怪的標籤等,這可能對您有用。