我知道,对于linux中的磁盘,我们可以使用诸如hdparm或smartctl之类的命令来获取它的基本信息。但是对于这些命令的实现,我认为所有这些命令都是通过在linux中读取相应的磁盘文件来实现的。例如,要获得设备/dev/sda的大小,我们可以使用cat /sys/block/sda/size而不是使用hdparm或smartctl命令。因此,问题是如何通过直接读取磁盘的相应文件来获取磁盘的序列号。
发布于 2015-11-30 08:33:57
我只是试一试。它确实通过ioctl获得了序列。这是strace的一些输出:
open("/dev/sda", O_RDONLY|O_NONBLOCK) = 3
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
ioctl(3, SG_IO, {'S', SG_DXFER_FROM_DEV, cmd[6]=[12, 00, 00, 00, 24, 00], mx_sb_len=32, iovec_count=0, dxfer_len=36, timeout=20000, flags=0, data[36]=["\0\0\5\2[\0\0\0ATA WDC WD5000LPVX-0"...], status=00, masked_status=00, sb[0]=[], host_status=0, driver_status=0, resid=0, duration=0, info=0}) = 0
ioctl(3, SG_IO, {'S', SG_DXFER_FROM_DEV, cmd[16]=[85, 08, 0e, 00, 00, 00, 01, 00, 00, 00, 00, 00, 00, 00, ec, 00], mx_sb_len=32, iovec_count=0, dxfer_len=512, timeout=20000, flags=0, data[512]=["zB\377?7\310\20\0\0\0\0\0?\0\0\0\0\0\0\0 W -DXW11"...], status=00, masked_status=00, sb[0]=[], host_status=0, driver_status=0, resid=0, duration=0, info=0}) = 0
ioctl(3, SG_IO, {'S', SG_DXFER_FROM_DEV, cmd[16]=[85, 08, 0e, 00, 00, 00, 01, 00, 00, 00, 00, 00, 00, 00, ec, 00], mx_sb_len=32, iovec_count=0, dxfer_len=512, timeout=20000, flags=0, data[512]=["zB\377?7\310\20\0\0\0\0\0?\0\0\0\0\0\0\0 W -DXW11"...], status=00, masked_status=00, sb[0]=[], host_status=0, driver_status=0, resid=0, duration=0, info=0}) = 0发布于 2015-11-30 08:28:03
您可以使用strace来查找smartctl如何获取磁盘的序列号。CMD线喜欢这样: strace -a /dev/sda。也许它只是通过ioctl得到了系列。
发布于 2015-11-30 04:56:22
您还可以使用/proc/partitions查找该信息。
该文件给出了所有分区的块大小,但也为整个磁盘提供了相同的信息。
https://unix.stackexchange.com/questions/246307
复制相似问题