Encuentra todos los dispositivos de almacenamiento conectados a una máquina Linux [cerrado]

109

Necesito encontrar todos los dispositivos de almacenamiento de escritura conectados a una máquina determinada, estén o no montados.

La forma tonta de hacer esto sería probar cada entrada /devque corresponda a un dispositivo de escritura ( hd* and sd*) ...

¿Existe una solución mejor o debería seguir con esta?

madriguera
fuente
Utilice libsysfs , la forma recomendada de consultar el kernel sobre dispositivos conectados de todo tipo.
David Schmitt
Ya que hablas de que tal vez se estén montando, supongo que quieres una lista de particiones, no solo de discos.
Mark Baker
las particiones también están bien, sí :) .. si conozco las particiones, también sabré qué dispositivos físicos están disponibles
warren
2
desde Unix y Linux ya está disponible, esta pregunta se debe migrar allí
Warren
3
@warren - oh no. Todavía deberían estar cerrados. Como usted, como propietario de la publicación, desea que esto se mueva, debe marcarlo para que preste atención al moderador. El hecho de que quieras moverlo tendrá cierto peso.
ChrisF

Respuestas:

79

/proc/partitionsenumerará todos los dispositivos de bloque y particiones que reconoce el sistema. Luego puede intentar usar file -s <device>para determinar qué tipo de sistema de archivos está presente en la partición, si lo hay.

Steve Baker
fuente
4
Esto omite unidades de CD / DVD, por ejemplo (sé que generalmente no se pueden escribir)
pixelbeat
Existe una especie de límite en lo que puede hacer desde un caparazón. La mayoría de las otras sugerencias que tienen una calificación más alta no funcionan desde un shell, no funcionarán a menos que dbus se esté ejecutando o enumerarán los dispositivos que en realidad no están presentes / configurados. Esto es más rápido que comprobar todos los dispositivos / dev.
Steve Baker
5
lsblk este es mejor
emj365
1
/ proc / partitions también le da la letra de la unidad en Cygwin.
katriel
72

Siempre puede hacer lo fdisk -lque parece funcionar bastante bien, incluso en configuraciones extrañas como dispositivos EC2 xvda.

Aquí hay un volcado para una instancia m1.large:

root@ip-10-126-247-82:~# fdisk -l

Disk /dev/xvda1: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvda1 doesn't contain a valid partition table

Disk /dev/xvda2: 365.0 GB, 365041287168 bytes
255 heads, 63 sectors/track, 44380 cylinders, total 712971264 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvda2 doesn't contain a valid partition table

Disk /dev/xvda3: 939 MB, 939524096 bytes
255 heads, 63 sectors/track, 114 cylinders, total 1835008 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvda3 doesn't contain a valid partition table

Mientras mountdice:

root@ip-10-126-247-82:~# mount
/dev/xvda1 on / type ext4 (rw)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
/dev/xvda2 on /mnt type ext3 (rw)

Y /proc/partitionsdice:

root@ip-10-126-247-82:~# cat /proc/partitions
major minor  #blocks  name

 202        1   10485760 xvda1
 202        2  356485632 xvda2
 202        3     917504 xvda3

Nota al margen

Cómo fdisk -lfunciona es algo que me encantaría conocer.

Maxim Veksler
fuente
9
No estoy seguro si alguna vez averiguaste cómo fdisk -lfunciona, pero pensé que te gustaría saber: lee /proc/partitionsy luego itera a través del /sys/dev/block/*cual contiene un conjunto de enlaces simbólicos a la verdadera reproducción de los dispositivos en sysfs. Puede encontrar esta información ejecutando fdisken strace:)
1
¡Excelente! Gracias. (OT: apesta ver esta pregunta bloqueada. Debería haber un botón de "votar para revertir el bloqueo").
Maxim Veksler
1
hay para usuarios de 3.000 repeticiones y superiores (un botón "reabrir").
¿Oh enserio? Entonces debo llegar a 3k lo más rápido posible.
Maxim Veksler
sí, consulte la página de privilegios para ver la lista completa de cosas que puede hacer con más representantes.
35

también puedes probar lsblk ... está en util-linux ... pero también tengo una pregunta

fdisk -l /dev/sdl

sin resultados

grep sdl /proc/partitions      
   8      176   15632384 sdl
   8      177   15628288 sdl1

lsblk | grep sdl
sdl       8:176  1  14.9G  0 disk  
`-sdl1    8:177  1  14.9G  0 part  

fdisk es bueno pero no tan bueno ... parece que no puede "ver" todo

en mi ejemplo particular, tengo un palo que también tiene un lector de tarjetas integrado y solo puedo ver el palo usando fdisk:

fdisk -l /dev/sdk

Disk /dev/sdk: 15.9 GB, 15931539456 bytes
255 heads, 63 sectors/track, 1936 cylinders, total 31116288 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xbe24be24

   Device Boot      Start         End      Blocks   Id  System
/dev/sdk1   *        8192    31116287    15554048    c  W95 FAT32 (LBA)

pero no la tarjeta (la tarjeta es / dev / sdl)

además, el archivo -s es ineficiente ...

file -s /dev/sdl1
/dev/sdl1: sticky x86 boot sector, code offset 0x52, OEM-ID "NTFS    ", sectors/cluster 8, reserved sectors 0, Media descriptor 0xf8, heads 255, hidden sectors 8192, dos < 4.0 BootSector (0x0)

eso es lindo ... PERO

fdisk -l /dev/sdb
/dev/sdb1            2048   156301487    78149720   fd  Linux raid autodetect
/dev/sdb2       156301488   160086527     1892520   82  Linux swap / Solaris

file -s /dev/sdb1
/dev/sdb1: sticky \0

para ver información sobre un disco al que no puede acceder fdisk, puede usar parted:

parted /dev/sdl print

Model: Mass Storage Device (scsi)
Disk /dev/sdl: 16.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      4194kB  16.0GB  16.0GB  primary  ntfs




arted /dev/sdb print 
Model: ATA Maxtor 6Y080P0 (scsi)
Disk /dev/sdb: 82.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system     Flags
 1      1049kB  80.0GB  80.0GB  primary                  raid
 2      80.0GB  82.0GB  1938MB  primary  linux-swap(v1)
El hechicero
fuente
9

ls /sys/block

Mihai Limbășan
fuente
no enumera las particiones. No estoy seguro de si eso es lo que quería la pregunta original o no.
Mark Baker
1
Nunca supe sobre / sys / block, aunque también enumera los dispositivos que no se pueden escribir, como la unidad de DVD
warren
1
De hecho, no enumera las particiones; sin embargo, puede verificar los subdirectorios, buscando todos los subdirectorios que contengan como mínimo archivos llamados "dev", "stat" y "uevent" y subdirectorios llamados "holder". Los DVD siguen siendo dispositivos de clase de almacenamiento :)
Mihai Limbășan
3
moocha, ¿por qué no amplías un poco tu respuesta?
SpoonMeiser
2
@warren: presumiblemente / dev / dvd será solo un alias para un dispositivo / dev / sd * o / dev / hd *, por lo que habría tenido este problema de todos modos.
SpoonMeiser
7

Usando HAL (kernel 2.6.17 y superior):


#! /bin/bash
hal-find-by-property --key volume.fsusage --string filesystem |
while read udi ; do
    # ignore optical discs
    if [[ "$(hal-get-property --udi $udi --key volume.is_disc)" == "false" ]]; then
        dev=$(hal-get-property --udi $udi --key block.device)   
        fs=$(hal-get-property --udi $udi --key volume.fstype) 
        echo $dev": "$fs
    fi 
done
ZungBang
fuente
4

Los sistemas Linux modernos normalmente solo tendrán entradas en / dev para los dispositivos que existen, por lo que pasar por hda * y sda * como usted sugiere funcionaría bastante bien.

De lo contrario, puede haber algo en / proc que pueda usar. De un vistazo rápido allí, diría que / proc / partitions parece que podría hacer lo que necesita.

Mark Baker
fuente
2

libsysfs parece potencialmente útil, pero no directamente desde un script de shell. Hay un programa que viene con él llamado systool que hará lo que usted quiera, aunque puede ser más fácil buscar en / sys directamente en lugar de usar otro programa para hacerlo por usted.

Mark Baker
fuente