Como obter o Número de Série de um disco pelo arquivo correspondente no linux?

0

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.

    
por Jin Cai 30.11.2015 / 03:41

3 respostas

0

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.

    
por 30.11.2015 / 05:56
0

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.

    
por 30.11.2015 / 09:28
0

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
    
por 30.11.2015 / 09:33