首页 > 解决方案 > 使用不支持 %e 的 udev 规则枚举符号链接

问题描述

我使用的 udev 版本(在 Centos7 上)不支持设备的 %e 命名,但我想使用它提供的功能。

具体来说,我有几个 NVME 设备,由两种不同类型组成,它们都可以在硬件集群上使用,但可能无法插入确切的位置。我想列举它们,以便我可以继续使用 Ansible 或其他一些管理工具以编程方式进行分区、添加文件系统和挂载驱动器。具体来说,我最终想做一些类似mkfs.ext4 /dev/type1nvme1 -L nvme1mkfs.ext4 /dev/type2nvme1 -L different_nvme1- 但当然为了做到这一点,我/dev每次都需要将设备放在同一个位置。

我已将此答案视为指南:

https://unix.stackexchange.com/questions/105144/udev-rule-for-assigning-known-symlinks-for-identical-usb-serial-devices

然而,最大的问题是,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 的 %e 命名行为?

标签: linuxansiblefilesystemsudev

解决方案


推荐阅读