我正在使用不支持%e naming for a device的udev版本(在Centos7上),但是我想使用它提供的功能。
具体来说,我有几种由两种不同类型组成的NVME设备,它们都可以在硬件群集上使用,但可能没有插入到确切的位置。我想枚举它们,以便可以继续使用Ansible或其他管理工具以编程方式进行分区,添加文件系统并安装驱动器。具体来说,我最终还是想做类似mkfs.ext4 /dev/type1nvme1 -L nvme1
和mkfs.ext4 /dev/type2nvme1 -L different_nvme1
的事情-但是,为了做到这一点,我每次都需要将设备放在相同的/dev
位置。
我已将此答案作为指导:
但是,最大的问题是,udev似乎是多线程的,并且一次枚举了多个设备-因此脚本失败。我有大约18种两种类型的nvme设备,通常只获得其中6或7个的符号链接,而数字却是错误的。这是udev规则,以及我正在使用的脚本:
# all nvme devices
KERNEL=="nvme*[0-9]n*[0-9]", SUBSYSTEMS=="nvme"\
, ATTR{queue/read_ahead_kb}="4096"\
, ATTR{queue/rotational}="0"\
, ATTR{queue/scheduler}="none"
# Better rename type1 cards
KERNEL=="nvme*[0-9]n*[0-9]", ATTRS{model}=="Dell Express Flash PM1725a*"\
, PROGRAM="/usr/local/sbin/unique-num /dev disktype1"\
, SYMLINK+="disktype1%c"
#
# Better rename internal nvme (primary seg) cards
KERNEL=="nvme*[0-9]n*[0-9]", ATTRS{model}=="Dell Express Flash NVMe P4600*"\
, PROGRAM="/usr/local/sbin/unique-num /dev disktype2"\
, SYMLINK+="disktype2 %c"
# cat /usr/local/sbin/unique-num
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Usage: $0 location prefix" >&2
exit 1
fi
location="$1"
prefix="$2"
needindex=1
index=0
while [ $needindex -eq 1 ]
do
if [ ! -e $location/$prefix$index ]; then
needindex=0
echo "$index"
else
(( index++ ))
fi
done
在udevadm trigger
之后:
[root@sdw1 ~]# ls -l /dev/disk_type*
lrwxrwxrwx 1 root root 7 Apr 2 18:56 /dev/disk_type10 -> nvme0n1
lrwxrwxrwx 1 root root 7 Apr 2 18:56 /dev/disk_type11 -> nvme1n1
lrwxrwxrwx 1 root root 7 Apr 2 18:56 /dev/disk_type12 -> nvme2n1
lrwxrwxrwx 1 root root 7 Apr 2 18:56 /dev/disk_type13 -> nvme3n1
lrwxrwxrwx 1 root root 7 Apr 2 18:56 /dev/disk_type14 -> nvme4n1
lrwxrwxrwx 1 root root 7 Apr 2 18:56 /dev/disk_type15 -> nvme9n1
lrwxrwxrwx 1 root root 7 Apr 2 18:56 /dev/disk_type20 -> nvme7n1
lrwxrwxrwx 1 root root 8 Apr 2 18:56 /dev/disk_type21 -> nvme13n1
lrwxrwxrwx 1 root root 8 Apr 2 18:56 /dev/disk_type22 -> nvme16n1
lrwxrwxrwx 1 root root 8 Apr 2 18:56 /dev/disk_type23 -> nvme14n1
因此,简而言之-对于不支持udev的版本,是否有任何方法可以得到udev的%e命名行为?