Перечислите символическую ссылку, используя правила udev с udev, который не поддерживает% e - PullRequest
1 голос
/ 03 апреля 2019

Я использую версию udev (на Centos7), которая не поддерживает % e-naming для устройства , но я бы хотел использовать предоставляемую им функцию.

В частности, у меня есть несколько устройств NVME двух разных типов, которые доступны на кластере аппаратного обеспечения, но могут не подключаться к конкретным местам.Я хотел бы перечислить их, чтобы я мог перейти к использованию Ansible или другого инструмента управления для программного разделения, добавления файловой системы и монтирования диска.В частности, я в конечном итоге хотел бы сделать что-то вроде mkfs.ext4 /dev/type1nvme1 -L nvme1 и mkfs.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

Итак, вкратце - есть лиспособ получить% e именование udev для версии, которая его не поддерживает?

...