Você também pode usar /proc/partitions
para encontrar essas informações.
Esse arquivo fornece o tamanho em número de blocos que todas as suas partições possuem, mas também fornece as mesmas informações para todos os seus discos.
Eu sei que para um disco no linux, podemos usar comandos como hdparm
ou smartctl
para obter suas informações básicas.
Mas para a implementação desses comandos, acho que todos eles são implementados lendo o arquivo correspondente de um disco no linux. Por exemplo, para obter o tamanho de um dispositivo / dev / sda , podemos usar cat /sys/block/sda/size
em vez de usar o comando hdparm
ou smartctl
. Portanto, a questão é como obter o número de série de um disco lendo diretamente o arquivo correspondente.
Você também pode usar /proc/partitions
para encontrar essas informações.
Esse arquivo fornece o tamanho em número de blocos que todas as suas partições possuem, mas também fornece as mesmas informações para todos os seus discos.
Você pode usar strace para descobrir como o smartctl obtém o número de série de um disco. A linha CMD gosta disso: strace smartctl -a / dev / sda. Talvez seja apenas pegar a serial por ioctl.
Eu só tenho uma chance. Ele recebe o serial por ioctl. Esta é uma saída do 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]=["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]=["%pre%%pre%[%pre%%pre%%pre%ATA 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]=["zB7?70%pre%%pre%%pre%%pre%%pre%?%pre%%pre%%pre%%pre%%pre%%pre%%pre% 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]=["zB7?70%pre%%pre%%pre%%pre%%pre%?%pre%%pre%%pre%%pre%%pre%%pre%%pre% W -DXW11"...], status=00, masked_status=00, sb[0]=[], host_status=0, driver_status=0, resid=0, duration=0, info=0}) = 0
%pre%[%pre%%pre%%pre%ATA 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]=["zB7?70%pre%%pre%%pre%%pre%%pre%?%pre%%pre%%pre%%pre%%pre%%pre%%pre% 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]=["zB7?70%pre%%pre%%pre%%pre%%pre%?%pre%%pre%%pre%%pre%%pre%%pre%%pre% W -DXW11"...], status=00, masked_status=00, sb[0]=[], host_status=0, driver_status=0, resid=0, duration=0, info=0}) = 0