Número de serie del disco duro de Linux como no root

15

En primer lugar, me gustaría pedir disculpas por el título por no incluir detalles del hardware. Esto se debe a que estoy buscando un comando que funcione en toda la distribución de Linux.

Pregunta:

Soy muy nuevo en Linux y no sé mucho, sin embargo, ¿es posible recuperar el número de serie del disco duro que se ejecuta como no root? Soy consciente de que hay comandos disponibles para recuperar esta información que se ejecuta mediante sudo. Sin embargo, necesito una forma de recuperar esta información sin ejecutar como sudo.

Cualquier sugerencia sería muy apreciada.

Saludos cordiales,

Mustafa

mustafa
fuente

Respuestas:

19

En la mayoría de las distribuciones actuales, los números de serie del HDD se almacenan en la base de datos udev, que se puede consultar sin permisos de root:

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

(busque ID_SERIAL, ID_SERIAL_SHORTtambién hay /dev/disk/by-id/ata-*enlaces simbólicos para unidades ATA basadas en esos valores).

udisksproporciona una interfaz de nivel superior para esos datos y más (también proporciona acceso a atributos SMART sin requerir privilegios de root, que serían necesarios para llamar, por ejemplo, smartctldirectamente).

Sergey Vlasov
fuente
Tienes razón, acabo de probar udisks --show-info.__ Pero__ debe tenerse en cuenta que cuando se usa en modo por lotes o generalmente en scripts, udiskses MUCHO más lento que udevadm.
syntaxerror
6

Otra forma en que generalmente funciona es:

ls -l /dev/disk/by-id/

Aquí hay un revestimiento que le brinda una enumeración rápida de la unidad y el número de modelo / serie:

ls -l /dev/disk/by-id/ | grep scsi- | grep -v part | awk '{print $NF " " $(NF-2)}' | sed 's|../../||g' | sed 's/scsi-...._//g'  

O para máquinas remotas:

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'"

Luego puede procesar aún más esta salida. Para la mayoría de los tipos de unidades, la segunda cadena por línea es MODEL_SERIAL.

Chriswall
fuente
2

Como dijo womble, sin acceso de root o sin otorgar permisos de tipo root a algún proceso, no puede lograr esto. Sin embargo, como usted dice que es un novato, permítame señalarle acerca de un comando útil llamado lshw.

Janne Pikkarainen
fuente
Gracias a Womble y a ti mismo, muy apreciado. Investigaré el comando que mencionaste.
1

A falta de otorgar permisos de tipo raíz a algún proceso, no puede lograr esto. Incluso como root no puedes hacerlo en algunas configuraciones de hardware.

womble
fuente
Gracias por su rápida respuesta Womble. Lo intentaré.
mustafa
0

Los enlaces bajo / dev / disk / by-id son creados por udev. En /etc/udev/rules.d/50-udev.rules se pueden encontrar estas líneas:

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}"

Lamentablemente, no es trivial descubrir este by-idenlace simbólico a partir del nombre del dispositivo. Pero hay al menos una forma directa:

$ 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

Se devuelve una lista separada por espacios. Entonces el by-idcamino se puede encontrar.

O puede obtener directamente el número de serie "compuesto":

$ 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

En el ID_SERIALdespués de la última subrayado Usted puede obtener el número de serie.

Como veo, un número de serie puede contener caracteres alfanuméricos y '-' (tengo tales discos duros SCSI). ¿Alguien sabe alguna limitación sobre el número de serie? Si puede contener '_', este método no es a prueba de balas.

La ID_MODELclave podría usarse para localizar con mayor precisión el comienzo del número de serie, ya que (me parece) sus primeros 15 caracteres se agregan a ID_SERIAL(espacios reemplazados por '_').

Verdad
fuente
"udevinfo" no funcionó para mí aquí en Ubuntu. Sin embargo, la siguiente línea hizo exactamente lo que quería: por udevadm info -q property -xn sda | awk -F\' '/ID_SERIAL_SHORT/{print $2}'supuesto, -q propertyse puede omitir, pero siempre creo que es un desperdicio de recursos dejar udevadmsalir líneas adicionales que no necesitamos en absoluto.
syntaxerror