了解多托架设备中坏驱动器的位置非常重要,但是驱动器的默认命名(例如等/dev/sda
)/dev/sdb
并不能提供特定驱动器的物理位置的线索。
我有一个用于备份的 8 托架外部 JBOD 机箱。它托管一个 ZFS 池并连接到 Arch Linux 机箱。在 Linux 系统上是否可以使用systemd
/udev
而不是 来根据驱动器在机箱中的物理位置命名驱动器/dev/sd*
?
我希望名字能够反映驱动器在机箱中的物理位置 /dev/encl1
, /dev/encl2
... 或类似内容。我希望这些标签默认出现,而不是/dev/sd*
在lsblk
和中出现zpool status
。
lsblk
我确实知道机箱中每个驱动器的位置,并将此信息保存在文件中,但直接使用和其他命令查看它会更好 。
我尝试创建/etc/udev/rules.d
规则
SUBSYSTEM=="block" KERNEL=="sd*" ENV{ID_SERIAL_SHORT}=="ZR5CTR4V" SYMLINK+="encl1"
运行后我确实得到了这样的符号链接udevadm trigger
,但它们并不等同于/dev/sd*
,我无法用它们来替代。
答案1
把我的评论写成答案。
使用命令
lshw -c disk -c storage | grep -E 'bus info|logical name’
将设备名称映射到 pci 设备。设备 ID 将均匀递增,托架 1 的 ID 最小。
您还可以使用它udevadm
来获取设备 ID devices
。
udevadm info --name=/dev/nvme6
现在,您可以根据磁盘设备所安装的物理插槽为其指定名称。编辑或创建/etc/udev/rules.d/my.rules
。您可以使用规则重命名设备。
KERNEL=="nvme*", SUBSYSTEM=="nvme", ENV{PHYSDEVPATH}=="*pci0000:20/0000:20:01.3/0000:25:00.0*", NAME="bay6"
KERNEL=="nvme*", ENV{DEVTYPE}=="partition", SUBSYSTEM=="nvme", ENV{PHYSDEVPATH}=="*pci0000:20/0000:20:01.3/0000:25:00.0*", NAME="bay6p%n"
如果您有 sd 设备或 nvme,请将其更改SUBSYSTEM
为block
。
可以输入别名而不是重命名设备。请参阅SYMLINK+="bay6"
udev 文档。
答案2
这只是对问题的部分回答,它确实可以为 ZFS 提供托架位置信息:
- 我曾经
parted
将 ZFS 分区的标签更改为类似这样的内容:encl1-3DS
第一部分是托架位置,第二部分是驱动器序列的唯一部分。
(parted) p
Model: xxx (scsi)
Disk /dev/sdc: 4001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 4001GB 4001GB encl4-28P
9 4001GB 4001GB 8389kB
zpool export <zpool-name>
zpool import -d /dev/disk/by-partlabel <zpool-name>
现在
zpool status -v
显示
❯ zpool status -v
pool: ext
state: ONLINE
scan: scrub repaired 0B in 05:42:24 with 0 errors on Fri Jan 6 20:15:57 2023
config:
NAME STATE READ WRITE CKSUM
ext ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
encl1-PT8 ONLINE 0 0 0
encl7-C32 ONLINE 0 0 0
encl4-28P ONLINE 0 0 0
encl2-N75 ONLINE 0 0 0
encl5-ZT1 ONLINE 0 0 0
encl6-9RP ONLINE 0 0 0
encl8-88F ONLINE 0 0 0
errors: No known data errors
尚未排序,但已经比/dev/sd*
不过,我还是希望有一个更通用的解决方案,使自定义别名成为默认别名。