Я использую версию 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 для версии, которая его не поддерживает?