J'ai besoin de trouver tous les périphériques de stockage inscriptibles attachés à une machine donnée, qu'ils soient ou non ils sont montés.
La meilleure façon de procéder consiste à essayer chaque entrée de /dev
correspondant à un périphérique inscriptible (hd* and sd*
). .....
Existe-t-il une meilleure solution ou devrais-je m'en tenir à celle-ci?
/proc/partitions
listera tous les périphériques et partitions bloqués reconnus par le système. 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.
Vous pouvez toujours utiliser fdisk -l
qui semble fonctionner assez bien, même sur des configurations étranges telles que les périphériques EC2 xvda.
Voici un dump 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 mount
dit:
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/partitions
dit:
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
Je voudrais bien me connaître comment fdisk -l
fonctionne.
vous pouvez aussi essayer lsblk ... est en 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 ... on dirait qu'il ne peut pas "tout voir"
dans mon exemple particulier, j'ai un bâton avec 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 (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 gentil ... 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)
ls /sys/block
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
Les systèmes linux modernes n’auront normalement des entrées dans/dev que pour les périphériques existants, il est donc préférable de passer par hda * et sda *, comme vous le suggérez.
Sinon, vous pouvez utiliser quelque chose dans/proc. D'un coup d'œil, j'aurais dit que/proc/partitions semble pouvoir faire ce dont vous avez besoin.
libsysfs semble potentiellement utile, mais pas directement à partir d'un script Shell. Il existe un programme fourni avec celui-ci, appelé systool, qui fera ce que vous voulez, bien qu'il soit peut-être plus simple de regarder dans/sys directement plutôt que d'utiliser un autre programme pour le faire à votre place.