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
lineardevice 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
mirrorlog_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'argumentblock_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ètrelog_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 :
- Périphérique avec un mappage
linear
contenant la table de mappage originale du volume source. - 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). - Un périphérique avec un mappage
snapshot
combinant #1 et #2, qui est le volume snapshot visible - 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-originorigin
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
snapshotorigin COW-device
P|Nchunksize
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'optionno_path_retry
dans le fichiermultipath.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
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
cryptcipher 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 utiliserebc
; 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
ouessiv:hash
. Univmode
de-plain
utilise le numéro du secteur (plus un décalage d'IV) comme IV. Univmode
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