在 Linux 上使用 UAS USB3 存储的变通方法
Source: Dev.to
Identify Storage
lsusb -tv
# view USB tree and the kernel driver in use (uas vs usb-storage)
# view VID:PID
Tip: lsusb -tv 是确认内核实际绑定到设备的驱动(uas 还是 usb‑storage)的最简方法。
Quirk Flags (What u and m mean)
usb-storage 模块接受一个 quirks= 参数,参数中可以包含一个或多个形如:
VID:PID:FLAGS
的条目。
常用的标志包括:
u= IGNORE_UAS – 强制内核不要为该设备绑定uas驱动,而使用usb-storage(BOT)驱动。m= MAX_SECTORS_64 – 将传输大小限制为 64 扇区(32 KB)。这可以在某些设备/桥接芯片对大传输不稳定时提升稳定性(但会牺牲性能)。
常见的组合是 mu:同时禁用 UAS 并限制传输大小,以获得更好的稳定性。
Temporary Settings (runtime / non‑persistent)
向 sysfs 写入只会影响当前运行的内核,重启后会失效。
Single device
echo "0bc2:231a:u" | sudo tee /sys/module/usb_storage/parameters/quirks
# disconnect and reconnect
Multiple devices (comma‑separated)
printf '0bc2:231a:u,6795:2756:mu\n' | sudo tee /sys/module/usb_storage/parameters/quirks
# disconnect and reconnect
Notes
- 使用逗号分隔,不能有空格。
- 这会覆盖当前值(不会追加)。
Add a device without losing existing entries
由于 sysfs 不支持追加模式,需要先读取当前值,加入新条目后再写回:
cur=$(cat /sys/module/usb_storage/parameters/quirks)
new='0bc2:231a:u'
if [ -z "$cur" ]; then
printf '%s\n' "$new" | sudo tee /sys/module/usb_storage/parameters/quirks >/dev/null
else
printf '%s,%s\n' "$cur" "$new" | sudo tee /sys/module/usb_storage/parameters/quirks >/dev/null
fi
# disconnect and reconnect
Persistent Settings (recommended)
要让 quirks 在重启后仍然生效,需通过 modprobe.d 设置。
创建例如 /etc/modprobe.d/usb-storage-quirks.conf:
options usb-storage quirks=0bc2:231a:u,6795:2756:mu
随后重启,或重新加载模块(重启通常是最简单、最可靠的方式,尤其是涉及 USB 存储绑定时)。
initramfs note (dracut / update‑initramfs)
在多数情况下,只需添加 modprobe.d 文件并重启即可。但如果系统在 initramfs 阶段就加载存储驱动(例如从 USB 存储启动,或在受影响的设备上使用 LUKS/LVM),则需要重新生成 initramfs,才能让新的 modprobe.d 设置在早期引导时生效。
RHEL/CentOS/Rocky/Alma/Fedora (dracut)
sudo dracut -f
sudo reboot
Debian/Ubuntu (initramfs‑tools)
sudo update-initramfs -u
sudo reboot
Notes
grub2-mkconfig通常 不需要 用于modprobe.d的更改(它只用于 GRUB 菜单或内核命令行的修改,而不是模块选项文件)。- 即使重新生成了 initramfs,仍可能需要拔插设备(或重启)以让驱动重新绑定。
Confirm
确认设备正在使用 usb-storage(而非 uas):
lsusb -tv
查找类似 Driver=usb-storage 的行,以确认对应的设备路径。