Я знаю, что для диска в linux мы можем используйте такие команды, как hdparm
или smartctl
, чтобы получить его основную информацию.
Но для реализации этих команд, я думаю, все они реализованы путем чтения соответствующего файла диска в Linux. Например, чтобы получить размер устройства / dev / sda , мы можем использовать cat / sys / block / sda / size
вместо такой команды hdparm
или smartctl
. Итак, вопрос в том, как получить серийный номер диска, напрямую прочитав соответствующий ему файл.
Во-первых, для этого можно использовать команду lsblk. Первый шаг — получить только все устройства SCSI. Также игнорируются все разделы, ведомые устройства и держатели.
~$ lsblk -S
NAME HCTL TYPE VENDOR MODEL REV TRAN
sdb 1:0:1:0 disk Msft Virtual Disk 1.0
sr0 5:0:0:0 rom Msft Virtual CD/ROM 1.0 ata
sdc 3:0:0:10 disk Msft Virtual Disk 1.0
sda 0:0:0:0 disk Msft Virtual Disk 1.0
Затем вы получаете серийный номер для каждого диска
~$ lsblk --nodeps -no serial /dev/sda
600224807cc344ea899e344614ead465
И используйте команду strace , чтобы глубже понять, как lsblk получает серийный номер? Я сделал это, но не уверен, что то, что я вижу, было правильным. Вы можете попробовать это для вас.
lsblk должен иметь возможность искать sysfs-файловую систему для экспорта объектов ядра-путь по основному :второстепенному, что делается с помощью /sys/dev/block.
Также вы можете обратиться к справочной странице sysfs по адресу здесь .
в Linux для диска sda:
egrep '^E:ID_SERIAL' /run/udev/data/b$(basename $(readlink --canonicalize /sys/block/sda/bdi)) E:ID_SERIAL=Samsung_SSD_850_EVO_500GB_S3R3NF0JA99600T E:ID_SERIAL_SHORT=S3R3NF0JA99600T
date && uname --kernel-release Tue Nov 2 11:50:37 AM PDT 2021 5.13.0-20-generic