Appendice A. Device Mapper

Il Device Mapper è un driver del kernel in grado di fornire una struttura generica per la gestione del volume. Fornisce un metodo generico per la creazione di dispositivi mappati, i quali possono essere usati come logical volume. Esso non è a conoscenza dei gruppi di volumi o dei formati dei metadata.
Il Device Mapper fornisce la base per un numero di tecnologie di livello superiore. In aggiunta a LVM, il Device-Mapper multipath ed il comando dmraid utilizzano il Device Mapper. L'interfaccia dell'applicazione per il Device Mapper è la chiamata del sistema ioctl. L'interfaccia utente è il comando 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 Sezione A.1, «Tabella di mappatura del dispositivo». For information about using the dmsetup command to query a device, see Sezione A.2, «Il comando dmsetup».

A.1. Tabella di mappatura del dispositivo

Il dispositivo mappato viene definito da una tabella la quale specifica come mappare ogni gamma dei settori logici del dispositivo, utilizzando una mappatura supportata della Tabella del dispositivo. La tabella per un dispositivo mappato viene creata da un elenco di righe dal formato:
start length mapping [mapping_parameters...]
Nella prima riga di una tabella del Device Mapper il parametro start deve essere uguale a 0. I parametri start + length su di una riga, devono essere uguali a start sulla riga successiva. I parametri di mappatura da specificare sulla riga della tabella, dipendono dal tipo di mapping specificato sulla riga.
Le dimensioni nel Device Mapper sono sempre specificate in settori (512 byte).
Quando un dispositivo viene specificato come parametro di mappatura nel Device Mapper, esso può essere indicato con il nome del dispositivo all'interno del filesystem (per esempio /dev/hda), o dai numeri minore e maggiore nel formato major:minor. Il formato major:minor viene preferito poichè evita i lookup del percorso.
Di seguito viene riportato un esempio di tabella di mappatura per un dispositivo. In questa tabella sono presenti quattro destinazioni lineari:
0 35258368 linear 8:48 65920
35258368 35258368 linear 8:32 65920
70516736 17694720 linear 8:16 17694976
88211456 17694720 linear 8:16 256
Nei primi 2 parametri di ogni riga vengono riportati il blocco d'inizio del segmento e la sua lunghezza. Il parametro successivo è il target di mappatura, il quale in qualsiasi altro caso in questo esempio è lineare. Il resto della riga consiste in parametri per un target lineare.
Le seguenti sottosezioni descrivono il formato delle seguenti mappature:
  • lineare
  • striped
  • mirror
  • snapshot e snapshot-origin
  • error
  • zero
  • multipath
  • crypt

A.1.1. Target di mappatura lineare

Un target di mappatura lineare mappa una gamma continua di blocchi su un altro dispositivo a blocchi. Il formato di un target lineare è il seguente:
start length linear device offset
start
blocco iniziale in un dispositivo virtuale
length
lunghezza di questo segmento
device
dispositivo a blocchi, indicato dal nome del dispositivo nel filesystem o dai numeri maggiore e minore nel formato major:minor
offset
offset iniziale della mappatura sul dispositivo
Il seguente esempio mostra un target lineare con un blocco iniziale nel dispositivo virtuale di 0, una lunghezza del segmento di 1638400, una coppia di numeri major:minor 8:2, ed un offset iniziale per il dispositivo di 41146992.
0 16384000 linear 8:2 41156992
Il seguente esempio mostra un target lineare con /dev/hda specificato come parametro del dispositivo.
0 20971520 linear /dev/hda 384

A.1.2. Target di mappatura striped

Il target di mappatura striped supporta il processo di stripping attraverso i dispositivi fisici. Accetta come argomenti il numero di strisce e la dimensione del segmento, seguiti da un elenco del settore e nome del dispositivo. Il formato di un target striped è il seguente:
start length striped #stripes chunk_size device1 offset1 ... deviceN offsetN
È disponibile un set di parametri device e offset per ogni striscia.
start
blocco iniziale in un dispositivo virtuale
length
lunghezza di questo segmento
#stripes
numero di strisce per il dispositivo virtuale
chunk_size
numero dei settori scritti su ogni fascia prima di smistarsi su quella successiva; deve essere una potenza di 2 e grande almeno quanto la dimensione della pagina del kernel
device
dispositivo a blocchi, indicato dal nome del dispositivo nel filesystem o dai numeri maggiore e minore nel formato major:minor.
offset
offset iniziale della mappatura sul dispositivo
Il seguente esempio mostra un target striped con tre strisce ed un segmento con una dimensione di 128:
0 73728 striped 3 128 8:9 384 8:8 384 8:7 9789824
0
blocco iniziale in un dispositivo virtuale
73728
lunghezza di questo segmento
striped 3 128
striscia attraverso tre dispositivi con un segmento di 128 blocchi
8:9
major:minor numeri del primo dispositivo
384
offset d'avvio della mappatura sul primo dispositivo
8:8
numeri major:minor del secondo dispositivo
384
offset d'inizio della mappatura sul secondo dispositivo
8:7
numeri major:minor del terzo dispositivo
9789824
offset d'inizio della mappatura sul terzo dispositivo
Il seguente esempio mostra un target striped per due strisce con segmenti di 256 KiB, con i parametri specificati dai nomi dei dispositivi nel file sistem, e non dai numeri major e minor.
0 65536 striped 2 512 /dev/hda 0 /dev/hdb 0

A.1.3. Il target di mappatura mirror

Il target di mappatura mirror supporta una mappatura di un dispositivo logico speculare. Il formato di un target speculare è il seguente:
start length mirror log_type #logargs logarg1 ... logargN #devs device1 offset1 ... deviceN offsetN
start
blocco iniziale in un dispositivo virtuale
length
lunghezza di questo segmento
log_type
I tipi possibili di log ed i rispettivi argomenti sono di seguito riportati:
core
Il mirror è locale ed il mirror log viene conservato nella memoria principale. Questo tipo di log richiede 1 - 3 argomenti:
regionsize [[no]sync] [block_on_error]
disk
Il mirror è locale ed il mirror log viene conservato sul disco. Questo tipo di log richiede 2 - 4 argomenti:
logdevice regionsize [[no]sync] [block_on_error]
clustered_core
Il mirror è clusterizzato ed il mirror log viene conservato nella memoria principale. Questo tipo di log richiede 2 - 4 argomenti:
regionsize UUID [[no]sync] [block_on_error]
clustered_disk
Il mirror è clusterizzato ed il mirror log viene conservato sul disco. Questo tipo di log richiede 3 - 5 argomenti:
logdevice regionsize UUID [[no]sync] [block_on_error]
LVM conserva un piccolo log il quale viene utilizzato per controllare le regioni in sincronizzazione con i mirror. L'argomento regionsize specifica la dimensione di queste regioni.
In un ambiente clusterizzato l'argomento UUID è un identificatore unico associato con il dispositivo mirror log, in modo da poter mantenere lo stato del log sull'intero 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
numero di argomenti di log che verranno specificati nella mappatura.
logargs
gli argomenti di log per il mirror; il numero di argomenti di log forniti viene specificato dal parametro #log-args, e gli argomenti di log validi sono determinati dal parametro log_type.
#devs
il numero di gambe (o sezioni) nel mirror; viene specificato un dispositivo ed un offset per ogni sezione.
device
dispositivo a blocchi per ogni gamba del mirror, indicato dal nome del dispositivo nel filesystem o dai numeri major e minor nel formato major:minor. Un dispositivo a blocchi e l'offset sono specificati per ogni gamba del mirror, come riportato dal parametro #devs.
offset
offset d'inizio per la mappatura sul dispositivo. Un dispositivo a blocchi ed un offset sono specificati per ogni gamba del mirror, come indicato dal parametro #devs.
Il seguente esempio mostra un target di mappatura del mirror per un mirror clusterizzato con un mirror log sul 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
blocco iniziale in un dispositivo virtuale
52428800
lunghezza di questo segmento
mirror clustered_disk
target del mirror con un tipo di log il quale specifica un mirror clusterizzato con un mirror log conservato sul disco
4
seguiranno 4 argomenti del mirror log
253:2
major:minor numeri del dispositivo di log
1024
dimensione della regione usata dal mirror log per controllare tutto ciò che è sincronizzato
UUID
UUID del dispositivo del mirror log per conservare le informazioni di un intero cluster
block_on_error
il mirror dovrebbe rispondere agli errori
3
numero di gambe nel mirror
253:3 0 253:4 0 253:5 0
numeri major:minor e offset per dispositivi che costituiscono ogni gamba del mirror

A.1.4. Target di mappatura snapshot e snapshot-origin

Quando si crea la prima snapshot LVM di un volume, vengono utilizzati quattro dispositivi Device Mapper:
  1. Un dispositivo con una mappatura lineare contenente la tabella di mappatura originale del volume sorgente.
  2. Un dispositivo con una mappatura lineare utilizzato come dispositivo copy-on-write (COW) per il volume sorgente; per ogni scrittura, i dati originali vengono salvati nel dispositivo COW di ogni snapshot per mantenere il proprio contenuto visibile invariato (fino al riempimento del dispositivo COW).
  3. Un dispositivo con una mappatura snapshot che combina #1 e #2, il quale risulta essere il volume snapshot visibile.
  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.
Uno schema fisso per i nomi usato per creare questi dispositivi. Per esempio, è possibile utilizzare i seguenti comandi per creare un volume LVM chiamato base, ed un volume snapshot chiamato snap basato sul quel volume.
# lvcreate -L 1G -n base volumeGroup
# lvcreate -L 100M --snapshot -n snap volumeGroup/base
Questo genera quattro dispositivi i quali verranno visualizzati con i seguenti comandi:
# 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
Il formato per il target snapshot-origin è il seguente:
start length snapshot-origin origin
start
blocco iniziale in un dispositivo virtuale
length
lunghezza di questo segmento
origin
volume di base di snapshot
snapshot-origin avrà normalmente uno o più snapshot basati su di esso. I processi di lettura verranno mappati direttamente sul dispositivo di supporto. Per ogni processo di scrittura, i dati originali saranno salvati nel dispositivo COW di ogni snapshot, in modo da mantenere il proprio contenuto visibile invariato fino all'utilizzo completo del dispositivo COW.
Il formato per il target snapshot è il seguente:
start length snapshot origin COW-device P|N chunksize
start
blocco iniziale in un dispositivo virtuale
length
lunghezza di questo segmento
origin
volume di base di snapshot
COW-device
Dispositivo sul quale vengono conservati sezioni di dati modificati
P|N
P (Persistent) o N (Not persistent); indicano se snapshot sopravviverà dopo il riavvio. Per snapshot transitorie (N), una quantità minore di metadata deve essere salvata sul disco; essi possono essere conservati in memoria dal kernel.
chunksize
Dimensione in settori dei segmenti modificati di dati che verranno conservati sul dispositivo COW.
Il seguente esempio mostra un terget snapshot-origin con un dispositivo d'origine di 254:11.
0 2097152 snapshot-origin 254:11
Il seguente esempio mostra un target snapshot con un dispositivo d'origine di 254:11, ed un dispositivo COW di 254:12. Il dispositivo snapshot è persistente dopo ogni riavvio e la dimensione del segmento per i dati conservati sul dispositivo COW è di 16 settori.
0 2097152 snapshot 254:11 254:12 P 16

A.1.5. Il target di mappatura error

Con un target di mappatura error, qualsiasi operazione I/O per il settore mappato fallirà.
Un target di mappatura error può essere utilizzato a scopo di prova. Per provare il comportamento di un dispositivo durante una condizione d'errore, create una mappatura del dispositivo con un settore corrotto nel mezzo del dispositivo stesso, oppure cambiate la gamba di un mirror e sostituitela con un target error.
È possibile utilizzare un target error al posto di un dispositivo corrotto, così facendo eviterete sospensioni o vari tentativi sul dispositivo in questione. Esso può servire come target intermediario mentre cercherete di riorganizzare i metadata LVM in presenza di processi falliti.
Il target di mappatura error non accetta parametri aggiuntivi oltre ai parametri start e length.
Il seguente esempio mostra un target error.
0 65536 error

A.1.6. Target di mappatura zero

Il target di mappatura zero è un dispositivo a blocchi equivalente a /dev/zero. Un processo di lettura per questo tipo di mappatura ritorna blocchi di zero. I dati scritti su questa mappatura vengono scartati, ma il processo di scrittura avrà successo. Il target di mappatura zero non accetta parametri aggiuntivi oltre ai parametri start e length.
Il seguente esempio mostra un target zero per un dispositivo a 16Tb.
0 65536 zero

A.1.7. Il target di mappatura multipath

Il target di mappatura multipath supporta la mappatura di un dispositivo 'multipathed'. Il formato per il target multipath è il seguente:
start length  multipath  #features [feature1 ... featureN] #handlerargs [handlerarg1 ... handlerargN] #pathgroups pathgroup pathgroupargs1 ... pathgroupargsN
È disponibile un set di parametri pathgroupargs per ogni gruppo di percorsi.
start
blocco iniziale in un dispositivo virtuale
length
lunghezza di questo segmento
#features
Il numero di funzioni multipath, seguito dalle funzioni in questione. Se questo parametro è zero allora non sarà disponibile alcun parametrofeature, ed il parametro di mappatura del dispositivo successivo è #handlerargs. Attualmente è supportata solo una funzione multipath, queue_if_no_path. Ciò indica che il dispositivo 'multipathed' in questone è attualmente impostato per mettere in coda le operazioni I/O se non è disponibile alcun percorso.
Per esempio, se l'opzione no_path_retry, nel file multipath.conf, è stata impostata in modo da mettere in coda le operazioni I/O solo fino a quando tutti i percorsi sono stati contrassegnati come falliti dopo un certo numero di tentativi fatti per utilizzare il percorso in questione, la mappatura apparirà nel modo seguente fino a quando tutti i controllori del percorso non avranno fallito il numero di controlli specificato.
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
Dopo che tutti i controllori del percorso hanno fallito il numero di controlli specificato, la mappatura apparirà nel modo seguente.
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
Il numero di argomenti del gestore hardware seguito dagli argomenti. Un gestore hardware specifica il modulo che verrà utilizzato, per eseguire le azioni hardware specifiche durante lo smistamento tra gruppi dei percorsi o durante la gestione degli errori I/O. Se impostato su 0 il parametro successivo è #pathgroups.
#pathgroups
Il numero dei gruppi di percorsi. Un gruppo di percorsi rappresenta un insieme di percorsi attraverso i quali un dispositivo 'multipathed' bilancerà il carico. È disponibile un set di parametri pathgroupargs per ogni gruppo di percorsi.
pathgroup
Il gruppo di percorsi successivo da provare.
pathgroupsargs
Ogni gruppo di percorsi presenta i seguenti argomenti:
pathselector #selectorargs #paths #pathargs device1 ioreqs1 ... deviceN ioreqsN 
È disponibile un set di argomenti per ogni percorso presente nel gruppo di percorsi.
pathselector
Specifica l'algoritmo utilizzato per determinare il percorso, presente all'interno del gruppo, da utilizzare per l'operazione I/O successiva.
#selectorargs
Il numero di argomenti del selettore del percorso che segue questo argomento nella mappatura multipath. Attualmente il valore di questo argomento è sempre 0.
#paths
Il numero di percorsi in questo gruppo di percorsi.
#pathargs
Il numero di argomenti del percorso specificati per ogni percorso in questo gruppo. Attualmente questo numero è sempre 1, l'argomento ioreqs.
device
Il numero del dispositivo a blocchi del percorso, indicato dai numeri major e minor nel formato major:minor
ioreqs
Il numero delle richieste I/O per l'instradamento per questo percorso prima di smistarsi sul percorso successivo nel gruppo corrente.
Figura A.1, «Target di mappatura Multipath» shows the format of a multipath target with two path groups.
Target di mappatura Multipath

Figura A.1. Target di mappatura Multipath

Il seguente esempio mostra una definizione del target di failover per lo stesso dispositivo multipath. In questo target sono presenti quattro gruppi di percorsi con un solo percorso aperto per gruppo, in questo modo il dispositivo multipathed userà solo un percorso per volta.
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
Il seguente esempio mostra una definizione completa del target (multibus) per lo stesso dispositivo multipathed. In questo target è presente un solo gruppo di percorsi in quale include tutti i percorsi. Con questa impostazione multipath suddivide il carico in modo uniforme su tutti i percorsi.
0 71014400 multipath 0 0 1 1 round-robin 0 4 1 66:112 1000 \
 67:176 1000 68:240 1000 65:48 1000
Per maggiori informazioni sul multipathing consultare la documentazione Come utilizzare il Device Mapper Multipath

A.1.8. Target di mappatura crypt

Il target crypt cifra i dati che passano attraverso il dispositivo specificato. Esso utilizza il kernel Crypto API.
Il formato per il target crypt è il seguente:
start length crypt cipher key IV-offset device offset
start
blocco iniziale in un dispositivo virtuale
length
lunghezza di questo segmento
cipher
Cipher consiste di cipher[-chainmode]-ivmode[:iv options].
cipher
I Cipher disponibili sono riportati in /proc/crypto (per esempio, aes).
chainmode
Utilizza sempre cbc. Non utilizzare ebc; esso non utilizza un initial vector (IV).
ivmode[:iv options]
IV è un initial vector utilizzato per variare la cifratura. La modalità IV può essere plain o essiv:hash. Un ivmode di -plain utilizza il numero del settore (più l'offset IV) di IV. Un ivmode di -essiv è il modo migliore per non avere problemi con il watermark.
key
Chiave di cifratura fornita in esadecimale
IV-offset
Offset Initial Vector (IV)
device
dispositivo a blocchi, indicato dal nome del dispositivo nel filesystem o dai numeri maggiore e minore nel formato major:minor
offset
offset iniziale della mappatura sul dispositivo
Il seguente è un esempio di un target crypt.
0 2097152 crypt aes-plain 0123456789abcdef0123456789abcdef 0 /dev/hda 0