我有一个 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 Jun 12 12:57:43 ubuntu 内核:[206070.732013] usb 1-1.2:使用 ehci_hcd 重置高速 USB 设备编号 23 Jun 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
这旁路路径可能很有用,因为它在技术上将物理连接关联到特定设备,如果驱动器不能很好地处理正确的分区信息,给出奇怪的标签等,这可能对您有用。