it-swarm.com.de

Suchen Sie alle an einen Linux-Computer angeschlossenen Speichergeräte

Ich muss alle beschreibbaren Speichergeräte finden, die an eine bestimmte Maschine angeschlossen sind, nabhängig davon, ob sie gemountet sind oder nicht.

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

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

106
warren

/proc/partitions listet alle vom System erkannten Blockgeräte und Partitionen auf. Sie können dann versuchen, file -s <device>, um festzustellen, welche Art von Dateisystem auf der Partition vorhanden ist, falls vorhanden.

78
Steve Baker

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

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

[email protected]:~# 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 mount sagt:

[email protected]:~# 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/partitions sagt:

[email protected]:~# cat /proc/partitions
major minor  #blocks  name

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

Randnotiz

Wie fdisk -l Werke würde ich gerne selbst kennenlernen.

70
Maxim Veksler

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 ... anscheinend kann es nicht alles "sehen"

in meinem Beispiel habe ich einen Stick, in den auch ein Kartenleser eingebaut ist, und ich kann mit fdisk nur den Stick 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 file -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)
35
THESorcerer

ls /sys/block

9

Verwendung 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
7
ZungBang

Moderne Linux-Systeme haben normalerweise nur Einträge in/dev für existierende Geräte, so dass das Durchlaufen von hda * und sda *, wie Sie vermuten, ziemlich gut funktioniert.

Andernfalls befindet sich möglicherweise etwas in/proc, das Sie verwenden können. Auf den ersten Blick hätte ich gesagt, dass/proc/partitions genau das tut, was Sie brauchen.

4
Mark Baker

libsysfs sieht möglicherweise nützlich aus, aber nicht direkt aus einem Shell-Skript. Es gibt ein Programm mit dem Namen systool, das tut, was Sie wollen, obwohl es möglicherweise einfacher ist, direkt in/sys zu suchen, als ein anderes Programm zu verwenden, um es für Sie zu tun.

2
Mark Baker