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
lineardevice 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
mirrorlog_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 argumentoblock_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ámetrolog_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:
- Un dispositivo con un mapa
linear
conformado por la tabla de mapas del volumen de destino. - 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). - Un dispositivo con un mapa de
snapshot
combinando #1 y #2, el cual es el volumen de instantánea visible - 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-originorigin
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
snapshotorigin COW-device
P|Nchunksize
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 esqueue_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ónno_path_retry
en el archivomultipath.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.
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
cryptcipher 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 utiliceebc
; 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
oessiv:hash
. Univmode
de-plain
usa el número de sector (más desplazamiento IV) como el IV. Univmode
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