SDB:USB 3.0 硬盘故障排除
问题
USB 3.0 外部硬盘连接到 USB 3.0 端口时,系统无法识别。例如,在使用 KDE 桌面时,它不会出现在设备通知器中。
简单解决方案
将硬盘连接到 USB 2.0 端口并重试。
背景
USB 3.0 规范比 USB 2.0 传输数据快得多,但它还有额外的命令,称为 UAS 或 USB-Attached-SCSI 协议,这些命令在传输大量小文件时特别有用。不幸的是,一些市售硬盘不支持完整的额外命令集,或者需要以非标准方式进行初始化。
遗憾的是,Linux 内核开发者通常需要一段时间才能得知具有此类问题的设备,需要时间才能找到解决方法,并且在 Linux 的发行版本(例如 openSUSE、Red Hat 或 Ubuntu)中提供修改后的代码。
以下描述了如何缩短此过程。但是,这需要具有 root 用户操作经验。任何错误都可能导致系统灾难性故障,因此,如果您不是经验丰富的 root 用户,请从友好的专家那里寻求帮助。您的本地 Linux 用户组会提供帮助。您还可以找到一家拥有 Linux 专家的本地电脑商店。
其他选项
如果您有一个无法正确挂载的新设备,首先值得检查系统日志,以确保内核至少能够查询该设备并接收到有意义的回复。如果发生这种情况,则问题很可能是硬件故障。
查询系统日志
openSUSE 的最新版本使用 systemd 来初始化系统并处理内核消息。要查看连接新设备时发生的情况,请打开一个终端窗口,并以 root 身份发出命令 'journalctl -f'。可以使用 sudo 命令来执行此操作
在请求 root 密码后,这将生成几行最近的内核消息,然后输出进一步的消息,因为它们被生成。
此时,通过 USB 3.0 端口连接硬盘。然后它应该输出如下形式的行
Mar 25 16:53:28 XXXX kernel: usb 2-7: new SuperSpeed USB device number 4 using xhci_hcd Mar 25 16:53:28 XXXX kernel: usb 2-7: New USB device found, idVendor=0bc2, idProduct=331a Mar 25 16:53:28 XXXX kernel: usb 2-7: New USB device strings: Mfr=1, Product=2, SerialNumber=3 Mar 25 16:53:28 XXXX kernel: usb 2-7: Product: Expansion Desk Mar 25 16:53:28 XXXX kernel: usb 2-7: Manufacturer: Seagate Mar 25 16:53:28 XXXX kernel: usb 2-7: SerialNumber: NA8EFXP3 Mar 25 16:53:28 XXXX kernel: scsi host10: uas
然后可能会出现许多错误消息行。请注意上述列表中第二行的 Vendor 和 Product 数字。
强制 USB 2.0 命令在 USB 3.0 端口上运行
如果设备通过 USB 3.0 端口连接并生成上述输出,但随后失败,则可能是 USB 3.0 命令导致了问题。可以通过将以下行添加到文件 '/etd/modprobe.d/ignore_uas.conf' 来绕过这些命令。
该文件需要由 root 编辑。如果使用 'vi' 编辑器,可以通过以下命令执行此操作
系统将要求输入 root 密码,之后应将以下形式的行添加到文件中
options usb-storage quirks=idVendor:idProduct:u
其中 idVendor 和 idProduct 是系统日志中的数字。因此,对于上述输出列表,该行将读取
options usb-storage quirks=0bc2:331a:u
重启系统。这次,当连接 USB 3.0 硬盘时,它应该可以正确连接和挂载。但是,它的速度不会达到最佳状态,因为它将仅使用 USB 2.0 命令集。
获取最新的 Quirks 列表
已经发现许多设备具有相似的 Quirks。因此,您安装的 Linux 内核可能包含绕过 Quirks 的代码,但需要告知使用哪段代码。最新的 Quirks 列表通常可以在当前的 mainline 内核中找到。在 2016 年 4 月,可以在 "www.kernel.org" 找到它。
如果您单击 mainline 'browse' 选项,然后单击 'tree' 选项卡,则可以向下遍历到 drivers->usb->storage 目录。影响 USB 3.0 存储设备的 Quirks 在文件 'unusual_uas.h' 中给出。它由一系列以 "UNUSUAL_DEV" 开头并后跟四个数字的规范组成。前两个是 Vendor 和 Product 数字,对应于上述输出行中的 IdVendor 和 idProduct。示例是
UNUSUAL_DEV(0x0984, 0x0301, 0x0128, 0x0128, "Apricorn", "", USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_IGNORE_UAS), UNUSUAL_DEV(0x0bc2, 0x2312, 0x0000, 0x9999, "Seagate", "Expansion Desk", USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_NO_ATA_1X),
如果您可以在列表中找到您自己设备的相同两个数字,请记下列表中的最终变量,例如 US_FL_IGNORE_UAS 或 US_FL_NO_ATA_1X。这些标志控制 USB 3.0 命令的使用。
接下来,您需要检查文件 'usb.c'。它包含一个例程 'usb_stor_adjust_quirks',该例程处理文件 'ignore_uas.conf'。找到将上述选项行末尾的字符与相同的标志集关联的 case 命令。因此,在以下摘录中,'u' 定义为等效于标志 US_FL_IGNORE_UAS,而 't' 定义为标志 US_FL_NO_ATA_1X。
case 't': f |= US_FL_NO_ATA_1X; break; case 'u': f |= US_FL_IGNORE_UAS; break;
此时,您需要找到与您设备的 Quirks 对应的字符。
最后,编辑您自己的 'ignore_uas.conf' 文件,将您添加的行末尾的 'u' 替换为 'usb.c' 中的字符。重新启动计算机,然后再次尝试将 USB 3.0 硬盘连接到 USB 3.0 端口。如果您安装的内核支持该 Quirks,则该设备将正确挂载。如果不支持,那么最好的选择可能是返回在文件 'ignore_uas.conf' 中使用 'u' 字符。
在这种情况下,如果您的内核定期更新,则所需的代码最终将被安装,您将不再需要 'ignore_uas.conf' 中的行。这可能需要一些时间,但如果您真的热衷并且了解编译内核模块,则可以为当前的内核编译最新的 'uas' 模块,该模块处理 USB 3.0 存储。但是,这超出了本说明的范围。
设备未在 'unusual_uas.h' 中
如果您的设备未在最新列表中,则可能意味着开发者尚未得知您设备的出现的问题。该文件提供了有关如何添加补丁以及向谁发送补丁的说明。最简单的方案是复制包含标志 US_FL_IGNORE_UAS 的语句之一,并用您自己设备的 Vendor 和 Product 数字替换它们。
但是,如果您使用此方法,请准备好提供其他信息,例如内核的错误输出,并准备好编译和测试其他模块选项。这是因为开发者不喜欢绕过 USB 3.0 命令集,除非万不得已。