Rechercher tous les périphériques de stockage connectés à une machine Linux [fermé]


109

J'ai besoin de trouver tous les périphériques de stockage inscriptibles attachés à une machine donnée, qu'ils soient montés ou non .

La meilleure façon de faire cela serait d' essayer chaque entrée /devqui correspond à un périphérique inscriptible ( hd* and sd*) ......

Existe-t-il une meilleure solution ou devrais-je m'en tenir à celle-ci?


Utilisez libsysfs , la méthode recommandée pour interroger le noyau sur les périphériques connectés de toutes sortes.
David Schmitt

Puisque vous parlez de leur montage, je suppose que vous voulez une liste de partitions, pas seulement de disques?
Mark Baker

les partitions sont bien aussi, oui :) .. si je connais les partitions, je saurai aussi quels périphériques physiques sont disponibles
warren

2
comme Unix & Linux est maintenant disponible, cette question devrait y être migrée
warren

3
@warren - oh non. Ils devraient toujours être fermés. Comme vous, en tant que propriétaire du message, souhaitez que ce soit déplacé, vous devez le signaler à l'attention du modérateur. Le fait que vous vouliez le déplacer aura un certain poids.
ChrisF

Réponses:


79

/proc/partitionslistera tous les périphériques de bloc et les partitions que le système reconnaît. Vous pouvez ensuite essayer d'utiliser file -s <device>pour déterminer le type de système de fichiers présent sur la partition, le cas échéant.


4
Cela omet les lecteurs de CD / DVD par exemple (je sais qu'ils ne sont généralement pas inscriptibles)
pixelbeat

Il y a une sorte de limite à ce que vous pouvez faire à partir d'un shell. La plupart des autres suggestions qui sont mieux notées ne fonctionnent pas à partir d'un shell, ne fonctionneront que si dbus est en cours d'exécution, ou répertorieront les périphériques qui ne sont pas réellement présents / configurés. C'est juste plus rapide que de vérifier tous les périphériques / dev.
Steve Baker

5
lsblk celui-ci est meilleur
emj365

1
/ proc / partitions vous donne également la lettre de lecteur dans Cygwin.
katriel

72

Vous pouvez toujours faire fdisk -lce qui semble fonctionner plutôt bien, même sur des configurations étranges telles que les appareils EC2 xvda.

Voici un vidage pour une instance 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

Alors que mountdit:

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)

Et /proc/partitionsdit:

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

Note d'accompagnement

Comment fdisk -lfonctionne est quelque chose que j'aimerais connaître moi-même.


9
Je ne sais pas si vous avez déjà compris comment cela fdisk -lfonctionne, mais j'ai pensé que vous aimeriez le savoir: il lit /proc/partitionspuis itère à travers /sys/dev/block/*lequel contient un ensemble de liens symboliques vers la vraie reprographie des périphériques dans sysfs. Vous pouvez trouver ces informations en courant fdisksous strace:)

1
Génial! Merci. (OT: ça craint de voir cette question verrouillée. Il devrait y avoir un bouton "voter pour rétablir le verrouillage").
Maxim Veksler

1
il y a pour les utilisateurs de 3k rep et plus (un bouton "rouvrir").

Oh vraiment? Ensuite, je dois arriver à 3k aussi vite que possible.
Maxim Veksler

oui, consultez la page des privilèges pour la liste complète des choses que vous pouvez faire avec plus de représentants.

35

vous pouvez aussi essayer lsblk ... est dans util-linux ... mais j'ai aussi une question

fdisk -l /dev/sdl

pas de résultat

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 est bon mais pas si bon ... il semble qu'il ne peut pas tout "voir"

dans mon exemple particulier, j'ai un bâton qui a également un lecteur de carte intégré et je ne peux voir que le bâton en utilisant 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)

mais pas la carte (la carte étant / dev / sdl)

aussi, file -s est inefficace ...

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)

c'est sympa ... MAIS

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

pour afficher des informations sur un disque auquel fdisk ne peut pas accéder, vous pouvez utiliser 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


ne répertorie pas les partitions. Je ne sais pas si c'est ce que la question initiale voulait ou non.
Mark Baker

1
Je n'ai jamais connu / sys / block - bien qu'il répertorie également les périphériques qui ne sont pas inscriptibles, comme le lecteur de DVD
warren

1
En effet, il ne répertorie pas les partitions - vous pouvez cependant vérifier les sous-répertoires, en recherchant tous les sous-répertoires contenant au minimum des fichiers nommés "dev", "stat" et "uevent" et des sous-répertoires nommés "détenteurs". Les DVD sont toujours des périphériques de stockage :)
Mihai Limbășan

3
moocha, pourquoi ne développez-vous pas un peu votre réponse?
SpoonMeiser

2
@warren - probablement / dev / dvd sera juste un alias pour un périphérique / dev / sd * ou / dev / hd *, donc vous auriez eu ce problème de toute façon.
SpoonMeiser

7

Utilisation de HAL (noyau 2.6.17 et supérieur):


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

Les systèmes Linux modernes n'auront normalement que des entrées dans / dev pour les périphériques existants, donc passer par hda * et sda * comme vous le suggérez fonctionnerait assez bien.

Sinon, vous pouvez utiliser quelque chose dans / proc. D'un coup d'œil rapide là-dedans, j'aurais dit que / proc / partitions semble pouvoir faire ce dont vous avez besoin.


2

libsysfs semble potentiellement utile, mais pas directement à partir d'un script shell. Il y a un programme qui l'accompagne appelé systool qui fera ce que vous voulez, bien qu'il puisse être plus facile de simplement regarder directement dans / sys plutôt que d'utiliser un autre programme pour le faire pour vous.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.