为什么我的外置USB硬盘有时候完全无法访问?

我有一个外置USB硬盘,由一个1TB的SATA硬盘和一个Rosewill RX35-AT-SU SLV Aluminum 3.5" Silver USB 2.0 External Enclosure组成,插入我的SONY VAIO VGN-NS310F笔记本电脑。它直接插入电脑(不通过集线器)。外壳内部的硬盘是一块7200转Western Digital硬盘,但我不记得具体型号了。如果大家认为有必要知道这个细节,我可以再次从外壳中取出硬盘。
这个驱动器是以ext4格式进行格式化的。我在我的Lubuntu 11.10系统上使用udisks动态挂载它,通常通过PCManFM自动完成。(我曾在这台机器上安装过Lubuntu 12.04,并且也遇到了同样的问题。)每隔一段时间(一天一两次),它会变得无法访问,并且很难卸载。尝试使用sudo umount ...卸载它会出现一个错误消息,说该驱动器正在使用中,并建议使用fuserlsof来查找是什么在使用它。使用fuserlsof杀掉使用该驱动器的进程有时足以让我卸载它,但通常不行。 一旦驱动器被卸载或者机器重新启动,驱动器将无法挂载。插入驱动器并打开它后,电脑上没有任何反应。dmesg没有任何变化。驱动器的访问指示灯通常会频繁闪烁,就像驱动器一直在被访问一样。然后最终,在我将驱动器关闭一段时间(半小时)后,我才能够再次挂载它。
虽然这个驱动器在这台机器上一段时间内无法工作,但在运行相同版本的Ubuntu的另一台机器上,它将立即工作。有时候将它从另一台机器上带回来似乎可以“修复”它。有时候却不行。
在变得无法卸载之前,驱动器并不总是在挂载时停止可访问性。有时候它工作得很好,我关闭电脑,重新打开电脑,就无法挂载驱动器了。
目前,这是唯一一个出现这个问题的驱动器,但我曾经遇到过类似问题,只是不同的驱动器,在不同的Ubuntu机器上。这台笔记本常连接着另一个外部USB驱动器,而那个驱动器没有这个问题。在插入“有问题”的驱动器之前拔掉那个驱动器并不能解决问题。
过去我曾经打开过驱动器,确保连接紧密,但似乎并没有什么效果(除非等待与打开和关闭驱动器所需的时间相同后再尝试重新挂载)。
有人对发生这个问题的原因有任何想法吗?我应该执行哪些故障排除步骤?或者我应该如何完全解决这个问题? 更新:我尝试更换了USB数据线(从硬盘盒到笔记本电脑),正如Merlin建议的那样。我早该尝试这个方法,因为它完美地符合症状(硬盘在另一台机器上能够工作,这是有道理的,因为数据线可能以不同的角度弯曲,并可能导致断裂线路)。然而,不幸的是,这并没有帮助——我用新的数据线仍然遇到了同样的问题。下次我能够让硬盘工作时,我会提供关于盒子内部的硬盘的详细信息。(目前,我没有另一台可连接它的电脑。)

重大更新(2012年6月28日)

硬盘似乎已经严重损坏了。我认为是这样,因为我将其连接到另一台机器上,在复制文件时出现了很多无效字符的错误。我对从硬盘中恢复数据的兴趣不如对找出问题所在感兴趣。我特别想知道问题是硬盘还是盒子引起的。

现在,当我将驱动器插入原来出现问题的机器时,它仍然不会显示(包括使用sudo fdisk -l命令),但是内核可以识别它,并且会在dmesg中添加消息。大部分消息都是重复多次的错误信息,类似于这样:
[    7.707593] sd 5:0:0:0: [sdc] Unhandled sense code
[    7.707599] sd 5:0:0:0: [sdc]  Result: hostbyte=invalid driverbyte=DRIVER_SENSE
[    7.707606] sd 5:0:0:0: [sdc]  Sense Key : Medium Error [current] 
[    7.707614] sd 5:0:0:0: [sdc]  Add. Sense: Unrecovered read error
[    7.707621] sd 5:0:0:0: [sdc] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00
[    7.707636] end_request: critical target error, dev sdc, sector 0
[    7.707641] Buffer I/O error on device sdc, logical block 0

这是来自dmesg的所有行,从识别驱动器开始。 请注意:

  • 我又回到在这台机器上运行Lubuntu 12.04(也许这是更好的错误消息因素之一)。
  • 现在,该驱动器已插入另一台机器并重新插入此机器后,而且此机器又恢复到运行12.04,该驱动器的访问指示灯不像我描述的那样闪烁。看着驱动器,它似乎正常工作,几乎没有或没有访问。
  • 此行为(错误)发生在将驱动器插入的同时重新启动机器时,以及手动插入驱动器时。
  • 其中一些消息与/dev/sdb有关。那个驱动器工作正常。有问题的驱动器是/dev/sdc。我只是不想从中间删除任何内容。

3坏了/有问题的电缆? - Moog
驱动器是SATA II还是SATA III?有任何BIOS或固件更新吗? - Mitch
你能检查一下那个硬盘的S.M.A.R.T.状态吗?无论在哪里都能识别到它吗? - Samik
@Samik 即使设备被识别出来,我似乎也无法做到这一点。 - Eliah Kagan
2从你的dmesg日志中可以看出,系统反复无法读取第一个扇区,READ(10)指令失败了。所以可能是有一个坏扇区正在增长。 - Samik
艾莉亚,这个问题解决了吗?如果是的话,你能发表解决方案吗? - don.joey
6个回答

要确定问题是驱动器还是外壳的问题,需要将驱动器从外壳中取出,在具有足够电源的台式机上安装,并检查智能状态。
对于更深入的测试,您可以使用像ddrescue这样的工具来检查驱动器的每个扇区。 ddrescue在过程中会报告错误大小,您可以同时尝试数据恢复,例如:sudo ddrescue /dev/sdb2 /path/to/recovery.image logfile。使用sudo lsblk或经典的fdisk -l列出分区。
如果您确实对数据没有兴趣,可以将输出文件强制设置为/dev/null
sudo ddrescue --force /dev/sdc /dev/null logfile 

而且你仍然会在标准输出上得到有关任何错误大小的报告

在Ubuntu 14.04上测试,使用GNU ddrescue 1.17进行如下操作,在这个简短的示例中使用/dev/sdb2(一个1MB的交换分区)

$ sudo ddrescue --force /dev/sdb2 /dev/null logfile


GNU ddrescue 1.17
Press Ctrl-C to interrupt
rescued:      1024 B,  errsize:       0 B,  current rate:     1024 B/s
   ipos:         0 B,   errors:       0,    average rate:     1024 B/s
   opos:         0 B,    time since last successful read:       0 s

虽然我不能完全按照这些步骤进行操作,但我相信这个答案既正确又最能准确地描述了我遇到的问题的本质(尽管其他解决方案也有其价值,适用于类似情况)。最终,这个硬盘完全停止工作,我将它从(供电的)外壳中取出,在另一个(供电的)外壳中也无法使用(在多台机器上测试),而在原始外壳中另一个硬盘却可以正常工作(在多台机器上测试)。由于无法再次识别出问题的硬盘,我没有尝试运行ddrescue或检查SMART状态。 - Eliah Kagan
@EliahKagan 这是机械故障还是电气故障?你能听到硬盘转动的声音吗?只是好奇问一下。 - Elder Geek
上次我启动硬盘的时候,我还能听到它在转动,是的。 - Eliah Kagan

我在使用12.04版的Ubuntu桌面时也有类似的经历。我的硬盘外壳有两种供电方式,我可以购买一个交流适配器,或者使用一个迷你USB转普通USB的电缆,或者使用一个迷你USB电缆连接两个USB电缆。理想情况下,它需要同时连接到两个USB端口以提供足够的电力。它可以通过USB电缆或eSata传输数据。
当使用eSata连接时,我需要先提供驱动器的电源,使磁盘旋转,然后启动系统,以便BIOS能够识别已经旋转的磁盘。否则,它将无法及时检测到磁盘。我认为这与外壳的控制器有关。
当我挂载USB时,插入电缆时先连接到外壳,然后再连接到USB端口时,结果非常不稳定。大约一半的时间它会正确挂载。如果我先将USB电缆插入计算机端口,然后再插入外壳,结果要好得多,大约有70%的成功率。在USB选项中,我获得最好的结果是使用外部电源(交流适配器)为外壳提供电力,确保磁盘在插入机器之前旋转和稳定。这样几乎可以百分之百地工作。
并不是说这一定就是你的问题,但对我来说,在连接之前,先提供外壳电源并让硬盘转动有助于系统读取。也许你的一个系统的BIOS或总线速度比另一个好,它给了外壳控制器启动工作的时间,然后再尝试读取硬盘?而且也许在拔下外壳后,控制器会重置自己一段时间?也许控制器需要时间来确定它只是从USB获取电源还是电源和数据。也许这是一个电压或电流的问题?无论如何,外壳控制器似乎很难搞定。

对于您的USB驱动器,请尝试以下步骤(如果您还没有这样做):

  1. sudo fdisk -l #获取信息
  2. sudo mkdir /media/external #创建挂载点
  3. sudo mount -t vfat /dev/sdb1 /media/external -o uid=1000,gid=1000,utf8,dmask=027,fmask=137 #挂载。

或者尝试使用pmount来挂载您的USB驱动器。


5感谢您的建议。不幸的是:**[1]** sudo fdisk -l没有显示出任何有关驱动器的信息。我不会指望它会,因为重新连接驱动器时dmesg并没有发生变化。 [2] 我无法手动挂载一个Ubuntu根本没有识别为已连接的设备。(同样,dmesg什么也没说。)(这也适用于udiskspmount。)记住,问题不在于驱动器分区是否被看到。那个驱动器被忽视了。**[3]** 为什么我要将ext4卷挂载为vfat? - Eliah Kagan

很多时候,这种问题是由于USB电缆传输给硬盘的电力不足引起的,尤其是在外置硬盘不是直接购买而是自行组装的情况下。 (你会希望一个外置硬盘的制造商已经确保USB端口能够支持它。)
根据USB 2.0规范,设备可以从一个端口中获取最高500毫安的电流,而USB 3.0则可以达到最高900毫安。通过查看外置硬盘的制造商规格,您可能能够确认您的硬盘的最大功率需求。
通常可以通过尝试使用USB3端口(如果您有,并且您还没有尝试过这个方法)来解决问题,因为它们提供比USB2更多的电力,或者使用一个USB Y线,以便硬盘可以从两个端口而不是一个端口获取电力。这些产品在eBay或亚马逊上价格便宜。

我建议您的USB总线驱动芯片或类似设备可能也存在问题。您有没有工具可以列出所有的USB设备?试着在硬盘正常工作时和无法访问时运行这些工具,看看是否有任何差异?
旧一些(更便宜的)硬盘会经历一个称为“热重新校准”(TACL)的过程,大约每小时进行一次,当硬盘估计磁头因热量积聚而弯曲时,它们可能会变得无法访问几秒钟。在TCL期间,步进电机和线圈会寻找每个磁道,并将磁头对齐在每个磁道上,并将结果存储起来。这是固件的内部功能。听起来这个过程要么卡住了,要么产生了错误的答案,导致在热重新校准后无法访问硬盘。
您从dmesg中发布的错误指示sdc、扇区0、逻辑块0存在问题。这些低编号的块通常包含硬盘的几何信息(即硬格式化或软格式化)。如果这些块出现问题,整个硬盘可能会变得无法访问,永久性地。介质故障可能与热有关,这也可以解释为什么在一段不活动的时间后(将硬盘移动到另一台机器上),有时可以修复它,有时无法修复。
要确定问题是否与温度有关,打开计算机并启动秒表,但不要真正使用驱动器 - 只需等待它失败,并记录失败所需的时间。然后,关闭计算机并将其关闭数小时以冷却,然后重新运行测试,打开计算机和驱动器,但开始进行大量数据密集型的驱动器之间的复制(相同的驱动器)。做更多的步进电机工作可能会导致驱动器更快地加热,并导致其更早失败。如果故障延迟发生了很大变化,那么驱动器已经损坏了,我建议您购买另一个。祝好运!

虽然问题的真正原因已经指出,但我想再补充一下相同的答案,因为我有4个外置硬盘驱动器。
任何制造的计算机都假设电源将按照配置规格使用,并且最多超载20%。 任何外部USB设备都必须通过外部供电集线器供电,以保护计算机的电源。 所描述的行为是电源超载的典型行为。假设您还有一个外部DVD驱动器,这也会导致您的录音失败,甚至可能使您的设备和计算机无法恢复。 笔记本电脑通常会以这种方式损坏,因为用户倾向于使用被动USB集线器或计算机供电的设备,包括硬盘驱动器、DVD等。
购买一个外部供电的USB集线器,并通过一个供电的USB端口连接USB设备,而不是从计算机的电源中耗取电力,因为这种方法会对你的硬盘驱动器造成更多的损害。电力波动大多与电脑或外部设备电力不足有关。 USB标准与电力不足的设备无关。 可以这样理解:如果你想从汽车获取动力,你会选择什么燃料?任何可燃烧的东西,还是制造商指定的燃料? 在这里也是一样的。 使用未供电的USB设备会耗取计算机内部电源的电力。它已经连接了足够多的设备!