Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

Annexe A. Le mappeur de périphériquesur de périphériques

Le mappeur de périphériques est un pilote de noyau qui offre un framework pour la gestion des volumes. Il permet de créer génériquement des périphériques mappés, qui peuvent être utilisés en tant que volumes logiques. Il ne connaît pas particulièrement le format des métadonnées et des groupes de volumes.
Le mappeur de périphériques fournit la base pour un nombre de technologies de haut niveau. En plus de LVM, Device-Mapper multipath et la commande dmraid utilisent le mappeur de périphériques. L'interface application de Device Mapper (le mappeur de périphériques) est l'appel système ioctl. L'interface utilisateur est la commande dmsetup.
Les volumes logiques LVM sont activés en utilisant le mappeur de périphériques. Chaque volume logique est traduit en un périphérique mappé. Chaque segment est représenté par une ligne dans la table de mappages qui décrit le périphérique. Le gestionnaire de périphériques fournit, entre autres, un mappage linéaire, un mappage en mode stripe et un mappage d'erreurs. Deux disques peuvent être concaténés dans un seul volume logique avec une paire de mappages linéaires, un pour chaque disque. Lorsque LVM crée un volume, il crée un périphérique sous-jacent qui est un mappeur de périphériques et pouvant être questionné avec la commande dmsetup. Pour obtenir des informations sur le format des périphériques dans une table de mappage, voir la Section A.1, « Tables des mappages de périphériques ». Pour obtenir des informations sur l'utilisation de la commande dmsetup pour questionner un périphérique, voir la Section A.2, « La commande dmsetup ».

A.1. Tables des mappages de périphériques

Un périphérique mappé est défini par une table qui spécifie comment mapper chaque gamme de secteurs logiques du périphérique à l'aide d'un mappage de table de périphérique supporté. La table d'un périphérique mappé est construite à partir d'une liste de lignes sous la forme suivante :
start length mapping [mapping_parameters...]
Dans la première ligne d'une table de périphérique mappé, le paramètre start doit être égal à 0. Les paramètres start + length sur une ligne doivent être égaux à start sur la ligne suivante. Les paramètres de mappage spécifiés sur une ligne de table de mappage dépendent du type de mapping spécifié sur la ligne.
Les tailles dans le mappeur de périphérique sont toujours spécifiées en secteurs (512 octets).
Lorsqu'un périphérique est spécifié en tant que paramètre dans le mappeur de périphériques, il peut être référencé par le nom du périphérique dans le système de fichiers (par exemple, /dev/hda) ou par le numéro majeur ou mineur sous le format major:minor. Le format major:minor (majeur:mineur) est préféré car il permet d'éviter les recherches de noms de chemins.
Ci-dessous figure un exemple de table de mappage pour un périphérique. Dans cette table, il y a quatre cibles linéaires :
0 35258368 linear 8:48 65920
35258368 35258368 linear 8:32 65920
70516736 17694720 linear 8:16 17694976
88211456 17694720 linear 8:16 256
Les deux premiers paramètres de chaque ligne correspondent au bloc de démarrage du segment et à la longueur de celui-ci. Le mot-clé qui suit est la cible de mappage, et qui est, dans tous les cas de figure de cet exemple, linear. Le reste de la ligne est composé de paramètres pour une cible linear.
Les sous-sections qui suivent décrivent le format des mappages ci-dessous :
  • linéaire
  • striped
  • miroir
  • snapshot et snapshot-origin
  • erreur
  • zéro
  • multipath
  • crypt

A.1.1. La cible de mappage linéaire

Une cible de mappage linéaire mappe un éventail continu de blocs sur un autre périphérique bloc. Le format d'une cible linéaire est comme suit :
start length linear device offset
start
bloc de démarrage du périphérique virtuel
length
longueur de ce segment
device
périphérique bloc, répertorié par le nom de périphérique dans le système de fichiers, ou par le numéro majeur ou mineur sous le format major:minor
offset
offset de démarrage du mappage du périphérique
L'exemple suivant montre une cible linéaire avec un bloc de démarrage dans le périphérique virtuel de 0, une longueur de segment de 1638400, une paire de numéros major:minor de 8:2, et un offset de démarrage du périphérique de 41146992.
0 16384000 linear 8:2 41156992
L'exemple suivant montre une cible linéaire avec le paramètre du périphérique spécifié en tant que /dev/hda.
0 20971520 linear /dev/hda 384

A.1.2. La cible de mappage striped

La cible de mappage striped supporte le striping sur les périphériques physiques. Elle prend le nombre de stripes et la taille du bloc striping en tant qu'arguments, suivis par une liste de paires de nom de périphériques et de secteurs. Le format d'une cible striped est comme suit :
start length striped #stripes chunk_size device1 offset1 ... deviceN offsetN
Il y a un ensemble de paramètres device et offset pour chaque stripe.
start
bloc de démarrage du périphérique virtuel
length
longueur de ce segment
#stripes
nombre de stripes pour le périphérique virtuel
chunk_size
nombre de secteurs écrits sur chaque stripe avant de passer à la stripe suivante ; doit être à la puissance 2, au moins aussi gros que la taille de la page du noyau.
device
périphérique bloc, peut être référencé par le nom de périphérique dans le système de fichiers ou par le numéro majeur ou mineur sous le format major:minor.
offset
offset de démarrage du mappage du périphérique
L'exemple suivant montre une cible striped avec trois stripes et une taille de bloc de 128 :
0 73728 striped 3 128 8:9 384 8:8 384 8:7 9789824
0
bloc de démarrage du périphérique virtuel
73728
longueur de ce segment
striped 3 128
stripe sur trois périphériques avec une taille de bloc de 128
8:9
numéros major:minor du premier périphérique
384
démarrage du décalage du mappage sur le premier périphérique
8:8
numéros major:minor du second périphérique
384
démarrage du décalage du mappage sur le deuxième périphérique
8:7
numéros major:minor du troisième périphérique
9789824
démarrage du décalage du mappage sur le troisième périphérique
L'exemple suivant montre une cible striped pour deux stripes avec des blocs de 256 Ko, avec les paramètres de périphérique spécifiés par les noms de périphériques dans le système de fichiers plutôt que par les numéros majeur et mineur (major et minor).
0 65536 striped 2 512 /dev/hda 0 /dev/hdb 0

A.1.3. La cible de mappage miroir

La cible de mappage miroir supporte le mappage d'un périphérique logique miroir. Le format d'une cible miroir est comme suit :
start length mirror log_type #logargs logarg1 ... logargN #devs device1 offset1 ... deviceN offsetN
start
bloc de démarrage du périphérique virtuel
length
longueur de ce segment
log_type
Les types de journaux possibles et leurs arguments sont comme suit :
core
Le miroir est local et le journal du miroir est conservé dans la mémoire centrale. Ce type de journal prend de 1 à 3 arguments :
regionsize [[no]sync] [block_on_error]
disk
Le miroir est local et le journal du miroir est conservé sur disque. Ce type de journal prend de 2 à 4 arguments :
logdevice regionsize [[no]sync] [block_on_error]
clustered_core
Le miroir est clusterisé et le journal du miroir est conservé dans la mémoire centrale. Ce type de journal prend de 2 à 4 arguments :
regionsize UUID [[no]sync] [block_on_error]
clustered_disk
Le miroir est clusterisé et le journal du miroir est conservé sur disque. Ce type de journal prend de 3 à 5 arguments :
logdevice regionsize UUID [[no]sync] [block_on_error]
LVM maintient un petit journal utilisé pour savoir quelles régions sont synchronisées avec le (ou les) miroir(s). L'argument regionsize spécifie la taille de ces régions.
Dans un environnement clusterisé, l'argument UUID est un identifiant unique associé au périphérique du journal du miroir de manière à ce que l'état du journal puisse être maintenu à travers le cluster.
L'argument optionnel [no]sync peut être utilisé pour spécifier le miroir comme étant "in-sync" ou "out-of-sync". L'argument block_on_error est utilisé pour dire au miroir de répondre aux erreurs plutôt que de les ignorer.
#log_args
nombre d'arguments de journal qui seront spécifiés dans le mappage
logargs
les arguments de journal pour le miroir ; le nombre d'arguments de journal fournit est spécifié par le paramètre #log-args et les arguments valides du journal sont déterminés par le paramètre log_type.
#devs
le nombre de branches du miroir ; un périphérique et un décalage est spécifié pour chaque branche.
device
périphérique bloc pour chaque branche de miroir, référencé par le nom de périphérique dans le système de fichiers ou par le numéro majeur ou mineur sous le format major:minor. Un périphérique bloc et un décalage sont spécifiés pour chaque branche de miroir, comme indiqué par paramètre #devs.
offset
démarrage du décalage du mappage sur le périphérique. Un périphérique bloc et un décalage est spécifié pour chaque branche de miroir, comme indiqué par le paramètre #devs.
L'exemple suivant montre une cible de mappage miroir pour un miroir clusterisé avec un journal miroir sur disque.
0 52428800 mirror clustered_disk 4 253:2 1024 UUID block_on_error 3 253:3 0 253:4 0 253:5 0
0
bloc de démarrage du périphérique virtuel
52428800
longueur de ce segment
mirror clustered_disk
cible de miroir avec un type de journal spécifiant que le miroir est clusterisé et que la branche du miroir est maintenue sur disque.
4
4 arguments du journal miroir suivent
253:2
numéros major:minor du périphérique du journal
1024
taille de la région que le journal miroir utilise pour savoir ce qui est synchronisé
UUID
UUID du périphérique du journal miroir pour maintenir les informations de journal à travers un cluster
block_on_error
le miroir devrait répondre aux erreurs
3
nombre de branches en miroir
253:3 0 253:4 0 253:5 0
numéros major:minor et offset des périphériques composant chaque branche du miroir

A.1.4. Les cibles de mappage snapshot et snapshot-origin

Lorsque vous créez le premier snapshot (ou instantané) LVM d'un volume, quatre périphériques de mappage de périphériques sont utilisés :
  1. Périphérique avec un mappage linear contenant la table de mappage originale du volume source.
  2. Périphérique avec un mappage linear utilisé comme périphérique de cliché instantané (de l'anglais, « copy-on-write », ou COW) pour le volume source ; pour chaque écriture, les données d'origine sont enregistrées dans le périphérique COW de chaque snapshot pour garder son contenu visible inchangé (jusqu'à ce que le périphérique COW soit rempli).
  3. Un périphérique avec un mappage snapshot combinant #1 et #2, qui est le volume snapshot visible
  4. Le volume "original" (qui utilise le numéro du périphérique utilisé par le volume source original), dont la table est remplacée par un mappage "snapshot-origin" du périphérique #1.
Un schéma de dénomination fixe est utilisé pour créer ces périphériques. Par exemple, vous pourriez utiliser les commandes suivantes pour créer un volume LVM nommé base et un volume snapshot nommé snap basé sur ce volume.
# lvcreate -L 1G -n base volumeGroup
# lvcreate -L 100M --snapshot -n snap volumeGroup/base
Ceci produit quatre périphériques, que vous pouvez observer à l'aide des commandes suivantes :
# dmsetup table|grep volumeGroup
volumeGroup-base-real: 0 2097152 linear 8:19 384
volumeGroup-snap-cow: 0 204800 linear 8:19 2097536
volumeGroup-snap: 0 2097152 snapshot 254:11 254:12 P 16
volumeGroup-base: 0 2097152 snapshot-origin 254:11

# ls -lL /dev/mapper/volumeGroup-*
brw-------  1 root root 254, 11 29 ago 18:15 /dev/mapper/volumeGroup-base-real
brw-------  1 root root 254, 12 29 ago 18:15 /dev/mapper/volumeGroup-snap-cow
brw-------  1 root root 254, 13 29 ago 18:15 /dev/mapper/volumeGroup-snap
brw-------  1 root root 254, 10 29 ago 18:14 /dev/mapper/volumeGroup-base
Le format de la cible snapshot-origin est comme suit :
start length snapshot-origin origin
start
bloc de démarrage du périphérique virtuel
length
longueur de ce segment
origin
volume de base du snapshot
snapshot-origin possède normalement un ou plusieurs snapshot qui lui sont basés dessus. Les lectures seront directement mappées sur le périphérique de sauvegarde. Pour chaque écriture, les données d'origine seront enregistrées sur le périphérique COW de chaque snapshot afin que son contenu visible reste inchangé jusqu'à ce que le périphérique COW soit rempli.
Le format de la cible snapshot est comme suit :
start length snapshot origin COW-device P|N chunksize
start
bloc de démarrage du périphérique virtuel
length
longueur de ce segment
origin
volume de base du snapshot
COW-device
Périphérique sur lequel des portions de données modifiées sont stockées
P|N
P (persistant) ou N (not persistant) ; indique si le snapshot survivra au redémarrage. Pour les snapshots temporaires (N), moins de métadonnées doivent être enregistrées sur disque, celles-ci peuvent être conservées en mémoire par le noyau.
chunksize
Taille en secteurs des portions de données modifiées qui seront stockées sur le périphérique COW.
L'exemple suivant montre une cible snapshot-origin avec un périphérique d'origine de 254:11.
0 2097152 snapshot-origin 254:11
L'exemple suivant montre une cible snapshot avec un périphérique d'origine de 254:11 et un périphérique COW de 254:12. Ce périphérique snapshot est persistant à travers les redémarrage et la taille des portions des données stockées sur le périphérique COW est de 16 secteurs.
0 2097152 snapshot 254:11 254:12 P 16

A.1.5. La cible de mappage « error »

Avec une cible de mappage « error », toute opération d'E/S sur le secteur mappé échoue.
Une cible de mappage « error » peut être utilisée pour effectuer des tests. Pour voir de quelle manière se comporte un périphérique en cas d'échec, vous pouvez créer un mappage de périphérique avec un secteur défectueux au milieu du périphérique, ou vous pouvez échanger une branche d'un miroir et la remplacer par une cible erronée.
Une cible erronée peut être utilisée à la place d'un périphérique en éche afin d'éviter les délais et les nouvelles tentatives sur le périphérique. Celle-ci peut servir de cible intermédiaire tandis que vous réarrangez les métadonnées LVM pendant les pannes.
À l'exception des paramètres start et length, la cible de mappage error ne prend aucun paramètre supplémentaire.
L'exemple suivant présente une cible error.
0 65536 error

A.1.6. La cible de mappage « zero »

La cible de mappage zero est un périphérique bloc équivalent à /dev/zero. Une opération de lecture sur ce mappage retourne des blocs de zéros. Les données écrites sur ce mappage sont abandonnées, mais l'écriture est réussie. À l'exception des paramètres start et length, la cible de mappage zero ne prend pas de paramètres supplémentaires.
L'exemple suivant présente une cible zero pour un périphérique 16Tb.
0 65536 zero

A.1.7. La cible de mappage « multipath »

La cible de mappage « multipath » prend en charge le mappage d'un périphérique multipath. Le format de la cible multipath est comme suit :
start length  multipath  #features [feature1 ... featureN] #handlerargs [handlerarg1 ... handlerargN] #pathgroups pathgroup pathgroupargs1 ... pathgroupargsN
Il existe un ensemble de paramètres pathgroupargs pour chaque groupe de chemins.
start
bloc de démarrage du périphérique virtuel
length
longueur de ce segment
#features
Nombre de fonctionnalités multipath, suivi par celles-ci. Si ce paramètre est à zéro, alors il n'y a aucun paramètre feature et le paramètre de mappage de périphérique qui suit est #handlerargs. Une seule fonctionnalité multipath est prise en charge à l'instant présent, queue_if_no_path. Ceci indique que le périphérique multipath est actuellement réglé pour mettre les opérations d'E/S en file d'attente s'il n'y a aucun chemin disponible.
Par exemple, si l'option no_path_retry dans le fichier multipath.conf a été réglé pour mettre les opérations d'E/S en file d'attente uniquement lorsque tous les chemins on été marqués comme étant en échec, et aprés qu'un certain nombre de tentatives d'emprunt de ces chemins n'ait été réalisé, le mappage apparaitra comme suit jusqu'à ce que toutes les vérification des vérificateurs de chemins aient échoué.
0 71014400 multipath 1 queue_if_no_path 0 2 1 round-robin 0 2 1 66:128 \
1000 65:64 1000 round-robin 0 2 1 8:0 1000 67:192 1000
Une fois que les vérificateurs de chemins auront échoué à vérifier le nombre spécifié de vérifications, le mappage apparaitra comme suit.
0 71014400 multipath 0 0 2 1 round-robin 0 2 1 66:128 1000 65:64 1000 \
round-robin 0 2 1 8:0 1000 67:192 1000
#handlerargs
Nombre d'arguments du gestionnaire du matériel, suivis par ceux-ci. Un gestionnaire de matériel spécifie un module qui sera utilisé pour effectuer des actions spécifiques au matériel lorsque vous basculez d'un groupe de chemins à un autre ou lors de la gestion d'erreurs d'E/S. S'il est réglé sur 0, alors le paramètre qui suit sera #pathgroups.
#pathgroups
Nombre de groupes de chemins. Un groupe de chemins est l'ensemble des chemins sur lesquels un périphérique mutlipath équilibre les charges. Il existe un ensemble de paramètres pathgroupargs pour chaque groupe de chemins.
pathgroup
Le prochain groupe de chemins à essayer.
pathgroupsargs
Chaque groupe de chemins est composé des arguments suivants :
pathselector #selectorargs #paths #pathargs device1 ioreqs1 ... deviceN ioreqsN 
Il y a un ensemble d'arguments de chemins pour chaque chemin du groupe de chemins.
pathselector
Spécifie l'algorithme à utiliser pour déterminer quel chemin dans ce groupe de chemins doit être utilisé pour la prochaine opération d'E/S.
#selectorargs
Nombre d'arguments du sélecteur d'arguments qui suit cet argument dans le mappage multipath. Actuellement, la valeur de cet argument est toujours 0.
#paths
Nombre de chemins dans ce groupe de chemins.
#pathargs
Nombre d'arguments de chemin spécifiés pour chaque chemin dans ce groupe. Actuellement, ce nombre est toujours 1, l'argument ioreqs.
device
Numéro du périphérique bloc du chemin, référencé par les numéros majeur et mineur sous le format major:minor
ioreqs
Nombre de requêtes d'E/S à acheminer vers ce chemin avant de basculer sur le chemin suivant du groupe actuel.
Figure A.1, « Cible de mappage multipath » montre le format d'une cible multipath avec deux groupes de chemins
Cible de mappage multipath

Figure A.1. Cible de mappage multipath

L'exemple suivant montre une définition de cible de basculement pure pour le même périphérique multipath. Dans cette cible, il y a quatre groupes de chemins, avec seulement un chemin ouvert par groupe de chemins, et ce de manière à ce que le périphérique multipath n'utilise qu'un seul chemin à la fois.
0 71014400 multipath 0 0 4 1 round-robin 0 1 1 66:112 1000 \
round-robin 0 1 1 67:176 1000 round-robin 0 1 1 68:240 1000 \
round-robin 0 1 1 65:48 1000
L'exemple suivant montre une définition de cible en étalement complet (multibus) pour le même périphérique multipath. Dans cette cible, il n'y a qu'un seul groupe de chemins, qui inclut tous les chemins. Dans cette installation, multipath étale les charges de manière uniformément sur tous les chemins.
0 71014400 multipath 0 0 1 1 round-robin 0 4 1 66:112 1000 \
 67:176 1000 68:240 1000 65:48 1000
Pour de plus amples informations sur le « multipathing », voir le document Using Device Mapper Multipath.

A.1.8. La cible de mappage « crypt »

La cible crypt chiffre les données passant à travers le périphérique spécifié. Elle utilise l'API du noyau Cypto.
Le format pour la cible crypt est comme suit :
start length crypt cipher key IV-offset device offset
start
bloc de démarrage du périphérique virtuel
length
longueur de ce segment
cipher
Un cipher est composé de cipher[-chainmode]-ivmode[:iv options].
cipher
Les ciphers disponibles sont répertoriés dans /proc/crypto (par exemple, aes).
chainmode
Veuillez toujours utiliser cbc. Ne pas utiliser ebc ; car il n'utilise pas un vecteur initial (IV).
ivmode[:iv options]
IV est un vecteur initial utilisé afin de varier le chiffrage. Le mode IV est plain ou essiv:hash. Un ivmode de -plain utilise le numéro du secteur (plus un décalage d'IV) comme IV. Un ivmode de -essiv est une amélioration évitant une faiblesse face aux tatouages numériques (ou watermarking)
key
Clé de chiffrement, fournie en hex
IV-offset
Décalage du vecteur initial (IV)
device
périphérique bloc, répertorié par le nom de périphérique dans le système de fichiers, ou par le numéro majeur ou mineur sous le format major:minor
offset
offset de démarrage du mappage du périphérique
Ci-dessous figure un exemple de cible crypt.
0 2097152 crypt aes-plain 0123456789abcdef0123456789abcdef 0 /dev/hda 0