Blockdev
| Fiche express | |
|---|---|
| Domaine | Périphériques bloc (taille, read-ahead, table de partitions) |
| Commande | blockdev
|
| Contexte | Disques SATA/SCSI, LUN SAN multipath, volumes redimensionnés à chaud |
| Voir aussi | Dmsetup, Multipathd, Aligner des partitions |
blockdev lit et modifie des paramètres bas niveau d'un périphérique bloc (disque, partition, LUN SAN, device mapper) : taille en secteurs, taille du read-ahead, et forcer la relecture de la table de partitions par le noyau après un changement de taille côté SAN.
Identifier un périphérique : major/minor
Chaque périphérique bloc apparaît dans /proc/partitions et dans
ls -l /dev/sdX avec un couple major/minor :
cat /proc/partitions
- le major identifie le type de contrôleur (
8pour SATA/SCSI, un même
major pour tous les disques sd*) ;
- le minor identifie le disque puis la partition : chaque disque démarre à un multiple
de 16 (0, 16, 32, 48…), puis les partitions s'incrémentent de 1 à partir de là.
brw-rw---- 1 root disk 8, 0 oct 18 17:11 /dev/sda
brw-rw---- 1 root disk 8, 1 oct 18 17:11 /dev/sda1
brw-rw---- 1 root disk 8, 2 oct 18 17:11 /dev/sda2
brw-rw---- 1 root disk 8, 16 oct 18 17:11 /dev/sdb
brw-rw---- 1 root disk 8, 17 oct 18 17:11 /dev/sdb1
brw-rw---- 1 root disk 8, 18 oct 18 17:11 /dev/sdb2
brw-rw---- 1 root disk 8, 32 oct 18 17:11 /dev/sdc
brw-rw---- 1 root disk 8, 33 oct 18 17:11 /dev/sdc1
brw-rw---- 1 root disk 8, 34 oct 18 17:11 /dev/sdc2
Taille et read-ahead
blockdev --report /dev/sda # récapitulatif (RO, RA, taille en secteurs et en octets...)
blockdev --getsz /dev/sda # taille en secteurs de 512 octets (remplace --getsize, 32 bits, obsolète)
blockdev --getra /dev/sda # read-ahead, en secteurs de 512 octets
blockdev --setra 256 /dev/sda # fixe le read-ahead à 256 secteurs (= 128 Ko)
Le read-ahead est aussi lisible/modifiable en kilo-octets via sysfs (valeur = --getra
/ 2, puisque 1 Ko = 2 secteurs de 512 octets) :
cat /sys/block/sda/queue/read_ahead_kb
Créer un device mapper linéaire à partir d'une partition
echo "0 $(blockdev --getsz /dev/sda1) linear /dev/sda1 0" | dmsetup create mypart
Forcer la relecture de la table de partitions
Après un agrandissement d'un LUN côté SAN, le noyau ne voit pas le nouveau nombre de secteurs tant qu'on ne le lui redemande pas :
blockdev --getsz /dev/sdb # taille avant relecture
blockdev --rereadpt /dev/sdb # relit la table de partitions (équivalent d'un rescan sysfs)
blockdev --getsz /dev/sdb # taille après relecture
⚠️ Sur un LUN monté en multipath, --rereadpt ne suffit pas : chaque chemin
(sdb, sdc…) doit être rescanné, puis la map multipath
elle-même reconstruite — voir ci-dessous.
Redimensionner à chaud un disque multipath
Procédure complète quand un LUN SAN multipathé est agrandi côté baie et qu'il faut répercuter la nouvelle taille jusqu'au système de fichiers, sans interruption de service. Plus simple si possible : passer par multipathd et dmsetup directement plutôt que de démonter/remonter.
- Supprimer chaque chemin du multipath (il sera juste rafraîchi, pas détruit) :
multipathd -k"del path sdb"
- Relire la table de partitions du chemin et vérifier la nouvelle taille :
blockdev --rereadpt /dev/sdb blockdev --getsz /dev/sdb
- Sauvegarder puis modifier la table dmsetup du device multipath (la taille en premier
champ, et l'index des chemins) :
dmsetup table mpath1 | tee org cur # 0 419424892 multipath 1 queue_if_no_path 0 2 1 round-robin 0 1 1 8:32 128 round-robin 0 1 1 8:16 128
- Éditer
cur: retirer le chemin qu'on vient de supprimer et réindexer sur 1 chemin : 0 419424892 multipath 1 queue_if_no_path 0 1 1 round-robin 0 1 1 8:32 128
- Recharger la map avec la nouvelle table (suspendre les I/O le temps du reload) :
dmsetup suspend mpath1 dmsetup reload mpath1 cur dmsetup resume mpath1
- Vérifier la taille mise à jour, puis remettre le chemin dans le multipath :
blockdev --getsz /dev/sdb multipathd -k"add path sdb"
- Répéter les mêmes étapes pour chaque autre chemin (
sdc, etc.), en
mettant à jour à chaque fois la taille et l'index dans le fichier cur :
multipathd -k"del path sdc" # éditer cur : nouvelle taille + chemin 8:16 réindexé # 0 734003200 multipath 1 queue_if_no_path 0 1 1 round-robin 0 1 1 8:16 128 dmsetup suspend mpath1 dmsetup reload mpath1 cur dmsetup resume mpath1 multipathd -k"add path sdc"
- Une fois tous les chemins mis à jour, relancer
multipath, forcer la relecture
de la table de partitions du device mapper, puis répercuter sur la map de la partition elle-même (même principe suspend/reload/resume que pour le disque) :
multipath partprobe dmsetup table mpath1p1 | tee partorg partcur dmsetup suspend mpath1p1 dmsetup reload mpath1p1 partcur dmsetup resume mpath1p1
- Enfin, agrandir le système de fichiers à la nouvelle taille du device :
resize2fs /dev/mapper/mpath1p1
Voir aussi
- Aligner des partitions — alignement des partitions et volumes LVM sur SAN/VM
- Dmsetup — manipulation directe des tables device mapper
- Multipathd — gestion des chemins multipath