Назад | Перейти на главную страницу

Серийный номер жесткого диска Linux без полномочий root

Прежде всего, я хотел бы извиниться за заголовок, который не включает детали оборудования. Это потому, что я ищу команду, которая будет работать во всех дистрибутивах Linux.

Вопрос:

Я новичок в Linux и мало что знаю, однако можно ли получить серийный номер жесткого диска, работающего без полномочий root. Я знаю, что есть команды для получения этой информации с помощью sudo. Однако мне нужен способ получить эту информацию без использования sudo.

Будем очень признательны за любые предложения.

С уважением,

Мустафа

В большинстве современных дистрибутивов серийные номера жестких дисков хранятся в базе данных udev, которую можно запросить без прав root:

/sbin/udevadm info --query=property --name=sda

(искать ID_SERIAL, ID_SERIAL_SHORT; это также /dev/disk/by-id/ata-* символические ссылки для дисков ATA на основе этих значений).

udisks обеспечивает интерфейс более высокого уровня для этих данных и многого другого (он также предоставляет доступ к атрибутам SMART, не требуя привилегий root, которые могут потребоваться для вызова, например, smartctl напрямую).

Другой способ, который обычно работает:

ls -l /dev/disk/by-id/

Вот один вкладыш, который дает вам быстрый список дисков и модели / серийного номера:

ls -l /dev/disk/by-id/ | grep scsi- | grep -v part | awk '{print $NF " " $(NF-2)}' | sed 's|../../||g' | sed 's/scsi-...._//g'  

Или для удаленных машин:

ssh $host "ls -l /dev/disk/by-id/ | grep scsi- | grep -v part | awk '{print \$NF \" \" \$(NF-2)}' | sed 's|../../||g' | sed 's/scsi-...._//g'"

Затем вы можете продолжить обработку этого вывода. Для большинства типов дисков вторая строка в строке - MODEL_SERIAL.

Как сказал womble, без root-доступа или предоставления root-подобных разрешений для какого-либо процесса вы не можете этого добиться. Однако, поскольку вы говорите, что вы новичок, позвольте мне отметить вас об удобной команде под названием lshw.

Вы не можете этого добиться, если не предоставить права доступа root для некоторого процесса. Даже с правами root вы не можете сделать это на некоторых конфигурациях оборудования.

Ссылки в / 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 (пробелы заменены на '_').