Tout d'abord, la situation: j'ai un ordinateur Linux avec deux baies de disques eSATA qui acceptent les disques SSD amovibles. J'essaie d'écrire une petite application graphique qui permet à l'utilisateur de monter/démonter/formater/sauvegarder/etc plus facilement les lecteurs qu'il met dans ces baies.
Tout cela fonctionne surtout. Un petit problème, cependant, est que je ne sais pas comment trouver des informations sur le ou les lecteurs insérés tant que les lecteurs n'ont pas été correctement montés.
Ainsi, par exemple, si l'utilisateur insère un lecteur que je ne peux pas monter (par exemple parce qu'il n'est pas formaté ou formaté avec un système de fichiers inattendu), toute mon application peut dire à ce sujet est "Le lecteur n'a pas pu être monté".
Ce n'est pas très satisfaisant, car si le lecteur n'est pas formaté, l'utilisateur voudra probablement le formater ... mais si le lecteur contient des données provenant d'un système de fichiers non reconnu, l'utilisateur ne voudra probablement PAS le formater .... ou au moins, je veux pouvoir l'avertir qu'en faisant cela, il effacera des données potentiellement précieuses.
Ma question est donc: existe-t-il une méthode pour interroger certaines informations de base (en particulier de type système de fichiers) à partir d'un lecteur qui ne nécessite pas que le lecteur soit déjà monté? Ou dois-je simplement essayer de le monter avec divers systèmes de fichiers connus jusqu'à ce que l'une des tentatives de montage réussisse, et donner un vague message "soyez prudent" si aucun d'entre eux ne le fait?
Dans le cas où cela importe, les chemins que j'utilise pour monter les lecteurs dans les baies de lecteur sont:
/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
Si les disques sont démontés, vous pouvez effectuer plusieurs opérations.
Vous pouvez utiliser une commande comme fdisk -l
ou sfdisk -l
pour répertorier les partitions. Seul le type de partition peut vous donner des informations utiles si les partitions ont été correctement installées.
# 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
S'il est présent sur votre système, vous pouvez utiliser la commande vol_id
contre une partition pour retourner des détails utiles (partie du paquet udev sur Debian). Cela vous indiquera généralement quel système de fichiers est réellement utilisé.
# 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=
La commande lshw -class disk
vous donnera quelques détails sur le type de lecteur. Vous voudrez peut-être l'utiliser si vous êtes curieux de connaître le numéro de série réel du lecteur.
# 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
Si vous êtes sûr qu'il existe un système de fichiers particulier comme ext2/3, vous pouvez utiliser l'outil tune2fs spécifique au système de fichiers pour examiner plus de détails.
# 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
Un autre outil utile est 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
Si vous avez séparé installé, vous pouvez exécuter une commande comme celle-ci
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
Quoi qu'il en soit, je vous suggère de jeter un œil à la source dev ou parted .
Une autre commande utile est blkid
- elle renvoie des informations similaires à vol_id
mais peut également analyser tous les périphériques du système, plutôt que d'exiger la transmission d'un périphérique.
Pour forcer blkid
à analyser tous les appareils au lieu d'utiliser les informations mises en cache, exécutez blkid -c /dev/null
(vous avez besoin d'une autorisation de lecture sur les périphériques de blocage, vous devrez donc généralement l'exécuter en tant que root)
Un aperçu simple de toutes les partitions trouvées par le noyau donne
cat /proc/partitions
Voici une suggestion de IBM: SCSI - Ajout, suppression, nouvelle analyse à chaud des périphériques SCSI: Nouvelle analyse d'un périphérique SCSI . Cela analysera à nouveau cette adresse SCSI pour les nouveaux périphériques, puis vous pourrez lire les informations dans/var/log/messages. Certains autres outils de disque fonctionneront également, sans que vous montiez le lecteur.
echo 1 > /sys/bus/scsi/drivers/sd/<SCSI-ID>/block/device/rescan
J'ai en fait essayé quelque chose de légèrement différent hier, et cela a fonctionné (système RHEL4):
cd /sys/bus/scsi/devices
echo > 0\:0\:0\:0/rescan