linux设备名不固定源于内核按探测顺序分配/dev/sdx,可靠方案是用udev创建永久软链接(如/dev/disk-mybook)或直接使用系统自建的/dev/disk/by-id/下唯一id链接。

Linux 存储设备命名不固定,根本原因是内核按探测顺序分配 /dev/sdX(如 sdb、sdc),同一块盘插在不同 USB 口或启动时初始化稍有差异,名字就可能变。靠 /dev/sdb 写脚本或配 /etc/fstab,极易出错。真正可靠的做法不是“改名”,而是用 udev 创建指向该设备的**永久软链接**,比如 /dev/disk-mybook,它始终指向那块盘,不管内核叫它 sdb 还是 sdd。
获取设备唯一标识符
不能依赖设备节点名,必须用设备自身不变的属性。最常用的是:
- ID_SERIAL:厂商+型号+序列号组合,对 USB/SATA 外置盘稳定有效
- ID_SERIAL_SHORT:仅序列号部分,更简洁,但需确保无重复
- ID_WWN:对 NVMe 或带 WWN 的 USB-SSD 更可靠
插入目标磁盘后,运行:
udevadm info --name=/dev/sdb --query=property | grep -E "ID_SERIAL|ID_MODEL|ID_VENDOR"
你会看到类似:ID_SERIAL=Western_Digital_My_Book_2023_ABC123456789
这一串就是它的唯一指纹,后续规则就靠它匹配。
编写并部署 udev 规则文件
规则文件放在 /etc/udev/rules.d/ 目录下,建议命名为 99-my-disk.rules(数字越大优先级越低,99-确保不被系统默认规则覆盖)。
内容示例(一行写完,无换行):
SUBSYSTEM=="block", ENV{ID_SERIAL}=="Western_Digital_My_Book_2023_ABC123456789", SYMLINK+="disk-mybook"
说明:
-
SUBSYSTEM=="block"限定只匹配块设备,避免误触其他设备 -
ENV{ID_SERIAL}==...是核心匹配条件,确保只对该盘生效 -
SYMLINK+="disk-mybook"创建软链接/dev/disk-mybook,名字可自定义 - 如有多块同型号盘,可追加
ATTRS{idVendor}=="1058", ATTRS{idProduct}=="25a3"进一步缩小范围
加载规则并验证效果
保存文件后,执行三步操作:
- 重载规则:
sudo udevadm control --reload-rules - 触发重评估(无需拔插):
sudo udevadm trigger --subsystem-match=block - 检查链接是否生成:
ls -l /dev/disk-mybook,应显示指向当前实际设备节点(如/dev/sdb)
拔掉再插回磁盘,再次运行 ls -l /dev/disk-mybook,目标应始终指向正确的设备节点,不随 sdX 变化而变化。
更省事的替代方案:直接用系统自带的 by-id 链接
其实 udev 已默认为每块磁盘生成了稳定链接,位于 /dev/disk/by-id/ 下:
ls -l /dev/disk/by-id/usb-Western_Digital_My_Book_2023_ABC123456789-0:0
这类路径本身已具备唯一性和持久性,可直接用于 /etc/fstab 或脚本中,例如:
/dev/disk/by-id/usb-Western_Digital_My_Book_2023_ABC123456789-0:0 /mnt/mybook ext4 defaults 0 0
除非你需要更简短、更易记的别名(如 /dev/disk-mybook),否则无需额外写规则,系统已有现成方案。











