LINUX.ORG.RU

Изменить / добавить как симлинк ID блочного устройства

 , , , ,


0

2

Есть приблуда, при подключении через которую диски определяются как usb-External_USB3.0_DISK<slot>_<...>-0:<slot>. К счастью, информация о модели/серийнике/WWN остаётся доступной через hdparm -I. Вопрос: как сделать, чтобы при подключении диска с вышеописанным ID считывалась информация при помощи hdparm (или ещё как-то) и в виде ссылки создавался такой же ID, как при подключении через SATA?

★★★★★

Последнее исправление: sudopacman (всего исправлений: 1)

а сможет ли удев оформить запрос к hdparm :(
имхо написать правило удев чтобы носитель при подключении через сата создавался под левым не sd* именем, к примеру mydisk.
при подключении же по усб, создается файл усб-устройства, потом удев запускается скрипт с hdparm -I (которое натравливается на созданное файл усб-устройства, без файла hdparm не смогет обратиться к усб-устройству) и если идентификатор подключенного по усб носителя совпадает с искомым, то создает симлинк mysdisk -> имя подключенного усб.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 1)

Ну посмотри, как работают правила udev (/usr/lib/udev/rules.d).

TL;DR: При подключении блочного устройства запускается специальный бинарник (на самом деле он builtin, но это не суть важно), который опрашивает диск и выводит информацию о нём в виде типа «переменных окружения», которые можно импортировать в память udevd командой IMPORT. Потом на основе этих переменных отдельными правилами создаются нужные ссылки в /dev/disk/by-*. Разделение механизма и политики, всё как надо.

Тебе нужно просто написать враппер вокруг hdparm, который опрашивает диск через hdparm, парсит его вывод и выводит информацию в нужном формате (т. е. в виде массива KEY=value с теми же именами, которые используются в остальных правилах udev) и запатчить файл с правилами, чтобы для интересующих тебя устройств вызывался не builtin, а твой враппер (а лучше оба, в таком порядке, чтобы данные из твоего враппера брали приоритет).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от intelfx

Ну, на возможность получения переменных из внешних бинарников в правилах udev я особо не надеялся. Поэтому появилась идея зайти с другой стороны и симлинк делать из скрипта, который может вызывать и парсить что угодно. Но я почему-то думал, что просто так создать симлинк в /dev нельзя. А оказалось, что можно. Поэтому должно быть достаточно udev-правилом запускать скрипт, который сам всё будет делать. Или тут есть какие-то подводные?

sudopacman ★★★★★
() автор топика
Последнее исправление: sudopacman (всего исправлений: 1)
Ответ на: комментарий от sudopacman

Там (в udev) «из коробки» есть возможность запустить скрипт и его выхлоп интерпретировать как имена симлинков. Так что вообще по сути делать нечего

Nastishka ★★★★★
()
Ответ на: комментарий от intelfx

Что-то я туплю дико. Не понял сразу, что импортировать переменные из внешних команд в udev всё-таки можно. В общем, сейчас проверил следующее правило:

ENV{DEVTYPE}=="disk",   ENV{ID_BUS}=="usb", ENV{ID_SERIAL}=="External_USB3.0_DISK*", \
  IMPORT{program}="/usr/local/bin/true_id.sh /dev/disk/by-id/usb-$env{ID_SERIAL}", \
  SYMLINK+="disk/by-id/ata-$env{TRUE_ID_SERIAL}", \
  SYMLINK+="disk/by-id/wwn-$env{TRUE_WWN}"

ENV{DEVTYPE}=="partition",  ENV{ID_BUS}=="usb", ENV{ID_SERIAL}=="External_USB3.0_DISK*", \
  IMPORT{program}="/usr/local/bin/true_id.sh /dev/disk/by-id/usb-$env{ID_SERIAL}", \
  SYMLINK+="disk/by-id/ata-$env{TRUE_ID_SERIAL}-part%n", \
  SYMLINK+="disk/by-id/wwn-$env{TRUE_WWN}-part%n"

Всё заработало.

sudopacman ★★★★★
() автор топика
Последнее исправление: sudopacman (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.