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
lineardevice 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
mirrorlog_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". Theblock_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 parametrolog_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:
- Un dispositivo con una mappatura
lineare
contenente la tabella di mappatura originale del volume sorgente. - 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). - Un dispositivo con una mappatura
snapshot
che combina #1 e #2, il quale risulta essere il volume snapshot visibile. - 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-originorigin
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
snapshotorigin COW-device
P|Nchunksize
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 parametro
feature
, 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'opzioneno_path_retry
, nel filemultipath.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.
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
cryptcipher 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 utilizzareebc
; 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
oessiv:hash
. Univmode
di-plain
utilizza il numero del settore (più l'offset IV) di IV. Univmode
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