3.1.4 设备命名与持久化机制

设备命名与持久化机制关注“设备如何被识别、如何在重启或热插拔后保持稳定标识”。内核设备名(如 /dev/sda)受探测顺序影响,不稳定;生产环境应使用持久化路径(by-id/by-uuid/by-label/by-path)完成挂载与自动化。

原理草图(从内核命名到持久化路径):

文章图片

设备命名与持久化类型#

  • 内核命名:/dev/sdX(SATA/SAS/USB)、/dev/nvmeXnY(NVMe)、/dev/vdX(virtio)。不稳定。
  • 分区命名:/dev/sda1/dev/nvme0n1p1(NVMe 使用 p 分隔)。
  • 逻辑设备:/dev/mapper/vg-lv/dev/mdX 相对稳定,但仍依赖底层识别。

关键命令与解释(含示例)#

1)识别设备与持久化路径#

# 查看块设备与文件系统信息(包含 UUID/LABEL)
lsblk -f

# 获取所有设备的 UUID/LABEL
blkid

# 查看某个设备的 udev 属性(持久化信息来源)
udevadm info --query=all --name=/dev/sda | grep -E 'ID_SERIAL|ID_WWN|ID_PATH'

预期效果:能看到 UUID=...LABEL=...ID_SERIAL=...ID_WWN=... 等字段。

2)查看持久化路径目录#

# 按序列号/WWN
ls -l /dev/disk/by-id/

# 按 UUID
ls -l /dev/disk/by-uuid/

# 按标签
ls -l /dev/disk/by-label/

# 按物理路径
ls -l /dev/disk/by-path/

3)使用 UUID/LABEL 配置自动挂载(fstab)#

# 假设 /dev/sdb1 是数据盘
mkfs.ext4 /dev/sdb1
e2label /dev/sdb1 DATA01

# 获取 UUID
UUID=$(blkid -s UUID -o value /dev/sdb1)
echo "UUID=$UUID /data ext4 defaults,noatime 0 2" >> /etc/fstab

# 挂载验证
mkdir -p /data
mount -a
df -h | grep /data

命令解释
- e2label 设置可读标签,便于识别,但需保证唯一。
- UUID= 是最稳定的挂载方式,避免 /dev/sdX 变化导致失败。

持久化策略选择建议#

  • 生产环境:优先 by-idUUID
  • 虚拟化/云环境:优先 UUID,避免磁盘顺序变化。
  • 固定拓扑by-path 适合定位物理槽位。

常见问题与排错#

问题1:重启后设备名变化导致挂载失败#

排查

journalctl -xb | grep -i mount
cat /etc/fstab
ls -l /dev/disk/by-uuid/

处理:将 /etc/fstab/dev/sdX 改为 UUID=LABEL=

问题2:标签冲突导致挂载混乱#

排查

blkid | grep LABEL=

处理

e2label /dev/sdb1 DATA01
e2label /dev/sdc1 DATA02

问题3:热插拔导致磁盘顺序变化#

排查

dmesg | tail -n 50
ls -l /dev/disk/by-id/

处理:在脚本与挂载中改用 by-idUUID

练习#

  1. 新增一块虚拟盘(或使用测试盘),格式化为 ext4,设置 LABEL=DATA01
  2. 使用 UUID 写入 /etc/fstab,执行 mount -a 验证。
  3. 通过 udevadm info 找出该盘的 ID_SERIAL,在脚本中使用 /dev/disk/by-id/ 路径进行校验挂载。
  4. 模拟设备名变化(重启或热插拔),验证挂载不受影响。