Was ist der beste Weg, um Informationen über aktuell nicht gemountete Laufwerke zu erhalten?

38

Zunächst die Situation: Ich habe einen Linux-Computer mit zwei eSATA-Laufwerkschächten, die austauschbare SSD-Laufwerke unterstützen. Ich versuche, eine kleine GUI-Anwendung zu schreiben, die es dem Benutzer erleichtert, die Laufwerke, die er in diese Einschübe legt, zu mounten / zu entmounten / zu formatieren / zu sichern / usw.

Es funktioniert meistens alles. Ein kleines Problem ist jedoch, dass ich erst nach erfolgreicher Bereitstellung der Laufwerke herausfinden kann, was sich auf den eingelegten Laufwerken befindet.

Wenn der Benutzer beispielsweise ein Laufwerk einfügt, das ich nicht bereitstellen kann (z. B. weil es nicht formatiert ist oder mit einem unerwarteten Dateisystem formatiert wurde), kann meine App nur sagen, dass das Bereitstellen des Laufwerks fehlgeschlagen ist.

Dies ist nicht sehr zufriedenstellend, da der Benutzer das Laufwerk wahrscheinlich formatieren möchte, wenn es nicht formatiert ist. Wenn das Laufwerk jedoch Daten aus einem nicht erkannten Dateisystem enthält, möchte der Benutzer es wahrscheinlich NICHT formatieren Zumindest möchte ich ihn warnen können, dass er auf diese Weise potenziell wertvolle Daten löscht.

Meine Frage lautet also: Gibt es eine Methode zum Abfragen einiger grundlegender Informationen (insbesondere des Dateisystemtyps) von einem Laufwerk, für die es nicht erforderlich ist, dass das Laufwerk bereits bereitgestellt ist? Oder muss ich nur versuchen, es mit verschiedenen bekannten Dateisystemen zu mounten, bis einer der Mount-Versuche erfolgreich war, und eine vage Meldung "Sei vorsichtig" ausgeben, wenn keiner von ihnen dies tut?

Falls es darauf ankommt, sind die Pfade, die ich verwende, um die Laufwerke in den Laufwerksschächten zu mounten:

/dev/disk/by-path/pci-0000:00:1f.2-scsi-2:0:0:0
/dev/disk/by-path/pci-0000:00:1f.2-scsi-1:0:0:0
Jeremy Friesner
quelle

Antworten:

55

Wenn die Laufwerke nicht gemountet sind, können Sie verschiedene Aktionen ausführen.

Sie können einen Befehl wie fdisk -loder verwenden, sfdisk -lum die Partitionen aufzulisten. Nur der Partitionstyp kann einige nützliche Informationen liefern, wenn die Partitionen korrekt eingerichtet wurden

# sfdisk -l

Disk /dev/sda: 4177 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sda1   *      0+     30      31-    248976   83  Linux
/dev/sda2         31    4176    4146   33302745   8e  Linux LVM
/dev/sda3          0       -       0          0    0  Empty
/dev/sda4          0       -       0          0    0  Empty

Wenn es auf Ihrem System vorhanden ist, können Sie den Befehl vol_idfür eine Partition verwenden, um einige nützliche Details zurückzugeben (Teil des udev-Pakets unter Debian). Hier erfahren Sie in der Regel, welches Dateisystem tatsächlich verwendet wird.

# vol_id /dev/sda1

ID_FS_USAGE=filesystem
ID_FS_TYPE=ext3
ID_FS_VERSION=1.0
ID_FS_UUID=32c44d53-9025-4d10-8f36-75c166547bd5
ID_FS_UUID_ENC=32c44d53-9025-4d10-8f36-75c166547bd5
ID_FS_LABEL=
ID_FS_LABEL_ENC=
ID_FS_LABEL_SAFE=

Der Befehl lshw -class diskgibt Ihnen einige Details zum Laufwerkstyp. Sie können diese Option verwenden, wenn Sie sich für die tatsächliche Seriennummer des Laufwerks interessieren.

# lshw -class disk

  *-disk
       description: ATA Disk
       product: VBOX HARDDISK
       physical id: 0.0.0
       bus info: scsi@0:0.0.0
       logical name: /dev/sda
       version: 1.0
       serial: VB169e93fb-d1e0fd97
       size: 32GiB (34GB)
       capabilities: partitioned partitioned:dos
       configuration: ansiversion=5 signature=000d39f8

Wenn Sie sicher sind, dass ein bestimmtes Dateisystem wie ext2 / 3 vorhanden ist, können Sie mit dem dateisystemspezifischen Tool tune2fs weitere Details untersuchen.

# tune2fs -l /dev/sda1

tune2fs 1.41.3 (12-Oct-2008)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          8cbdf102-05c7-4ae4-96ea-681cf9b11914
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      filetype sparse_super
Default mount options:    (none)
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              124496
Block count:              248976
Reserved block count:     12448
Free blocks:              212961
Free inodes:              124467
First block:              1
Block size:               1024
Fragment size:            1024
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         4016
Inode blocks per group:   502
Last mount time:          Thu Oct  7 15:34:42 2010
Last write time:          Thu Oct  7 15:34:42 2010
Mount count:              4
Maximum mount count:      30
Last checked:             Wed Sep 15 09:29:03 2010
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           128

Ein weiteres nützliches Tool ist lsblk .

# lsblk 

NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                   8:0    0    30G  0 disk 
└─sda1                8:1    0    30G  0 part 
  ├─vg1-root (dm-0) 254:0    0  23.3G  0 lvm  /
  └─vg1-swap (dm-1) 254:1    0   1.9G  0 lvm  [SWAP]
sr0                  11:0    1  1024M  0 rom  

Wenn Sie sich von der Installation getrennt haben, können Sie einen solchen Befehl ausführen

parted /dev/sda print all

Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 34.4GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      32.3kB  255MB   255MB   primary  ext2         boot 
 2      255MB   34.4GB  34.1GB  primary               lvm  

Model: Linux device-mapper (linear) (dm)
Disk /dev/mapper/vg1root: 32.6GB
Sector size (logical/physical): 512B/512B
Partition Table: loop

Number  Start  End     Size    File system  Flags
 1      0.00B  32.6GB  32.6GB  ext3              

Ich schlage vor, Sie werfen einen Blick auf die udev- oder parted- Quelle.

Zoredache
quelle
12
'vol_id' wurde seitdem in 'blkid' umbenannt, für alle, die zufällig auf diese großartige Antwort stoßen.
Dave S.
lsblk -i -o kname,mountpoint,fstype,size,maj:min,name,state,rm,rota,ro,type,label,model,serial
Sjas
wunderbare Antwort !!
Sufiyan Ghori
5

Ein weiterer nützlicher Befehl ist blkid: Er gibt ähnliche Informationen zurück wie der Befehl vol_id, kann jedoch auch alle Geräte im System scannen, anstatt dass ein Gerät übergeben werden muss.

Um zu erzwingen blkid, dass alle Geräte gescannt werden, anstatt zwischengespeicherte Informationen zu verwenden, führen blkid -c /dev/nullSie aus (Sie benötigen Leseberechtigung für die blockierten Geräte, sodass Sie diese normalerweise als Root ausführen müssen).

James
quelle
Ein anonymer Benutzer wollte hinzufügen: Dies ist alles nützlich, aber 'vol-id' wurde jetzt vollständig durch 'blkid' ersetzt. Weder SuSE noch Debian haben 'vol-id' mehr in ihren Repositories. Führen Sie whereis blockidüber die Befehlszeile (oder man blockid) aus, um festzustellen, ob es geladen ist. Run as root: blkid /dev/sdb1gives (zum Beispiel): /dev/sdb1: SEC_TYPE="msdos" LABEL="DR-05" UUID="8031-5963" TYPE="vfat"Die Manpage ist auch einen Blick wert.
Chris S
1

Hier ist ein Vorschlag von IBM: SCSI - Hot-Add, Remove, Rescan von SCSI-Geräten: Rescan eines SCSI-Geräts . Dadurch wird diese SCSI-Adresse erneut nach neuen Geräten durchsucht. Anschließend können Sie die Informationen in / var / log / messages lesen. Einige andere Festplattentools funktionieren auch, ohne dass Sie das Laufwerk einbinden müssen.

echo 1 > /sys/bus/scsi/drivers/sd/<SCSI-ID>/block/device/rescan

Ich habe gestern tatsächlich etwas anderes ausprobiert und es hat funktioniert (RHEL4-System):

cd /sys/bus/scsi/devices
echo > 0\:0\:0\:0/rescan
Stefan Lasiewski
quelle
0

Eine einfache Übersicht aller vom Kernel gefundenen Partitionen gibt

cat /proc/partitions
Frank Breitling
quelle