防止 USB 儲存在重置時使用不同的設備
我在 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 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 Jun 12 12:57:44 ubuntu kernel: [206072.309890] usb 1-1.2: new high-speed USB device number 26 using ehci_hcd 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: bus: 1, device: 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
立即再次可用以便重複使用的方法?我目前正在執行的應用程序在啟動時會打開設備一次,並在嘗試恢復時一直保持打開狀態。我寫了這個應用程序並且可以控制它的行為,所以程式碼中的解決方案也是可能的,但我想先看看是否有系統級的解決方案(我還沒有嘗試過軟體解決方法,我想看看是否有一個更簡單的方法)。
我也想知道這是否可能是電源問題,儘管我在日誌中沒有看到與電源相關的問題。我還沒有嘗試過有源集線器。這台機器是聯想 ThinkPad T520(使用交流電源執行),過去在可用 USB 電流方面從未讓我失望過。
系統是 Ubuntu 12.04 LTS,核心 3.2.0-64,64 位。
通過 /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
將始終指向該驅動器的分區 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、Samsung 2TB 還是 1GB 快閃記憶體驅動器。
也使安裝更容易:(來自**/etc/fstab**)
LABEL=xenon / ext4 defaults,... and so forth
旁路路徑可能很有用,因為它在技術上將物理連接與特定設備相關聯,如果驅動器不能很好地使用正確的分區資訊、給出奇怪的標籤等,它可能對您有用。