Apéndice A. Mapeador de Dispositivos

El Mapeador de Dispositivos es un controlador del kernel que proporciona un marco de trabajo para la administración de volúmenes. Ofrece un medio genérico para crear dispositivos asignados que puedan usarse como volúmenes lógicos. No conoce específicamente formatos de metadatos o grupos de volúmenes.
El Mapeador de Dispositivos proporciona la base para varias tecnologías de alto nivel. Además del LVM, el multirutas del Mapeador de Dispositivos y el comando dmraid usan el Mapeador de Dispositivos. La interfaz de aplicación para el Mapeador de Dispositivos es la llamada de sistema ioctl. La interfaz de usuario es el comando dmsetup.
Los volúmenes lógicos de LVM se activan con el Mapeador de Dispositivos. Cada volumen lógico se traduce en un dispositivo asignado. Cada segmento se traduce en una línea en la tabla de mapas que describe el dispositivo. El Mapeador de Dispositivos soporta una variedad de destinos de mapas, incluyendo mapas lineales, mapas entrelazados y mapas de error. Por lo tanto, por ejemplo, dos discos pueden concatenarse en un volumen lógico con un par de mapas lineales, uno para cada disco. Cuando LVM2 crea un volumen, crea un dispositivo de mapas de dispositivo subyacente que se puede consultar con el comando dmsetup. Para información acerca del formato de dispositivos en una tabla de mapas, consulte la Sección A.1, “Tabla de Mapas de Dispositivo”. Para mayor información acerca del uso del comando dmsetup para solicitar un dispositivo, consulte la Sección A.2, “Comando dmsetup”.

A.1. Tabla de Mapas de Dispositivo

Un dispositivo asignado está definido por una tabla que especifica cómo asignar cada rango de sectores lógicos del dispositivo mediante la Tabla de Mapas de Dispositivos. La tabla para un dispositivo asignado está constituido por una lista de líneas de la forma:
start length mapping [mapping_parameters...]
En la primera línea la Tabla de Mapeador de Dispositivo, el parámetro start debe ser igual a 0. Los parámetros start + length en una línea deben ser iguales a start en la línea siguiente. Los parámetros especificados en una línea de la tabla de mapas depende del tipo de mapping especificado en la línea.
Los tamaños en el Mapeador de Dispositivos siempre se especifican en sectores (512 bytes).
Cuando un dispositivo se especifica como un parámetro de mapas en el Mapeador de Dispositivos, puede ser llamado por el nombre de dispositivo en el sistema de archivos (por ejemplo, /dev/hda) o por el número mayor o menor en el formato major:minor. Se prefiere el formato mayor:menor porque evita bloqueos de nombre de rutas.
A continuación se visualiza una muestra de tabla de mapas para un dispositivo. En esta tabla hay cuatro destinos lineales:
0 35258368 linear 8:48 65920
35258368 35258368 linear 8:32 65920
70516736 17694720 linear 8:16 17694976
88211456 17694720 linear 8:16 256
Los primeros 2 parámetros de cada línea son el segmento de bloque de inicio y la longitud del segmento. La siguiente palabra clave es el destino de mapa, la cual en todos los casos de este ejemplo es linear. Las líneas restantes constan de los parámetros para un destino linear.
Las siguientes subdivisiones describen el formato de los siguientes mapas:
  • lineal
  • entrelazado
  • espejo
  • instantánea e instantánea-origen
  • error
  • cero
  • multirutas
  • crypt

A.1.1. Destino de mapa lineal

Un destino de mapa lineal asigna un rango continuo de bloques en otro dispositivo de bloque. El formato de un destino lineal es el siguiente:
start length linear device offset
start
iniciando bloque en dispositivo virtual
length
longitud de este segmento
device
dispositivo de bloque, relacionado por el nombre de dispositivo en el sistema de archivos o por los números mayor y menor en el formato major:minor
offset
iniciando desplazamiento de mapas en el dispositivo
El siguiente ejemplo muestra un destino lineal con un bloque de inicio en el dispositivo virtual de 0, una longitud de segmento de 1638400, un número par mayor:menor de 8:2 e inicio de desplazamiento para el dispositivo de 41146992.
0 16384000 linear 8:2 41156992
El siguiente ejemplo muestra un destino lineal con el parámetro de dispositivo especificado como el dispositivo /dev/hda.
0 20971520 linear /dev/hda 384

A.1.2. Destino de mapas entrelazados

El destino de mapas entrelazados soporta franjas a través de dispositivos físicos. Recibe como argumento el número de franjas y el tamaño de la unidad seguido por una lista de pares del nombre de dispositivo y sector. El formato de un destino entrelazado es el siguiente:
start length striped #stripes chunk_size device1 offset1 ... deviceN offsetN
Hay una serie de parámetros device y offset para cada franja.
start
iniciando bloque en dispositivo virtual
length
longitud de este segmento
#stripes
número de franjas para el dispositivo virtual
cd chunk_size
número de sectores escritos para cada franja antes de cambiar a la siguiente; debe ser potencia de 2 al menos del tamaño de la página de kernel
device
dispositivo de bloque, relacionado por el nombre de dispositivo en el sistema de archivos o por los números mayor y menor en el formato major:minor.
offset
iniciando desplazamiento de mapas en el dispositivo
El siguiente ejemplo muestra un destino entrelazado con tres franjas y un tamaño de unidad de 128:
0 73728 striped 3 128 8:9 384 8:8 384 8:7 9789824
0
iniciando bloque en dispositivo virtual
73728
longitud de este segmento
entrelazado 3 128
franja a través de tres dispositivos con un tamaño de unidad de 128 bloques
8:9
números mayor:menor del primer dispositivo
384
iniciando desplazamiento del mapa en el primer dispositivo
8:8
números mayor:menor de segundo dispositivo
384
iniciando desplazamiento de mapas del segundo dispositivo
8:7
números mayor:menor del tercer dispositivo
9789824
iniciando desplazamiento de mapas en el tercer dispositivo
El ejemplo a continuación muestra un destino entrelazado para 2 franjas con unidades de 256 KiB, con los parámetros de dispositivo especificados por los nombres de dispositivo en el sistema de archivos y no por los números mayor y menor.
0 65536 striped 2 512 /dev/hda 0 /dev/hdb 0

A.1.3. Espejo de destino de mapa

El espejo de destino de mapa soporta el mapa de un dispositivo lógico en espejo. El formato de un destino en espejo es el siguiente:
start length mirror log_type #logargs logarg1 ... logargN #devs device1 offset1 ... deviceN offsetN
start
iniciando bloque en dispositivo virtual
length
longitud de este segmento
log_type
Los tipos posibles de registro y sus argumentos son los siguientes:
core
El espejo es local y el registro de espejo se mantiene en el núcleo de la memoria. Este tipo de registro recibe 1 - 3 argumentos:
regionsize [[no]sync] [block_on_error]
disk
El espejo es local y el registro de espejo se mantiene en disco. Este tipo de registro recibe 2 - 4 argumentos:
logdevice regionsize [[no]sync] [block_on_error]
clustered_core
El espejo es puesto en cluster y el registro de espejo se mantiene en el núcleo de memoria. Este tipo de registro recibe 2 - 4 argumentos:
regionsize UUID [[no]sync] [block_on_error]
clustered_disk
El espejo es puesto en cluster y el registro de espejo se guarda en el disco. Este tipo de registro recibe 3 - 5 argumentos:
logdevice regionsize UUID [[no]sync] [block_on_error]
LVM mantiene un registro pequeño que utiliza para mantener el rastro de las regiones que están sincronizadas con el espejo o espejos. El argumento regionsize especifica el tamaño de estas regiones.
En un entorno en cluster, el argumento UUID es un identificador único asociado con el dispositivo de registro de espejo para que el estado de registro se pueda mantener a través del cluster.
El argumento opcional [no]sync sirve para especificar el espejo como "in-sync" o "out-of-sync".El argumento block_on_error se utiliza para pedir al espejo que responda a errores en lugar de ignorarlos.
#log_args
número de argumentos de registro que serán especificados en el mapa
logargs
los argumentos de registro para el espejo; el número de registro de argumentos de registro provisto es especificado por el parámetro #log-args y los argumentos de registro válidos son determinados por el parámetro log_type.
#devs
el número de pilares en el espejo; el dispositivo y el desplazamiento se especifican para cada pilar.
device
dispositivo de bloque para cada pilar de espejo, relacionado por el nombre de dispositivo en el sistema de archivos o por los números mayor o menor en el formato major:minor. Un dispositivo de bloque y desplazamiento es especificado para cada pilar de espejo, como es indicado por el parámetro #devs.
offset
iniciando desplazamiento de mapas en el dispositivo. Un dispositivo de bloque y desplazamiento es especificado por cada pilar de espejo, como es indicado por el parámetro #devs.
El siguiente ejemplo muestra un espejo de destino de mapa para un espejo en cluster con un registro de espejo guardado en disco.
0 52428800 mirror clustered_disk 4 253:2 1024 UUID block_on_error 3 253:3 0 253:4 0 253:5 0
0
iniciando bloque en dispositivo virtual
52428800
longitud de este segmento
mirror clustered_disk
destino espejo con un tipo de registro especificando que el espejo está en cluster y el registro de espejo está guardado en disco
4
4 argumentos de registro de espejo seguirán
253:2
números mayor:menor del dispositivo de registro
1024
tamaño de región que el registro de espejo utiliza para guardar rastro de lo que está en sincronización
UUID
UUID de dispositivo de registro de espejo para mantener información de registro a través de un cluster
block_on_error
espejo debe responder a errores
3
número de pilares en espejo
253:3 0 253:4 0 253:5 0
números mayor:menor y desplazamiento para dispositivos que conforman cada pilar de espejo

A.1.4. Destinos de mapa instantánea e instantánea-origen

Para crear la primera instantánea LVM de un volumen, se utilizan cuatro Mapeadores de Dispositivos:
  1. Un dispositivo con un mapa linear conformado por la tabla de mapas del volumen de destino.
  2. Un dispositivo con un mapa linear utilizado como dispositivo de copia-escrita (COW) para el volumen de destino; para cada escritura, los datos originales se guardan en el dispositivo COW de cada instantánea para mantener el contenido visible sin cambios (hasta que el dispositivo COW se llene).
  3. Un dispositivo con un mapa de snapshot combinando #1 y #2, el cual es el volumen de instantánea visible
  4. El volumen "original" (que emplea el número de dispositivo utilizado por el volumen de fuente original), cuya tabla es remplazada por un mapa "snapshot-origin" desde el dispositivo #1.
Un esquema de nombre fijo sirve para crear estos dispositivos. Por ejemplo, podría utilizar los siguientes comandos para crear un volumen LVM llamado base y un volumen de instantánea llamado snap basado en ese volumen.
# lvcreate -L 1G -n base volumeGroup
# lvcreate -L 100M --snapshot -n snap volumeGroup/base
Se generan cuatro dispositivos, los cuales se pueden ver con los siguientes comandos:
# 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
El formato para el destino snapshot-origin es el siguiente:
start length snapshot-origin origin
start
iniciando bloque en dispositivo virtual
length
longitud de este segmento
origin
volumen de base de instantánea
El snapshot-origin normalmente tendrá una o más instantáneas de base. Las lecturas serán asignadas directamente al dispositivo de respaldo. Para cada escritura, los datos originales serán guardados en el dispositivo COW de cada instantánea para mantener su contenido visible sin cambios hasta que se llene el dispositivo COW.
El formato para el destino snapshot es el siguiente:
start length snapshot origin COW-device P|N chunksize
start
iniciando bloque en dispositivo virtual
length
longitud de este segmento
origin
volumen de base de instantánea
COW-device
Dispositivo en el cual las unidades cambiadas de datos son almacenadas
P|N
P (Persistente) o N (No persistente); indica si la instantánea sobrevivirá después del reinicio. Para instantáneas transitorias (N) se deben guardar menos metadatos en disco; estos pueden ser guardados en memoria por el kernel.
chunksize
Tamaño en sectores de unidades de datos cambiadas que serán almacenadas en el dispositivo COW.
El siguiente ejemplo muestra un destino snapshot-origin con un dispositivo de origen de 254:11.
0 2097152 snapshot-origin 254:11
El siguiente ejemplo muestra un destino de snapshot con un dispositivo de origen de 254:11 y un dispositivo COW de 254:12. Este dispositivo de instantánea persiste a través de reinicios y el tamaño de unidad para los datos almacenados en el dispositivo COW es de 16 sectores.
0 2097152 snapshot 254:11 254:12 P 16

A.1.5. Destino de mapa error

Con un destino de mapa error, cualquier operación de E/S para el sector mapeado falla.
Un destino de mapa error sirve para pruebas. Para probar cómo se comporta un dispositivo fallido, puede crear un mapa de dispositivo con un sector incorrecto en el medio de un dispositivo, o puede cambiar el pilar de un espejo y reemplazarlo por un destino de error.
Un destino de error puede ser utilizado en lugar de un dispositivo fallido, como una forma de evitar tiempos de espera y reintentos en el dispositivo real. Puede servir como un destimo intermedio mientras reorganiza los metadatos LVM durante las fallas.
El destino de mapas error solo recibe los parámetros start y length.
El siguiente ejemplo muestra un destino de error.
0 65536 error

A.1.6. Destino de mapas cero

El destino de mapas zero es un dispositivo de bloque equivalente de /dev/zero. Una operación de lectura para este mapa retorna bloques de ceros. Los datos escritos a este mapa son descartados, pero la escritura tiene éxito. El destino de mapas zero solo recibe los parámetros start y length.
El siguiente ejemplo muestra un destino zero para un dispositivo de 16TB.
0 65536 zero

A.1.7. Destino de mapas multirutas

El destino de mapas multirutas soporta el mapa de un dispositivo en multirutas. El formato para el destino multipath es el siguiente:
start length  multipath  #features [feature1 ... featureN] #handlerargs [handlerarg1 ... handlerargN] #pathgroups pathgroup pathgroupargs1 ... pathgroupargsN
Hay una serie de parámetros pathgroupargs para cada grupo de rutas.
start
iniciando bloque en dispositivo virtual
length
longitud de este segmento
#features
El número de funcionalidades de multirutas, acompañado por esas funcionalidades. Si este parámetro es cero, entonces no hay parámetro feature y el siguiente parámetro de mapa de dispositivos será #handlerargs. Actualmente, la funcionalidad multirutas soportada es queue_if_no_path. Esto indica que este dispositivo en multirutas se establece a operaciones de E/S de cola si no hay ninguna ruta disponible.
Por ejemplo, si la opción no_path_retry en el archivo multipath.conf se estableció a operaciones de E/S de cola solo hasta que todas las rutas hayan sido marcadas como fallidas después intentar el número de veces establecido para utilizar las rutas, el mapa aparecerá como sigue hasta que todos los controladores de ruta hayan fallado el número de controles especificado.
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
Después de que todos los controladores de ruta hayan fallado el número de controles especificado, el mapa aparecería así:
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
El número de argumentos del manejador de hardware, seguido por esos argumentos. Un manejador de hardware especifica un módulo que será utilizado para realizar acciones específicas de hardware al cambiar grupos de rutas o al manejar errores de E/S. Si se establece a 0, entonces el siguiente parámetro será #pathgroups.
#pathgroups
El número de grupos de ruta. Un grupo de ruta es una serie de rutas sobre las cuales un dispositivo en multirutas cargará equilibrio. Hay una serie de parámetros pathgroupargs para cada grupo de rutas.
pathgroup
El siguiente grupo de ruta para probar.
pathgroupsargs
Cada grupo de ruta consta de los siguientes argumentos:
pathselector #selectorargs #paths #pathargs device1 ioreqs1 ... deviceN ioreqsN 
Hay una serie de argumentos de ruta para cada ruta en el grupo de rutas.
pathselector
Especifica el algoritmo en uso para determinar qué ruta utilizar en este grupo de ruta para la siguiente operación de E/S.
#selectorargs
El número de argumentos de selector de ruta que sigue este argumento en el mapa de multirutas. Actualmente, el valor de este argumento es siempre 0.
#paths
El número de rutas en este grupo de rutas.
#pathargs
El número de argumentos de ruta especificado para cada ruta en este grupo. Actualmente este número es siempre 1, el argumento ioreqs.
device
El número de dispositivo de bloque del la ruta, relacionada por los números mayor y menor en el formato major:minor
ioreqs
El número de peticiones de E/S para dirigirse a esta ruta antes de cambiar a la próxima ruta en el grupo actual.
Figura A.1, “Destino de mapas multirutas” shows the format of a multipath target with two path groups.
Destino de mapas multirutas

Figura A.1. Destino de mapas multirutas

El siguiente ejemplo muestra una definición de destino de recuperación de fallos para el mismo dispositivo multirutas. En este destino hay tres grupos de cuatro grupos de ruta, con una sola ruta abierta por grupo de ruta para que el dispositivo en multirutas utilice solamente una ruta a la vez.
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
El siguiente ejemplo muestra una definición de destino de difusión total (multibus) para el mismo dispositivo en multirutas. En este destino hay únicamente un grupo de ruta, el cual incluye todas las demás rutas. En esta configuración, multirutas difunde la carga equitativamente a todas las rutas.
0 71014400 multipath 0 0 1 1 round-robin 0 4 1 66:112 1000 \
 67:176 1000 68:240 1000 65:48 1000
Para mayor información sobre multirutas, consulte el documento Uso de multirutas de Mapeador de Dispositivos.

A.1.8. Destino de mapas crypt

El destino crypt encripta los datos que pasan por el dispositivo especificado. Utiliza el Crypto API de kernel.
El formato para el destino crypt es el siguiente:
start length crypt cipher key IV-offset device offset
start
iniciando bloque en dispositivo virtual
length
longitud de este segmento
cipher
Cipher consta de cipher[-chainmode]-ivmode[:iv options].
cipher
Los cipher disponibles se listan en /proc/crypto (por ejemplo, aes).
chainmode
Siempre usan cbc. No utilice ebc; no utiliza un vector inicial (IV).
ivmode[:iv options]
IV es un vector inicial usado para variar la codificación. El modo IV es plain o essiv:hash. Un ivmode de -plain usa el número de sector (más desplazamiento IV) como el IV. Un ivmode de -essiv es una mejora para evitar la debilidad de la marca de agua digital.
key
Clave codificada, suministrada en hex
IV-offset
Desplazamiento de Vector inicial (IV)
device
dispositivo de bloque, relacionado por el nombre de dispositivo en el sistema de archivos o por los números mayor y menor en el formato major:minor
offset
iniciando desplazamiento de mapas en el dispositivo
El siguiente es un ejemplo de un destino crypt.
0 2097152 crypt aes-plain 0123456789abcdef0123456789abcdef 0 /dev/hda 0