Alle an einen Linux-Computer angeschlossenen Speichergeräte finden [geschlossen]

109

Ich muss alle beschreibbaren Speichergeräte finden, die an einen bestimmten Computer angeschlossen sind, unabhängig davon , ob sie bereitgestellt sind oder nicht .

Der blöde Weg, dies zu tun, wäre, jeden Eintrag zu versuchen/dev , der einem beschreibbaren Gerät entspricht ( hd* and sd*) ......

Gibt es eine bessere Lösung oder sollte ich mich an diese halten?

Labyrinth
quelle
Verwenden Sie libsysfs , die empfohlene Methode, um den Kernel nach angeschlossenen Geräten aller Art abzufragen.
David Schmitt
Da Sie davon sprechen, dass sie möglicherweise gemountet werden, möchten Sie wahrscheinlich eine Liste von Partitionen, nicht nur von Festplatten?
Mark Baker
Partitionen sind auch in Ordnung, ja :) .. wenn ich die Partitionen kenne, werde ich auch wissen, welche physischen Geräte verfügbar sind
Warren
2
Da Unix & Linux jetzt verfügbar ist, sollte diese Frage dorthin migriert werden
Warren
3
@ Warren - oh nein. Sie sollten immer noch geschlossen sein. Wenn Sie als Postbesitzer möchten, dass dies verschoben wird, sollten Sie es für die Aufmerksamkeit des Moderators markieren. Die Tatsache, dass Sie möchten, dass es bewegt wird, hat etwas Gewicht.
ChrisF

Antworten:

79

/proc/partitionslistet alle Blockgeräte und Partitionen auf, die das System erkennt. Sie können dann versuchen, mithilfe von file -s <device>zu bestimmen, welche Art von Dateisystem auf der Partition vorhanden ist, falls vorhanden.

Steve Baker
quelle
4
Dies lässt beispielsweise CD / DVD-Laufwerke aus (ich weiß, dass sie normalerweise nicht beschreibbar sind)
Pixelbeat
Es gibt eine Art Grenze für das, was Sie mit einer Shell tun können. Die meisten anderen Vorschläge mit höherer Bewertung funktionieren entweder nicht über eine Shell, funktionieren nur, wenn dbus ausgeführt wird, oder listen Geräte auf, die nicht vorhanden / konfiguriert sind. Dies ist nur schneller als das Überprüfen aller / dev-Geräte.
Steve Baker
5
lsblk das ist besser
emj365
1
/ proc / partitions gibt Ihnen den Laufwerksbuchstaben auch in Cygwin.
Katriel
72

Sie können immer das tun, fdisk -lwas ziemlich gut zu funktionieren scheint, selbst auf seltsamen Setups wie EC2 xvda-Geräten.

Hier ist ein Speicherauszug für eine m1.large-Instanz:

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

Während mountsagt:

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)

Und /proc/partitionssagt:

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

Randnotiz

Wie das fdisk -lfunktioniert, würde ich gerne selbst wissen.

Maxim Veksler
quelle
9
fdisk -lIch bin mir nicht sicher, ob Sie jemals herausgefunden haben, wie es funktioniert, aber ich dachte, Sie möchten es vielleicht wissen: Es liest /proc/partitionsund iteriert dann, /sys/dev/block/*wobei eine Reihe von Symlinks zu den wahren Repräsentanten der Geräte in sysfs enthalten sind. Sie können diese Informationen herausfinden, indem Sie fdiskunter strace:)
1
Toll! Vielen Dank. (OT: Es ist schade, diese Frage gesperrt zu sehen. Es sollte eine Schaltfläche "Abstimmung zum Zurücksetzen der Sperre" geben.)
Maxim Veksler
1
Es gibt für Benutzer von 3k rep und höher (eine "Wiedereröffnung" Schaltfläche).
Ja wirklich? Dann muss ich so schnell wie möglich auf 3k kommen.
Maxim Veksler
Ja, auf der Seite mit den Berechtigungen finden Sie eine vollständige Liste der Dinge, die Sie mit mehr Wiederholungen tun können.
35

Sie können auch versuchen, lsblk ... ist in Util-Linux ... aber ich habe auch eine Frage

fdisk -l /dev/sdl

kein Ergebnis

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 ist gut, aber nicht so gut ... scheint nicht alles "sehen" zu können

In meinem Beispiel habe ich einen Stick, in den auch ein Kartenleser eingebaut ist, und ich kann nur den Stick mit fdisk sehen:

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)

aber nicht die Karte (Karte ist / dev / sdl)

Außerdem ist die Datei -s ineffizient ...

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)

das ist schön ... ABER

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

Um Informationen zu einer Festplatte anzuzeigen, auf die fdisk nicht zugreifen kann, können Sie parted verwenden:

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)
Der Zauberer
quelle
9

ls /sys/block

Mihai Limbășan
quelle
listet keine Partitionen auf. Ich bin mir nicht sicher, ob die ursprüngliche Frage dies wollte oder nicht.
Mark Baker
1
Ich wusste nie über / sys / block - obwohl es auch Listen - Geräte , die nicht beschreibbar, wie das DVD - Laufwerk sind
warren
1
In der Tat werden keine Partitionen aufgelistet. Sie können jedoch die Unterverzeichnisse überprüfen und nach allen Unterverzeichnissen suchen, die mindestens Dateien mit den Namen "dev", "stat" und "uevent" sowie Unterverzeichnisse mit dem Namen "Inhaber" enthalten. DVDs sind immer noch Geräte der Speicherklasse :)
Mihai Limbășan
3
Moocha, warum erweitern Sie Ihre Antwort nicht ein bisschen?
SpoonMeiser
2
@warren - vermutlich ist / dev / dvd nur ein Alias ​​für ein / dev / sd * - oder / dev / hd * -Gerät, also hätten Sie dieses Problem trotzdem gehabt.
SpoonMeiser
7

Verwenden von HAL (Kernel 2.6.17 und höher):


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

Moderne Linux-Systeme haben normalerweise nur Einträge in / dev für vorhandene Geräte. Wenn Sie also hda * und sda * durchlaufen, wie Sie vorschlagen, funktioniert dies ziemlich gut.

Andernfalls befindet sich möglicherweise etwas in / proc, das Sie verwenden können. Von einem kurzen Blick dort hätte ich gesagt, dass / proc / partitions so aussieht, als könnte es das tun, was Sie brauchen.

Mark Baker
quelle
2

libsysfs sieht möglicherweise nützlich aus, jedoch nicht direkt aus einem Shell-Skript. Im Lieferumfang ist ein Programm namens systool enthalten, das genau das tut, was Sie möchten. Es ist jedoch möglicherweise einfacher, direkt in / sys zu schauen, als ein anderes Programm zu verwenden, um dies für Sie zu tun.

Mark Baker
quelle