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

15

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

Вопрос:

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

Любые предложения будут высоко оценены.

С уважением,

Мустафа

Mustafa
источник

Ответы:

19

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

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

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

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

Сергей Власов
источник
Вы правы, только что попробовали. udisks --show-info___ Но следует отметить, что при использовании в пакетном режиме или, как правило, в сценариях, udisksПУТЬ медленнее, чем udevadm.
syntaxerror
6

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

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.

Chriswall
источник
2

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

Янне Пиккарайнен
источник
Спасибо вам и Уомблу, и вам это очень понравилось. Я исследую команду, которую вы упомянули.
1

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

ombble
источник
Спасибо за ваш быстрый ответ Womble. Я попробую.
Мустафа
0

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

TrueY
источник
"Udevinfo" не работал для меня здесь, на Ubuntu. Тем не менее, следующий однострочный текст сделал именно то, что я хотел: udevadm info -q property -xn sda | awk -F\' '/ID_SERIAL_SHORT/{print $2}'Конечно, это -q propertyможно не учитывать, но я всегда думаю, что это пустая трата ресурсов, чтобы udevadmвывести дополнительные строки, которые нам вообще не нужны.
syntaxerror