防止 USB 存储设备在重置时使用不同的设备

防止 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
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

旁路路径可能很有用,因为它在技术上将物理连接关联到特定设备,如果驱动器不能很好地处理正确的分区信息,给出奇怪的标签等,这可能对您有用。

相关内容