Ссылки в / dev / disk / by-id создаются udev. В /etc/udev/rules.d/50-udev.rules можно найти такие строки:
KERNEL=="sd*[!0-9]|sr*", SYSFS{ieee1394_id}=="*", ENV{ID_SERIAL}="$sysfs{ieee1394_id}", ENV{ID_BUS}="ieee1394"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/usb_id -x"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/scsi_id -g -x -s %p -d $tempnode"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/scsi_id -g -x -a -s %p -d $tempnode"
KERNEL=="nst[0-9]*|st*|sd*[!0-9]|sr*|dasd*[!0-9]|cciss?c", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}"
К сожалению, найти эту by-id
символическую ссылку из названия устройства нетривиально . Но есть как минимум один прямой путь:
$ udevinfo -q path -n /dev/sda
/block/sda
$ udevinfo -q symlink -p /block/sda
disk/by-id/scsi-SATA_KINGSTON_SVP100_31JY100MY5SK disk/by-path/pci-0000:00:11.0-scsi-0:0:0:0
Список, разделенный пробелами, возвращается. Так что by-id
путь можно найти.
Или Вы можете напрямую получить «составной» серийный номер:
$ udevinfo -q env -p /block/sda
ID_VENDOR=ATA
ID_MODEL=KINGSTON_SVP100S
ID_REVISION=CJR1
ID_SERIAL=SATA_KINGSTON_SVP100_31JY100MY5SK
ID_TYPE=disk
ID_BUS=scsi
ID_PATH=pci-0000:00:11.0-scsi-0:0:0:0
В ID_SERIAL
последнем подчеркивании Вы можете получить серийный номер.
Как я вижу, серийный номер может содержать буквенно-цифровые символы и '-' (у меня есть такие жесткие диски SCSI). Кто-нибудь знает какие-либо ограничения по поводу серийного номера? Если он может содержать '_', то этот метод не является пуленепробиваемым.
ID_MODEL
Ключ может быть использован для локализации более точно начало серийного номера, так как (как мне кажется) его первые 15 символов добавляются к ID_SERIAL
(пробелы заменены на «_»).
udisks --show-info
___ Но следует отметить, что при использовании в пакетном режиме или, как правило, в сценариях,udisks
ПУТЬ медленнее, чемudevadm
.