Trova tutti i dispositivi di archiviazione collegati a una macchina Linux [chiuso]


109

Ho bisogno di trovare tutti i dispositivi di archiviazione scrivibili collegati a una data macchina, indipendentemente dal fatto che siano montati o meno .

Il modo stupido per farlo sarebbe provare ogni voce /devche corrisponde a un dispositivo scrivibile ( hd* and sd*) ...

C'è una soluzione migliore o dovrei restare con questa?


Usa libsysfs , il modo consigliato per interrogare il kernel sui dispositivi collegati di tutti i tipi.
David Schmitt

Dato che parli di loro che potrebbero essere montati, immagino che tu voglia un elenco di partizioni, non solo di dischi?
Mark Baker

anche le partizioni vanno bene, sì :) .. se conosco le partizioni, saprò anche quali dispositivi fisici sono disponibili
warren

2
poiché Unix e Linux sono ora disponibili, questa domanda dovrebbe essere migrata lì
warren

3
@warren - oh no. Dovrebbero comunque essere chiusi. Poiché tu, come proprietario del post, desideri che questo venga spostato, dovresti segnalarlo all'attenzione del moderatore. Il fatto che lo desideri spostare avrà un certo peso.
ChrisF

Risposte:


79

/proc/partitionselencherà tutti i dispositivi a blocchi e le partizioni che il sistema riconosce. Puoi quindi provare a utilizzare file -s <device>per determinare quale tipo di filesystem è presente nella partizione, se presente.


4
Ciò ommette le unità CD / DVD ad esempio (so che di solito non sono scrivibili)
pixelbeat

C'è una specie di limite a ciò che puoi fare da una shell. La maggior parte degli altri suggerimenti che hanno un punteggio più alto o non funzionano da una shell, non funzioneranno a meno che dbus non sia in esecuzione, o elencheranno i dispositivi che non sono effettivamente presenti / configurati. Questo è solo più veloce del controllo di tutti i dispositivi / dev.
Steve Baker

5
lsblk questo è meglio
emj365

1
/ proc / partitions ti fornisce anche la lettera di unità in Cygwin.
katriel

72

Puoi sempre fare ciò fdisk -lche sembra funzionare abbastanza bene, anche su configurazioni strane come i dispositivi EC2 xvda.

Ecco un dump per un'istanza 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

Mentre 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)

E /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 a margine

Come fdisk -lfunziona è qualcosa che mi piacerebbe conoscere io stesso.


9
Non sono sicuro che tu abbia mai capito come fdisk -lfunziona, ma ho pensato che ti sarebbe piaciuto saperlo: legge /proc/partitionse quindi itera attraverso il /sys/dev/block/*quale contiene una serie di collegamenti simbolici alla vera riproduzione dei dispositivi in ​​sysfs. È possibile trovare queste informazioni eseguendo fdisksotto strace:)

1
Grande! Grazie. (OT: Fa schifo vedere questa domanda bloccata. Dovrebbe esserci un pulsante "vota per ripristinare il blocco").
Maxim Veksler

1
c'è per gli utenti di 3k rep e superiori (un pulsante "riapri").

Oh veramente? Quindi devo arrivare a 3k il più velocemente possibile.
Maxim Veksler

sì, vedi la pagina dei privilegi per l'elenco completo delle cose che puoi fare con più rappresentanti.

35

puoi anche provare lsblk ... è in util-linux ... ma ho anche una domanda

fdisk -l /dev/sdl

nessun risultato

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 è buono ma non così buono ... sembra che non possa "vedere" tutto

nel mio esempio particolare ho una chiavetta che ha anche un lettore di schede integrato e posso vedere solo la chiavetta 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)

ma non la scheda (la scheda è / dev / sdl)

inoltre, file -s è inefficiente ...

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)

è carino ... MA

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

per vedere le informazioni su un disco a cui non è possibile accedere da fdisk, puoi usare 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)

9

ls /sys/block


non elenca le partizioni. Non sono sicuro se questo fosse ciò che la domanda originale voleva o meno.
Mark Baker

1
Non ho mai saputo di / sys / block, sebbene elenchi anche i dispositivi che non sono scrivibili, come l'unità DVD
warren

1
Effettivamente non elenca le partizioni - puoi controllare le sottodirectory, cercando tutte le sottodirectory che contengono al minimo i file denominati "dev", "stat" e "uevent" e le sottodirectory denominate "holder". I DVD sono ancora dispositivi di archiviazione :)
Mihai Limbășan

3
moocha, perché non espandi un po 'la tua risposta?
SpoonMeiser

2
@warren - presumibilmente / dev / dvd sarà solo un alias per un dispositivo / dev / sd * o / dev / hd *, quindi avresti comunque avuto questo problema.
SpoonMeiser

7

Utilizzando HAL (kernel 2.6.17 e versioni successive):


#! /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

4

I moderni sistemi Linux normalmente hanno solo voci in / dev per i dispositivi esistenti, quindi passare attraverso hda * e sda ​​* come suggerisci funzionerebbe abbastanza bene.

Altrimenti, potrebbe esserci qualcosa in / proc che puoi usare. Da una rapida occhiata lì, avrei detto che / proc / partitions sembra che potrebbe fare quello che ti serve.


2

libsysfs sembra potenzialmente utile, ma non direttamente da uno script di shell. C'è un programma che viene fornito con esso chiamato systool che farà quello che vuoi, anche se potrebbe essere più semplice cercare direttamente in / sys piuttosto che usare un altro programma per farlo per te.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.