
Я пытаюсь настроить udev в RHEL7 так, чтобы USB-флеш-накопителям назначались определенные имена /dev (например, /dev/backup1, /dev/backup2....) для определенных флэш-накопителей. Я понимаю, что не могу контролировать назначения /dev/sdx, но пытаюсь настроить автоматические символические ссылки с помощью правил udev.
blkid дает мне:
/dev/sdi1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
/dev/sdj1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
/dev/sdk1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
Я хотел сделать что-то вроде: в моем файле правил
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id --whitelisted --replace-whitespace --device=%N", RESULT=="64A5-F009", SYMLINK+="backupkeya%n"
но поскольку все три usb-флешки имеют одинаковый uuid - я хотел, чтобы определенные флешки были связаны с определенными именами виртуальных устройств. Поэтому, если я подключу ту, которая называется "drive2", она будет связана с /dev/backupkeyb. Сейчас у нас есть 3 флешки - но мы хотим расширить их примерно до 8.
udevadm придает мне некоторую уникальность...
[root@alpha2 mnt]# udevadm info /dev/sdg | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0305119070014252
[root@alpha2 mnt]# udevadm info /dev/sdi | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0330219070015017
[root@alpha2 mnt]# udevadm info /dev/sdj | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0305119070014208
Я изменил правило udev следующим образом (/etc/udev/rules.d/99-symlink.rules)
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/bin/udevadm info --name=%N", RESULT=="0305119070014208", SYMLINK+="backupkeyc%n"
Однако, когда я вставил ключ с серийным номером ...4208 - не было создано символической ссылки /dev/backupkeyc. Я подозреваю, что это потому, что вывод оператора udevadm не был точным совпадением с моим RESULT==
Я создал скрипт /usr/local/udevinfo и изменил PROGRAM=="/usr/local/udevinfo %N", как показано ниже, чтобы не загромождать правило udev... после того, как я вставил флэш-накопитель - никакой символической ссылки - но, что более важно, в /tmp/passeddata не было ничего, что должно было бы содержать имя устройства - так что, похоже, правило udev так и не было запущено?
echo "$1" >> /tmp/passeddata
udevadm info --name=$1 | grep "ID_SERIAL_SHORT" | awk -F= '{print $2}'
Я что-то упускаю? Есть ли более простой способ сделать то, что я пытаюсь сделать?
решение1
Да, это не точное совпадение, потому что «udevadm info» выводит целый ряд информации, а не только серийный номер.
Однако все, что вы видите в 'udevadm info',установить с помощьюudev управляет сам (часто вызывая встроенные функции udev). Таким образом, серийный номер уже можно использовать ENV{ID_SERIAL_SHORT}=="..."
без необходимости вызова внешней программы. (Именно на это и указывает префикс "E:".)
KERNEL=="sd*", SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="0305119070014208", SYMLINK+="backupkeyc"
(На самом деле, возможно, что «udevadm info» не сработаетсовсемво время обработки правил. Распространенной ошибкой в правилах udev является попытка использовать инструменты, которые сами получают информацию только из сигналов «правила завершены».)
решение2
Я полностью согласен с ответом @grawity о том, что для такого решения не следует использовать скрипт, а непосредственно env. Но что касается других аспектов:
Синтаксис для программы правильный, как Вы написали, и работает. Может быть, Вы имеете в виду, что в файле нет ничего, что не создает файл? Значит, отсутствует строка shebang (как в Вашем фрагменте) или разрешения на выполнение? В противном случае это должно работать таким образом - И Вам даже не нужно передавать никаких аргументов, так как вся информация, о которой знает udev, доступна в среде в виде переменных. Поэтому скрипт может получить к ним доступ при вызове оператором PROGRAM правила udev.
Но гораздо удобнее и универсальнее следовать другому подходу:
не используйте серийные номера устройства, а назначайте им UUID или метку раздела (или и то, и другое, чтобы снизить вероятность вставки чего-либо еще с таким же UUID или меткой раздела). Поэтому просто переименуйте разделы или переформатируйте их, чтобы получить новый «UUID». Также можно исправить информацию об UUID в существующем разделе, если вы не хотите переформатировать (я не знаю об инструменте, который делает это за вас, но написать свой собственный очень просто).
Таким образом, вы можете заменить цели, не изменяя свою систему. Или, например, добавить больше планок в пул.
В этом случае вы даже можете предпочесть использовать небольшой скрипт PROGRAM, который преобразует метку раздела определенного формата в имя символической ссылки определенного формата.
Другой (если это осуществимо, наиболее стандартный соответствующий способ) может заключаться в использовании GPT на устройствах и назначении определенной комбинации типа раздела и -UUID для вашего варианта использования - возможно, дополнительного имени раздела.