外置存储老掉盘:一次巡检看清 USB 链路问题
外置存储老掉盘:一次巡检看清 USB 链路问题
【摘要】小主机上的 TF 卡三天两头掉线,重启后又能挂上。用 lsblk、df、dmesg 跑一轮巡检,从挂载参数和内核日志里找到真正的原因,附一段可直接复用的巡检脚本。
一、缘起:重启就好,过两天又掉
我那台 Armbian 小主机外挂了一块 116GB 的 USB 存储,挂载点 /mnt/tf,平时放媒体文件和备份。问题是有阵子它总"消失":服务报文件不存在,登录一看挂载点空了,重新插拔或重启又恢复。
一开始我怀疑文件系统坏了,甚至准备换盘。后来想想,先把现场信息收一遍再动手——换盘是最后一步,不是第一步。
二、先看块设备与容量
巡检从"盘还在不在、挂在哪"开始:
lsblk -o NAME,SIZE,FSTYPE,LABEL,MOUNTPOINTS
df -hT /mnt/tf
当时的关键输出:
NAME SIZE FSTYPE MOUNTPOINTS LABEL
sda 116.5G
└─sda1 116.5G ext4 /mnt/tf tfdata
mmcblk2 7.2G
├─mmcblk2p1 511M vfat /boot BOOT_EMMC
└─mmcblk2p2 6.6G ext4 / ROOTFS_EMMC
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 115G 87G 28G 77% /mnt/tf
两个信息值得记下来:系统跑在 7.2GB 的 eMMC 上,外置盘是独立的 sda;容量还剩 28GB,不是写满导致的异常。很多人看到服务报错就先去清空间,这次方向不对。
顺手做了一个顺序写测试:
dd if=/dev/zero of=/mnt/tf/.iotest bs=1M count=64 conv=fsync
回显 64 MiB copied, 10.5 s, 6.4 MB/s。对于 USB 2.0 接口的存储,这个速度算正常,说明盘本身没进入只读或降速保护状态。
三、真正的线索在内核日志里
挂载正常、容量正常、读写正常,那"掉盘"是怎么发生的?答案在 dmesg:
dmesg -T | grep -Ei 'usb.*disconnect|I/O error|remount-ro' | tail -20
usb 1-2: USB disconnect, device number 66
usb 1-2: USB disconnect, device number 71
usb 1-2.3: USB disconnect, device number 72
usb 1-2.4: USB disconnect, device number 73
usb 1-2.5: USB disconnect, device number 74
同一路 USB 总线上反复出现 USB disconnect,设备号一路涨到 74。这组日志基本把问题定性了:不是文件系统损坏,是 USB 链路在反复断开重连。文件系统只是受害者——链路一断,挂载点自然失效。
dmesg 里没有出现 I/O error 或 remount-ro,也侧面印证了这一点:盘没坏,是连接掉了。
四、fstab 里有两个参数在兜底
再看挂载配置:
UUID=<UUID> /mnt/tf ext4 defaults,noatime,nofail,x-systemd.automount,x-systemd.device-timeout=10s 0 0
这行配置里有三个关键项:
| 参数 | 作用 |
|---|---|
nofail |
设备不在时不阻塞启动,避免开机卡住 |
x-systemd.automount |
访问挂载点时才真正挂载,设备晚到也能自动接上 |
x-systemd.device-timeout=10s |
等设备最多 10 秒,超时继续启动 |
这也是为什么"重启就好":nofail 保证了系统能起来,automount 让设备重新出现后自动挂回。但要注意,这套配置解决的是"掉盘后系统别崩",不是"盘别掉"。
五、防松要分三层做
链路为什么断?这种小板子 + USB 存储的组合,八成是物理接触和供电问题。按性价比排:
物理固定(治本)。 USB 头用扎带或热熔胶固定在机壳上,让线材受力点落在机壳而不是接口上;换短线,线材别悬空。机器放在不会被碰到的地方。触点氧化的话,断电后用酒精擦一下。
供电稳定(掉盘常见真因)。 USB 移动盘启动瞬间电流冲高,供电不足会表现为"假性掉盘"——系统里看到的就是 disconnect。用带独立电源的 USB HUB 或带供电的硬盘盒,别让小板子的 USB 口同时带盘和别的外设。
软件兜底(减少影响)。 保留 nofail 和 automount;再给挂载点加一个轻量巡检,掉线时能收到提醒,而不是等用户发现文件没了。
六、一条可复用的巡检命令
把上面几步收进一个脚本,掉盘时先跑它:
#!/usr/bin/env bash
set -u
echo "== 块设备 =="; lsblk -o NAME,SIZE,FSTYPE,LABEL,MOUNTPOINTS
echo "== 容量 =="; df -hT /mnt/tf 2>/dev/null
echo "== 挂载参数 =="; findmnt -no SOURCE,FSTYPE,OPTIONS /mnt/tf 2>/dev/null
echo "== USB 断开记录 =="; dmesg -T 2>/dev/null | grep -Ei 'usb.*disconnect' | tail -20
echo "== 文件系统错误 =="; dmesg -T 2>/dev/null | grep -Ei 'I/O error|remount-ro' | tail -10
echo "== 顺序写测试 =="
dd if=/dev/zero of=/mnt/tf/.iotest bs=1M count=64 conv=fsync status=none \
&& rm -f /mnt/tf/.iotest && echo "写测试通过"
两个注意点:dmesg 在部分发行版需要 root 权限;写测试会占用 64MB,脚本最后已经删掉了测试文件。
七、总结
- 掉盘先收现场:
lsblk看设备、df看容量、dmesg看链路,别一上来就换盘。 USB disconnect反复出现,问题在物理连接或供电;I/O error、remount-ro才更偏向盘或文件系统。nofail和x-systemd.automount能让掉盘不拖垮系统,但它们只兜底,不治本——真正治本的是把插头和供电稳住。
END
- 点赞
- 收藏
- 关注作者
评论(0)