Annexe A. Device Mapper (Mappeur de périphériques)

Le Device Mapper est un pilote noyau qui offre un framework générique 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, de manière spécifique, le format des métadonnées et groupes de volumes.
Le Device Mapper fournit la base pour un nombre de technologies de haut niveau. En plus de LVM, le device-mapper multipath et la commande dmraid utilisent le mappeur de périphériques. L'interface d'application du mappeur de périphériques est l'appel système ioctl. L'interface d'utilisateur est la commande dmsetup.
LVM logical volumes are activated using the Device Mapper. Each logical volume is translated into a mapped device. Each segment translates into a line in the mapping table that describes the device. The Device Mapper supports a variety of mapping targets, including linear mapping, striped mapping, and error mapping. So, for example, two disks may be concatenated into one logical volume with a pair of linear mappings, one for each disk. When LVM2 creates a volume, it creates an underlying device-mapper device that can be queried with the dmsetup command. For information about the format of devices in a mapping table, see Section A.1, « Mappages de tables de périphériques ». For information about using the dmsetup command to query a device, see Section A.2, « La commande dmsetup ».

A.1. Mappages de tables de périphériques

Un périphérique mappé est déterminé par une table qui spécifie comment mapper chaque partie des secteurs logiques, en utilisant un mappage de tables de périphériques pris en charge. La table périphérique mappé, est construite à partir d'une liste de lignes sous la forme suivante :
start length mapping [mapping_parameters...]
Sur la première ligne d'une table de Device Mapper, le paramètre start doit être égal à zéro. Les paramètres start + length d'une ligne, doivent être égaux au paramètre start de la lige 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 dans les secteurs (512 octets).
Quand un périphérique est spécifié en tant que paramètre dans mappeur de périphérique, il peut être connu sous le nom du périphérique dans le système de fichiers (par exemple, /dev/hda) ou par un nombre majeur ou mineur sous les formats suivants major:minor. Le format major:minor est le format que l'on préfère, car il évite les recherches de noms de chemins d'accès.
Ce qui suit montre un échantillon 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 2 premiers paramètres de chaque ligne correspondent au bloc de départ et à la longueur du segment. Le prochain mot-clé est la cible de mappage, qui, dans tous les cas de cet exemple, est linear (linéaire). Le reste de la ligne consiste en paramètres pour une cible linéaire.
Les sous-sections suivantes décrivent le format des mappages suivants :
  • linéaire
  • par bandes
  • miroir
  • instantané et origine-instantané
  • erreur
  • zéro
  • multivoies
  • cryptage

A.1.1. La cible de mappage linéaire

Une cible de mappage linéaire mappe un ensemble de blocs contunus vers un autre périphérique bloc. Le format d'une cible linéaire est comme suit :
start length linear device offset
start
Blocs de départ en périphérique virtuel
length
longueur de ce segment
device
périphérique en bloc, référencé par le nom d'un périphérique dans le système de fichiers ou par les nombres mineurs ou majeurs sous les formats major:minor
offset
démarrer le déport du mappage sur le périphérique
L'exemple suivant montre une cible linéaire avec un bloc de départ dans le périphérique virtuel de 0, une longueur de segment de 1638400, une paire de nombre majeur:mineur de 8:2, et un déport de départ de 41146992 pour le périphérique.
0 16384000 linear 8:2 41156992
L'exemple suivant montre une cible linéaire avec un paramètre de périphérique spécifié en tant que périphérique /dev/hda.
0 20971520 linear /dev/hda 384

A.1.2. La cible de mappage par bandes

La cible de mappage par bandes prend en charge le dénudage pour tous les périphériques physiques. Elle prend pour arguments le nombre de bandes et la taille de la tranche de la bande , suivi par une liste de paires de nom et secteur. Le format de la cible par bandes est le suivante :
start length striped #stripes chunk_size device1 offset1 ... deviceN offsetN
Il y a un ensemble de paramètres de device (périphérique) et de offset (déport) pour chaque bande.
start
Blocs de départ en périphérique virtuel
length
longueur de ce segment
#stripes
nombre de bandes pour chaque périphérique virtuel
chunk_size
le nombre de secteurs écrit pour chaque bande avant de passer à la prochaine, doit être à la puissance 2 au moins en taille par rapport à la page du noyau.
device
périphérique en bloc, référencé par le nom du périphérique dans le système de fichiers ou par les nombres mineurs ou majeurs sous le format major:minor.
offset
démarrer le déport du mappage sur le périphérique
L'exemple suivant montre une cible par bandes comprenant trois bandes et une taille de tranche de 128 :
0 73728 striped 3 128 8:9 384 8:8 384 8:7 9789824
0
Blocs de départ en périphérique virtuel
73728
longueur de ce segment
par bandes 3 128
bandes sur trois périphériques avec des tailles de tranches de 128 blocs
8:9
Nombres majeurs:mineurs du premier périphérique
384
démarrage du déport de mappage sur le premier périphérique
8:8
Nombres majeurs:mineurs du second périphérique
384
démarrage du déport de mappage sur le second périphérique
8:7
Nombres majeurs:mineurs sur le troisième périphérique
9789824
démarrage du déport du mappage sur le troisième périphérique
L'exemple suivant montre une cible pour 2 bandes comprenant 256 Kio, avec des paramètres de périphérique spécifiés par les noms de périphérique dans le système de fichiers plutôt que par les nombres majeurs ou mineurs.
0 65536 striped 2 512 /dev/hda 0 /dev/hdb 0

A.1.3. La cible de mappage en miroir

La cible de mappage en miroir prend en charge le mappage du périphérique logique en miroir. Le format de la cible en miroir est le suivant :
start length mirror log_type #logargs logarg1 ... logargN #devs device1 offset1 ... deviceN offsetN
start
Blocs de départ en périphérique virtuel
length
longueur de ce segment
log_type
Les types de log possibles et leurs arguments sont les suivants :
core
Le miroir est local et le log de miroir est gardé dans la mémoire centrale. Ce type de log contient 1 - 3 arguments :
regionsize [[no]sync] [block_on_error]
disk
Le miroir est local et le log du miroir est gradé sur le disque. Ce type de log contient 2 - 4 arguments :
logdevice regionsize [[no]sync] [block_on_error]
clustered_core
Le miroir est clusterisé et le log de miroir est conservé dans la mémoire centrale. Ce type de log contient 2 - 4 arguments :
regionsize UUID [[no]sync] [block_on_error]
clustered_disk
Le miroir est clusterisé et le log du miroir est conservé sur le disque. Ce type de log contient 3 - 5 arguments :
logdevice regionsize UUID [[no]sync] [block_on_error]
LVM maintient un petit journal qui est utilisé pour garder la trace des régions qui sont synchrônisées avec le ou les miroirs. L'argument regionsize précise la taille de ces régions.
Dans un environnement clusterisé, l'argument UUID est un identifiant unique, associé au périphérique du log du miroir, de façon à ce que l'état du log puisse être maintenu à travers le cluster.
The optional [no]sync argument can be used to specify the mirror as "in-sync" or "out-of-sync". The block_on_error argument is used to tell the mirror to respond to errors rather than ignoring them.
#log_args
nombre d'arguments de logs qui seront spécifiés dans le mappage
logargs
Les arguments de log du miroir, le nombre d'arguments de log fourni est spécifié par le paramètre #log-args et les arguments de log recevables sont déterminés par le paramètre log_type.
#devs
le nombre de branches du miroir; un périphérique et un déport (offset) sont spécifiés pour chaque branche.
device
périphérique en bloc pour chaque branche du miroir, référencé par le nom du périphérique dans le système de fichiers ou par les nombres mineurs ou majeurs sous le format major:minor. Un périphérique en bloc et un déport (offset) sont précisés pour chaque branche de miroir, comme indiqué par le paramètre #devs.
offset
démarrage du mappage sur le périphérique. Un périphérique en bloc est un déport (offset) sont spécifiés pour chaque branche de miroir, comme indiqué par le paramètre #devs.
L'exemple suivant montre une cible de mappage en miroir pour un miroir clusterisé, accompagné d'un log de miroir attaché au 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
Blocs de départ en périphérique virtuel
52428800
longueur de ce segment
mirror clustered_disk
cible en miroir avec un type de log spécifiant que le miroir est clusterisé et que le log en miroir est gardé sur le disque.
4
4 arguments de log en miroir vont suivre
253:2
nombres majeur:mineur de périphériques de logs
1024
taille de région que le log en miroir utilise pour garder la trace de ce qui est synchrônisé
UUID
UUID du périphérique du log en miroir pour conserver l'information du log dans tout le cluster
block_on_error
le miroir doit répondre aux erreurs
3
nombres de branches du miroir
253:3 0 253:4 0 253:5 0
les nombres majeur:mineur et les déports (offset) des périphériques constituent chaque branche du miroir

A.1.4. Les cibles de mappage de l'instantané et de l'instantané d'origine

Quand vous créez le premier instantané LVM d'un volume, on utilise quatre mappeurs de périphérique :
  1. Un périphérique comprenant un mappage linéaire contenant la table de mappage d'origine du volume de la source.
  2. Un périphérique avec un mappage linéaireutilisé comme périphérique COW (de l'anglais copy-on-write ou copie-sur-écriture) pour le volume source, pour chaque écriture, les données d'origine sont sauvegardées dans le périphérique COW de chaque instantané pour garder son contenu visible inchangé (jusqu'à ce que le périphérique COW soit rempli).
  3. Un périphérique contenant un mappage instantané combinant #1 et #2, qui est le volume d'instantanés visibles
  4. The "original" volume (which uses the device number used by the original source volume), whose table is replaced by a "snapshot-origin" mapping from device #1.
On utilise un modèle de noms fixes pour créer ces périphériques. Par exemple, vous pourrez utiliser les commandes suivantes pour créer un volume LVM intitulé base et un volume d'instantané intitulé snap bas. sur ce volume.
# lvcreate -L 1G -n base volumeGroup
# lvcreate -L 100M --snapshot -n snap volumeGroup/base
Cela produit quatre périphériques, que vous pouvez apercevoir par les 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 instantané-d'origine est le suivant :
start length snapshot-origin origin
start
Blocs de départ en périphérique virtuel
length
longueur de ce segment
origin
volume de base d'instantané
L' instantané-d'origine aura normalement un ou plusieurs instantanés 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 sauvegardées dans le périphérique COW de chaque instantané pour garder leur contenu visible inchangé, jusqu'à ce que le périphérique COW soit rempli.
Le format de la cible instantané est le suivant :
start length snapshot origin COW-device P|N chunksize
start
Blocs de départ en périphérique virtuel
length
longueur de ce segment
origin
volume de base d'instantané
COW-device
Périphérique stockant les morceaux de données modifiées
P|N
P (Persistant) ou N (Non persistant); indique si l'instantané survivra après le redémarrage. Pour les instantanés transitoires (N), on doit sauvegarder moins de metadonnées sur le disque. Ils peuvent être contenus dans la mémoire par le noyau.
chunksize
Taille en sectuers de morceaux de données modifiées, qui seront stockés dans le périphérique COW
L'exemple suivant montre une cible instantané-d'origine avec un périphérique d'origine de 254:11.
0 2097152 snapshot-origin 254:11
L'exemple suivant montre une cible instantané avec un périphérique d'origine de 254:11 et un périphérique COW de 254:12. Ce périphérique d'instantané est persistant à travers les démarrages et la taille du morceau 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 d'erreurs

Avec une cible de mappage d'erreurs, toute opération E/S vers le secteur mappé échouera.
Une cible de mappage d'erreurs peut être utilisée pour tester. Pour tester comment un périphérique va se comporter en situation d'échec, vous pouvez créer un mappage de périphérique avec un mauvais secteur au milieu d'un périphérique, ou bien, vous pouvez échanger la branche du miroir par une cible d'erreur.
Une cible d'erreurs peut être utilisée à la place d'un périphérique défaillant, comme moyen d'éviter les timeouts et les nouvelles tentatives sur les périphériques. Elle peut servir en tant que cible intermédiaire tandis que vous réarrangez les métadonnées LVM en cas d'échec.
La cible de mappage erreur n'accepte pas de paramètres supplémentaires en dehors de start(démarrage) et de length (longueur).
L'exemple suivant montre une cible erreur.
0 65536 error

A.1.6. Le cible de mappage zéro

La cible de mappage zero est un périphérique en bloc équivalent à /dev/zero. Toute opération lecture de ce mappage retourne des blocs de zéro. Les données inscrites sur ce mappage sont ignorées, mais les opérations écriture aboutissent à leur fin. La cible de mappage zero n'accepte pas de paramètres supplémentaires en dehors de start (démarrage) et de length (longueur).
L'exemple suivant montre une cible zéro pour un périphérique de 16To.
0 65536 zero

A.1.7. La cible de mappage multivoies

La cible de mappage multivoies supporte le mappage d'un périphérique multivoies. Le format de la cible multivoie est la suivante :
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 d'accès.
start
Blocs de départ en périphérique virtuel
length
longueur de ce segment
#features
Le nombre de fonctionnalités en multivoies, suivi par ces fonctionnalités. Si ce paramètre est zéro, alors il n'y a pas de paramètre fonctionnalité et le prochain paramètre de mappage de périphérique sera #handlerargs. Actuellement, il existe une fonctionnalité multivoies prise en charge, #handlerargs. Elle indique que ce périphérique multivoies est actuellement configuré pour empiler en liste d'attente des opérations E/S s'il n'y a pas de chemin disponible.
Ainsi, si l'option no_path_retry du fichier multipath.conf a été configuré de façon à s'empiler en file d'attente des opérations E/S jusqu'à ce que tous les chemins d'accès aient été marqués 'failed' (échec) au bout d'un certain nombre de tentatives pour utiliser les chemins d'accès, le mappage apparaîtrait ainsi jusqu'à ce que tous les contrôleurs de chemin d'accès aient 'échoué' le nombre de contrôles spécifiés.
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
Après que tous les contrôleurs aient échoué sur le nombre de contrôles spécifiés, le mappage ressemblerait à ce qui 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
Le nombre d'arguments de gestionnaires de matériel, suivi par ces arguments. Un gestionnaire de matériel spécifie un module qui sera utilisé pour effectuer des actions spécifiques à des matériels particuliers au moment des changements de chemins d'accès de groupes ou en cours de gestion des erreurs E/S. Si la configuration est 0, alors le prochain paramètre sera #pathgroups.
#pathgroups
Le nombre de groupes de chemins d'accès. Un groupe de chemins d'accès correspond à l'ensemble des chemins d'accès à partir duquel un périphérique multivoies effectuera l'équilibre de ses charges. Il existe un ensemble de paramètres pathgroupargs pour chaque
pathgroup
Le prochain groupe de chemins d'accès à essayer.
pathgroupsargs
Chaque groupe de chemins d'accès consiste aux arguments suivants :
pathselector #selectorargs #paths #pathargs device1 ioreqs1 ... deviceN ioreqsN 
Il existe un ensemble d'arguments de chemins d'accès pour chaque chemin dans un groupe de chemins d'accès.
pathselector
Précise l'algorithme qui est utilisé pour déterminer le chemin d'accès dans ce groupe de chemins d'accès, à utiliser pour la prochaine opération E/S.
#selectorargs
Le nombre d'arguments de sélecteurs de chemins d'accès qui suivent cet argument, est le mappage multivoies. Actuellement, la valeur de cet argument est toujours 0.
#paths
Le nombre de chemins d'accès dans ce groupe de chemins d'accès.
#pathargs
Le nombre d'arguments de chemins d'accès spécifiés pour chaque chemin compris dans ce groupe. Actuellement, ce nombre est toujours de 1, l'argument ioreqs.
device
Le numéro de périphérique en bloc du chemin, référencé par les nombres majeurs et mineurs, sous le format major:minor
ioreqs
Le nombre de requêtes E/S à diriger vers ce chemin avant de passer au prochain chemin du groupe en question.
Figure A.1, « Cible de mappage multivoies » shows the format of a multipath target with two path groups.
Cible de mappage multivoies

Figure A.1. Cible de mappage multivoies

L'exemple suivant montre une définition de cible en failover pure dans un même périphérique multivoies. Pour cette cible, il existe quatre groupes de chemins, dont un seul chemin ouvert par groupe de chemins, de façon à ce que le périphérique multivoies 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 la définition d'une cible multibus complètement déployée, dans un même périphérique multivoies. Pour cette cible, il n'y a qu'un seul groupe de chemins, qui inclut tous les chemins. Dans cette installation, multivoies déploie la charge
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 plus d'informations à propos de multivoies, consultez le document Using Device Mapper Multipath (Utiliser le mappeur de périphériques multivoies).

A.1.8. La cible de mappage de cryptage

La cible crypt cible la codification des données qui passent par le périphérique spécifié. Il utilise l'API Crypto du noyau.
Le format de la cible crypt est le suivant :
start length crypt cipher key IV-offset device offset
start
Blocs de départ en périphérique virtuel
length
longueur de ce segment
cipher
Cipher consiste en cipher[-chainmode]-ivmode[:iv options].
cipher
Les ciphers disponibles sont listés dans /proc/crypto (par exemple, aes).
chainmode
Toujours utiliser cbc. Ne pas utiliser ebc; qui n'utilise pas un Vecteur Initial (IV) (de l'anglais Initial Vector).
ivmode[:iv options]
IV est un vecteur initial qui est utilisé pour faire varier le cryptage. Le mode de IV est soit plain ou bien essiv:hash. Un ivmode de -plain utilise le nombre de secteurs (plus IV offset) comme IV. Un ivmode de -essiv consistue un progrès par rapport au problème de filigrane numérique (watermark).
key
Clé de cryptage, fournie en hex
IV-offset
Initial Vector (IV) offset
device
périphérique en bloc, référencé par le nom d'un périphérique dans le système de fichiers ou par les nombres mineurs ou majeurs sous les formats major:minor
offset
démarrer le déport du mappage sur le périphérique
L'exemple suivant est un exemple d'une cible crypt.
0 2097152 crypt aes-plain 0123456789abcdef0123456789abcdef 0 /dev/hda 0