外置存储老掉盘:一次巡检看清 USB 链路问题

举报
yd_258587103 发表于 2026/11/12 22:16:10 2026/11/12
【摘要】 外置存储老掉盘:一次巡检看清 USB 链路问题【摘要】小主机上的 TF 卡三天两头掉线,重启后又能挂上。用 lsblk、df、dmesg 跑一轮巡检,从挂载参数和内核日志里找到真正的原因,附一段可直接复用的巡检脚本。 一、缘起:重启就好,过两天又掉我那台 Armbian 小主机外挂了一块 116GB 的 USB 存储,挂载点 /mnt/tf,平时放媒体文件和备份。问题是有阵子它总"消失":...

外置存储老掉盘:一次巡检看清 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,脚本最后已经删掉了测试文件。

七、总结

  1. 掉盘先收现场:lsblk 看设备、df 看容量、dmesg 看链路,别一上来就换盘。
  2. USB disconnect 反复出现,问题在物理连接或供电;I/O error、remount-ro 才更偏向盘或文件系统。
  3. nofail 和 x-systemd.automount 能让掉盘不拖垮系统,但它们只兜底,不治本——真正治本的是把插头和供电稳住。

END

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。