Blockdev

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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 (8 pour 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.

  1. Supprimer chaque chemin du multipath (il sera juste rafraîchi, pas détruit) :
    multipathd -k"del path sdb"
    
  2. Relire la table de partitions du chemin et vérifier la nouvelle taille :
    blockdev --rereadpt /dev/sdb
    blockdev --getsz /dev/sdb
    
  3. Sauvegarder puis modifier la table dmsetup du device multipath (la taille en premier
  champ, et l'index des chemins) :
  1. 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
    
  2. 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
    
  3. Vérifier la taille mise à jour, puis remettre le chemin dans le multipath :
    blockdev --getsz /dev/sdb
    multipathd -k"add path sdb"
    
  4. 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 :
  1. 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"
    
  2. 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) :
  1. multipath
    partprobe
    dmsetup table mpath1p1 | tee partorg partcur
    dmsetup suspend mpath1p1
    dmsetup reload mpath1p1 partcur
    dmsetup resume mpath1p1
    
  2. Enfin, agrandir le système de fichiers à la nouvelle taille du device :
    resize2fs /dev/mapper/mpath1p1
    

Voir aussi