在过去的十四年里,我一直使用 USB 驱动器运行 Linux,使用安装的Debian Live以持久模式运行。我非常喜欢以这种方式运行 Linux。
我最近购买了一个 64GB 的 HP 笔式驱动器,并按照我通常设置此类系统的方式对其进行了设置。以下是系统和内核的详细信息,由 报告uname -a
:
Linux debian 6.3.0-1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.3.7-1 (2023-06-12) x86_64 GNU/Linux
问题是,一切都会顺利进行 - 通常会持续几个小时 - 然后突然我的主目录和存储将变为“只读”。 使用检查dmesg
发现在故障发生之前出现了一串错误,其中最相关的似乎是重复的错误,提示为tag#0 device offline or changed
。
我不明白为什么会发生这种情况。内核邮件列表和其他地方的大多数类似帖子都没有收到回复 - 例如这- 但也有少数人,比如这表示这可能是硬件错误。这不太可能是笔记本电脑的 USB 读取器中的错误,因为同一系统已经使用 Sandisk 笔式驱动器运行了一年多,我从未遇到过这些问题。不过,在我出去买一个新的笔式驱动器之前,我想问一下这是否可能是与内核相关的错误,或者是我不知道的其他错误?
编辑:我在这两个 Pastebins 中添加了一些错误消息的日志:这里- 大约 20 分钟后文件系统被重置 - 然后这里。这些tag#0
消息实际上似乎是在故障发生前二十分钟左右发出的,如果它们实际上不相关的话,请原谅。
重新启动后一切恢复正常。
编辑2:添加输出lsusb -tv
,这令人困惑,因为我的驱动器是 64GB 的,而不是 5000 MB 的......
/:总线 02.端口 1:Dev 1,Class=root_hub,驱动程序=xhci_hcd/4p,10000M ID 1d6b:0003 Linux Foundation 3.0 根集线器 |__ 端口 2:设备 2,如果为 0,则类别 = 大容量存储,驱动程序 = usb-storage,5000M ID 03f0:2003 HP, Inc /:总线 01.端口 1:Dev 1,Class=root_hub,驱动程序=xhci_hcd/6p,480M ID 1d6b:0002 Linux Foundation 2.0 根集线器 |__ 端口 5:Dev 2,如果 0,Class=Video,Driver=uvcvideo,480M ID 5986:9102 Bison Electronics Inc. |__ 端口 5:Dev 2,If 1,Class=Video,Driver=uvcvideo,480M ID 5986:9102 Bison Electronics Inc. |__ 端口 6:设备 3,如果为 0,则类别=无线,驱动程序=btusb,12M ID 0bda:c824 Realtek半导体公司 |__ 端口 6:设备 3,如果 1,类别=无线,驱动程序=btusb,12M ID 0bda:c824 Realtek半导体公司
答案1
它似乎USB 驱动器停止响应,因为它发现自己无法处理大量的写入,并且它停止响应的方式导致整个 USB 控制器也停止响应。
总的来说,即使是 USB 3.x 闪存驱动器在不堪重负时,写入性能也会非常差,这并不罕见。据我所知,它们只是有一些快速的“缓存”来使文件复制看起来很快,就像 QLC SSD 一样,但它们是为大型线性写入而设计的(即将一些大文件放入 USB 驱动器),而不是像 Debian 所做的那样为大量随机写入而设计的。
对于完整的“桌面”Linux 安装,我建议使用实际的SSD 通过 USB 连接;M.2 模块(SATA 或 NVMe)的外壳并不比典型的 USB 棒大多少。
至于您的日志:
-
Jul 04 10:46:20.762006 debian kernel: usb usb1: root hub lost power or was reset Jul 04 10:46:20.762366 debian kernel: usb usb2: root hub lost power or was reset
这是内核提示你的 USB 主控制器已崩溃。
-
Jul 04 11:09:01.974689 debian kernel: usb 1-5: reset high-speed USB device number 2 using xhci_hcd Jul 03 17:56:33.944054 debian kernel: usb 1-6: reset full-speed USB device number 5 using xhci_hcd Jul 03 17:56:33.944317 debian kernel: usb 1-3: reset high-speed USB device number 2 using xhci_hcd Jul 03 17:56:33.944576 debian kernel: usb 2-2: reset SuperSpeed USB device number 2 using xhci_hcd
这是内核在说它与连接到该 USB 主机控制器的所有设备都失去了连接(包括您的 USB 记忆棒和各种内部 USB 设备 - 1-5 是您的网络摄像头,1-6 是蓝牙,1-3 是带有 Logitech 鼠标和键盘的外部 USB 集线器,2-2 是您的 USB 记忆棒。)
-
Jul 03 17:56:33.944817 debian kernel: sd 1:0:0:0: [sdb] tag#0 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_OK cmd_age=0s Jul 03 17:56:33.945075 debian kernel: sd 1:0:0:0: [sdb] tag#0 Sense Key : Unit Attention [current] Jul 03 17:56:33.945343 debian kernel: sd 1:0:0:0: [sdb] tag#0 Add. Sense: Not ready to ready change, medium may have changed Jul 03 17:56:33.945580 debian kernel: sd 1:0:0:0: [sdb] tag#0 CDB: Write(10) 2a 00 00 47 3c d0 00 00 08 00
如果我没看错的话,这是 USB 闪存驱动器本身报告 SCSI“Write(10)”命令失败;有趣的是,不是不是因为之前的 USB 重置,而是因为内部错误 – USB 驱动器报告其存储介质已被移除。(这是 CD-ROM 驱动器在没有 CD 可读/写时使用的错误代码。虽然 USB 闪存驱动器没有可移动介质,但当其内部闪存出现故障时,它们报告“无介质”的情况仍然相当常见。)
接下来的一切只是设备sdb
在那时已经消失的后果——重置 USB 存储设备 2-2 会导致所有排队的 SCSI 命令被取消,底层 SCSI blockdev 故障导致所有排队的 Ext4 I/O 失败,I/O 故障导致 Ext4 将文件系统标记为只读,而文件系统为只读会导致 systemd-journald 抱怨。
这不太可能是笔记本电脑的 USB 读取器出现错误,因为同一系统已使用 Sandisk 笔式驱动器运行了一年多
这里没有“USB 读卡器”。有一个 USB主机控制器它负责处理底层连接,但所有的“驱动器”或“读取器”部分都在闪存驱动器本身内部。
这使得“根集线器”重置乍一看更加奇怪。但说实话,它实际上一点也不罕见软件和固件可能存在潜在的错误,这些错误可能在很多年后才会显现出来,直到被另一个设备的另一个错误或异常行为所触发。
例如,USB 主机控制器的“设备无响应”恢复代码中可能存在严重错误,只要您从未连接此类设备,这些错误可能几十年都不会出现,但只要您的设备出现轻微故障,它也会触发主机控制器错误。
因此,永远不要妄下结论说某个组件“运行良好”;它永远有可能运行良好在某些条件下一些事情的发生改变了这些情况。
编辑2:添加 lsusb -tv 的输出,这令人困惑,因为我的驱动器是 64GB 的,而不是 5000 MB 的......
该lsusb
命令不显示驱动器容量——它不关心所连接的设备类型,只关心附件本身。所以“5000M”就是 5000 兆位,USB 3.0 Gen1 连接的标准链接速度(dmesg 也称之为“SuperSpeed”)。
主机控制器本身(以及代表它的“根集线器”)显然是支持 10 Gbps 的 Gen2 控制器。类似地,其他条目是 USB 2.0(480 Mbps“高速”)和 USB 1.1(12 Mbps“全速”)。