Device Mapper
Der Device Mapper ist ein Teil des Linux-Kernels (seit 2.6). Er erlaubt die Erzeugung virtueller blockorientierter GerĂ€te, indem er deren Adressbereich auf andere blockorientierte GerĂ€te oder spezielle Funktionen abbildet. Der Device Mapper wird vor allem fĂŒr den Logical Volume Manager (LVM) und GerĂ€teverschlĂŒsselung genutzt. Der Device Mapper stellt einige Funktionen zur VerfĂŒgung, die LVM benötigt (und die in frĂŒheren Linux-Versionen integraler Bestandteil von LVM waren): Erzeugung und Verwaltung der blockorientierten GerĂ€te, Snapshots (inklusive ZurĂŒckschreiben der Ănderungen ins UrsprungsgerĂ€t (âMergeâ)) sowie diverse RAID-Funktionen.
Dank der Herauslösung aus LVM können diese Funktionen nun auch mit anderen blockorientierten GerĂ€ten (z. B. Festplatten(partitionen) und loop devices) genutzt werden. LVM und cryptsetup (LUKS) stellen Funktionen einer höheren Ebene zur VerfĂŒgung und schirmen den Benutzer so von den Details ab, die fĂŒr den unmittelbaren Umgang mit dem Device Mapper (dmsetup) erforderlich sind. GerĂ€te des Device Mappers können im laufenden Betrieb (beschreibbar eingehĂ€ngtes Dateisystem) blockiert und weitgehend umkonfiguriert werden. DafĂŒr gibt es zwei Mechanismen:
- Device-Mapper-GerĂ€te haben zwei Tabellen. Im laufenden Betrieb kann die inaktive Tabelle geladen und dann zwischen den beiden umgeschaltet werden. DafĂŒr wird zunĂ€chst der normale Zugriff auf das GerĂ€t gestoppt: Alle zu dem Zeitpunkt diesem GerĂ€t zugewiesenen I/O requests werden noch auf die alte Tabelle geschrieben. Ab diesem Moment entstehende I/O requests werden blockiert. Dies entspricht diesen drei Kommandoaufrufen:
dmsetup reloaddmsetup suspenddmsetup resume
- Nachrichten an das GerÀt. Mit
dmsetup messagekönnen (je nach Target) Nachrichten an ein Device-Mapper-GerĂ€t geschickt werden. So werden thin snapshots nicht ĂŒber eine neue Tabellenkonfiguration erzeugt, sondern ĂŒber solche Nachrichten.
Seit der Kernelversion 3.2[1] unterstĂŒtzt der Device Mapper auch Thin Provisioning. Ăhnlich wie LVM setzt auch die Multipath-Funktion (auĂer bei NVMes) auf dem Device Mapper auf. Device Mapper kann Trim- / Discard-Befehle an das ĂŒbergeordnete GerĂ€t durchreichen.
Aufbau von GerÀten des Device Mappers
[Bearbeiten | Quelltext bearbeiten]GerĂ€te werden mit Hilfe des Device Mappers erzeugt, indem man dem Konsolenprogramm dmsetup neben dem Namen des GerĂ€ts folgende Daten ĂŒbergibt:
- Startsektor
- Anzahl aufeinanderfolgender Sektoren mit demselben Ziel
- Zieltyp (Target)
- zielspezifische Argumente
Die Definition eines GerÀts kann aus einem einzelnen oder mehreren solchen Blöcken bestehen. So kann man mit der folgenden Konfiguration zwei Festplatten (je 100 GiB) zu einem einzigen logischen Laufwerk verbinden:
0 209715200 linear /dev/sdb 0
209715200 209715200 linear /dev/sdc 0
Die vom Device Mapper erzeugten GerĂ€te erscheinen unter /dev/mapper/ mit dem dmsetup ĂŒbergebenen Namen und unter /sys/block/ mit den Kernelnamen (dm-0, dm-1, ...).
Ăber dmsetup kann das Zusammenspiel der Manipulation von DM-GerĂ€ten mit udev gesteuert werden. Ăber den Daemon dmeventd kann auĂerdem auf Ereignisse reagiert werden, die DM-GerĂ€te betreffen (etwa zur Neige gehender Speicherplatz bei thin provisioning).
Ăber
dmsetup lsdmsetup ls --treeundls -ld /sys/devices/virtual/block/dm-*
kann man sich die bestehenden Device-Mapper-GerÀte anzeigen lassen. Mit
dmsetup depsdmsetup infodmsetup statusdmsetup table
kann man sich Informationen ĂŒber ein GerĂ€t anzeigen lassen.
Zusammenhang von Device Mapper und LVM
[Bearbeiten | Quelltext bearbeiten]LVM teilt dem Device Mapper mit, welche Blöcke auf einem GerÀt in welcher Reihenfolge zu einem logischen Laufwerk gehören. Nach dem Anlegen des GerÀts ist nicht mehr erkennbar, dass es sich um ein LVM-GerÀt handelt; man könnte diese Zuweisung auch selber vornehmen (mit dmsetup). Zwei nacheinander per LVM erzeugte Laufwerke stellen sich im Device Mapper beispielsweise so dar:
0 25165824 linear 8:8 3840 204800 linear 8:8 29360512
8:8 sind major und minor number fĂŒr /dev/sda8, die zweite Zahl gibt die GröĂe an, die letzte den Offset zum Startsektor der Partition (nicht 0 wegen der LVM-Metadaten).
Aufbau von Snapshots
[Bearbeiten | Quelltext bearbeiten]Dieser Abschnitt bezieht sich auf Snapshots von Volumes, die nicht Teil eines thin-pool Volumes sind, also auf das alte Verfahren. Snapshots werden meist per LVM erzeugt. Die LVM-Programme zeigen dann nur zwei Objekte an: das Ursprungslaufwerk und das Snapshotlaufwerk. AuĂerdem besteht derzeit die Restriktion, dass LVM nur Snapshotlaufwerke in derselben volume group wie das Ursprungslaufwerk anlegen kann. Dies ist eine BeschrĂ€nkung des Verwaltungsprogramms (lvcreate), keine des Device Mappers. Aus dessen Sicht existieren nicht zwei, sondern vier GerĂ€te (Snapshot vom logical volume (LV) test in der volume group (VG) vg0, Name des Snapshot-LV ist test-snap):
vg0-testvg0-test-realvg0-test--snapvg0-test--snap-cow
Das ursprĂŒngliche GerĂ€t vg0-test wird vom Zieltyp linear umgeschrieben auf snapshot-origin, vg0-test-real hat die ursprĂŒngliche Definition von vg0-test, unter vg0-test--snap wird die Snapshotsicht auf das Ursprungslaufwerk verfĂŒgbar gemacht, und vg0-test--snap-cow ist das GerĂ€t, in dem per Copy-On-Write (COW) die nach Erzeugung des Snapshots am UrsprungsgerĂ€t vorgenommenen Ănderungen protokolliert werden. Dies sind Snapshots auf GerĂ€te-, nicht auf Dateisystemebene. Werden weitere Snapshots erzeugt, wird aus LVM-Sicht jeweils ein zusĂ€tzliches Laufwerk erzeugt, aus Sicht des Device Mappers jeweils zwei (Snapshot und COW).
Zusammenhang von Device Mapper und LUKS
[Bearbeiten | Quelltext bearbeiten]LUKS-Volumes haben einen Header-Bereich (im folgenden Beispiel zwei MiB), der Rest speichert die verschlĂŒsselten Daten. Die Verwaltungswerkzeuge lesen aus dem Header die nötigen Parameter und legen ĂŒber den Rest ein mit diesen Parametern konfiguriertes DM-Volume. Ein LUKS-Volume muss kein LVM-Volume sein. Beispielhaft ein 100-MiB-Volume:
blockdev --getsz /dev/linux/lukstest
204800
Das von LUKS darin angelegte, verschlĂŒsselte Volume ist etwas kleiner:
blockdev --getsz /dev/mapper/lukstest
200704
Der Device Mapper sieht das Volume folgendermaĂen (SchlĂŒssel gekĂŒrzt):
dmsetup table lukstest --showkeys
0 200704 crypt aes-cbc-essiv:sha256 bff5[...] 0 253:10 4096
Wie schon bei LVM (Snapshots) gehen bei LUKS die Möglichkeiten des Device Mappers (bzw. von dmsetup) ĂŒber die der Verwaltungsprogramme hinaus. So ist es ĂŒber die dmsetup-Funktionen load, suspend und resume möglich, die GröĂe eines eingehĂ€ngten Volumes zu Ă€ndern, was cryptsetup nicht erlaubt.
Thin Provisioning
[Bearbeiten | Quelltext bearbeiten]Mit der Version 3.2 wurden die Targets thin und thin-pool[2] Bestandteil des Linux-Kernels. Diese Targets funktionieren so, dass zunĂ€chst ein Volume fĂŒr Metadaten (in der GröĂe des maximalen Ausbaus; 4 MiB Metadaten und 16 MiB BlockgröĂe reichen fĂŒr etwa 1,3 TiB virtueller KapazitĂ€t) und eins fĂŒr Daten (mindestens in der GröĂe des minimalen Ausbaus) erzeugt wird. Diese beiden Volumes werden dann ĂŒber das Target thin-pool verbunden. Der Pool kann mehrere Volumes (und Snapshots von diesen) enthalten. Diese werden ĂŒber Nachrichten an das pool device erzeugt (dmsetup message). Im Gegensatz zu den sonstigen vom Device Mapper erzeugten GerĂ€ten kann das pool device nicht direkt als blockorientiertes GerĂ€t beschrieben werden. Ăber das Target thin werden dann die als normale blockorientierte GerĂ€te ansprechbaren Objekte erzeugt (deren GröĂe spĂ€ter erhöht und verringert werden kann). Die Integration der Snapshotfunktion in das pool device reduziert nicht nur Speicherverbrauch auf den jeweils aktuell nötigen Wert (was eine gröĂere Anzahl von Snapshots ermöglicht), sondern verringert durch eine interne Umorganisation der Snapshotverwaltung den Performanceverlust bei verketteten Snapshots. Mehrere Snapshots können sich Blöcke teilen, so dass nur einmal Speicherplatz belegt wird, die Daten aber in mehreren Volumes sichtbar sind.
Thin Provisioning unterstĂŒtzt die primĂ€r fĂŒr SSDs gedachte Funktion TRIM. Der Sinn dieser Funktion liegt allerdings nicht in den Eigenschaften und dem Schutz der darunter liegenden Hardware, sondern im Sparen von Speicherplatz, was wegen dessen Ăberbelegung von Bedeutung ist.
Thin Provisioning kann auch als eine Art Snapshot ĂŒber ein Nur-Lese-BlockgerĂ€t gelegt werden.
RAID
[Bearbeiten | Quelltext bearbeiten]Device Mapper nutzt die MD-Funktionen (SoftRAID, multiple devices). FrĂŒhere Versionen hatten ein gesondertes mirror Target. LVM kann (mit lvconvert) GerĂ€te im alten Format ins neue konvertieren.
Caching
[Bearbeiten | Quelltext bearbeiten]Der Device Mapper unterstĂŒtzt Caching (etwa auf einer NVMe fĂŒr eine gröĂere HDD) ĂŒber zwei Targets, die beide ĂŒber LVM genutzt werden können:
dm-cachedm-writecache
dm-cache kann Lese- und Schreibzugriffe cachen; es kann auf writeback und writethrough konfiguriert werden.
dm-writecache cacht keine Lesezugriffe und puffert Schreibzugriffe. Wie lange diese maximal gepuffert werden und ab welchem FĂŒllstand automatisch Daten auf das OriginalgerĂ€t zurĂŒckgeschrieben werden, kann konfiguriert werden.
Multipath
[Bearbeiten | Quelltext bearbeiten]Professionelle Speichersysteme mit einem hohen Anspruch an Redundanz bieten analog zu RAID (dieselben Daten auf mehreren GerĂ€ten; Schutz vor dem Ausfall des eigentlichen Speichermediums) die Möglichkeit, auf unterschiedlichen Wegen auf dasselbe Speichermedium zuzugreifen (Schutz vor Ausfall eines der GerĂ€te, die den Rechner mit dem Speichermedium verbinden). Dies wird vor allem bei Systemen auf Basis von Fibre Channel genutzt. Softwareseitig ist wichtig, dass das Speichermedium ĂŒber einen festen Namen ansprechbar ist, der unabhĂ€ngig davon ist, auf welchem Weg auf das Medium zugegriffen wird. Dies wird ĂŒber das Target multipath erreicht, das ĂŒber viele Optionen konfiguriert werden und dadurch sogar Geschwindigkeitsunterschiede zwischen alternativen Wegen zum Speichermedium ausgleichen kann.
Targets
[Bearbeiten | Quelltext bearbeiten]| Target | via LVM | Funktion | |
|---|---|---|---|
| direkte Abbildung des Speichers auf ein anderes GerÀt | linear | ja | Abbildung auf einen oder mehrere Bereiche eines BlockgerÀts |
| zoned | nein | prĂ€sentiert eine Zonen-Festplatte (SCSI: Zoned Block Command (ZBC); ATA: Zoned-device ATA command set (ZAC)) als normales BlockgerĂ€t und fĂŒhrt die nötigen Anpassungen zur Vermeidung eines Geschwindigkeits-Einbruchs im Hintergrund durch | |
| ebs | nein | entspricht linear, aber emuliert ein BlockgerĂ€t mit kleinerer BlockgröĂe | |
| era | nein | entspricht linear, aber erfasst fĂŒr die einzelnen Regionen des Speichers, wann sie zuletzt beschrieben wurden | |
| multipath | nein | Multipath | |
| Abbildung des Speichers auf mehrere GerÀte | striped | ja | nichtredundante Verteilung der Daten auf mehrere GerÀte; entspricht RAID-Level 0 |
| raid | ja | RAID-Level 0, 1, 4, 5 (diverse Varianten), 6 (diverse Varianten), 10 | |
| unstriped | nein | Umkehrung von striped, um logisch auf ein UrsprungsgerĂ€t zugreifen zu können, ohne direkt physisch darauf zugreifen zu mĂŒssen | |
| switch | nein | entspricht linear, aber fĂŒr eine riesige Anzahl von Speicherbereichen, so dass die Verwendung von linear ineffizient wĂ€re | |
| (thickLVM) Snapshots | snapshot-origin | ja | Vorbereitung eines BlockgerĂ€ts fĂŒr die Erstellung von Snapshots |
| snapshot | ja | Erstellen eines Snapshots (mehrere können gleichzeitig existieren) | |
| snapshot-merge | ja | Ăbernahme der seit dem Snapshot geschriebenen Daten in das UrsprungsgerĂ€t | |
| thin provisioning | thin-pool | ja | Thin-Provisioning-Speicherpool und -Metadaten (mit Snapshots); Vorbereitung fĂŒr die Erstellung eines Thin-Provisioning-BlockgerĂ€ts |
| thin | ja | Thin-Provisioning-BlockgerÀt | |
| vdo | ja | virtual data optimizer: Deduplikation | |
| Caching | cache | ja | Lese- (writethrough) oder Schreib-Lese-Cache (writeback) |
| writecache | ja | Schreibpuffer / Schreibcache | |
| clone | nein | Kopiert den Inhalt eines (langsamen) Nur-lese-BlockgerÀts bei jedem Lese- oder Schreibzugriff auf einen neuen Speicherbereich | |
| pcache | nein | Ermöglicht den (Cache-)Zugriff auf DAX-Speicher | |
| VerschlĂŒsselung / IntegritĂ€tssicherung | crypt | nein | VerschlĂŒsselung (v. a. fĂŒr LUKS); kann in Kombination mit dm-integrity die Hashwerte verschlĂŒsseln, so dass ein Offline-Angreifer (ohne den SchlĂŒssel) die Daten nicht unbemerkt verĂ€ndern kann |
| integrity | ja | Sicherung der einzelnen Blöcke mit Hashwerten (können von dm-crypt bereitgestellt werden) oder PrĂŒfsummen auf einem beschreibbaren GerĂ€t | |
| ima | nein | Interface diverser Device-Mapper-Targets zur Linux Integrity Measurement Architecture | |
| verity | nein | Sicherung eines kompletten Nur-lese-BlockgerĂ€ts mit einem Hash-Baum (v. a. fĂŒrs Booten) | |
| Tests / Debugging | delay | nein | fĂŒhrt Lese- und/oder Schreibzugriffe verzögert aus und kann sie auf mehrere GerĂ€te verteilen |
| dust | nein | Erzeugt fĂŒr konfigurierbare Sektoren einen I/O-Fehler, der nach einem Schreibzugriff nicht mehr auftritt (emuliert das Remapping von Ersatzsektoren in Festplatten) | |
| error | nein | Erzeugt fĂŒr jeden Zugriff einen I/O-Fehler | |
| flakey | nein | erzeugt (konfigurierbar) Fehler bei Lese- und/oder Schreibzugriffen (ermöglicht das Verwerfen von Schreibzugriffen) | |
| log-writes | nein | reicht Schreibzugriffe an ein BlockgerĂ€t durch und loggt sie auf einem anderen; v. a. fĂŒr die Entwicklung von Dateisystemen | |
| zero | nein | liefert bei Lesezugriffen nur Nullen, verwirft Schreibzugriffe (blockorientierte Analogie zu /dev/null); kann zusammen mit Snapshots thin provisioning simulieren | |
| Spezialhardware | inlinecrypt | nein | VerschlĂŒsselungshardware in Android-Smartphones |
| pcache | nein | Ermöglicht den (Cache-)Zugriff auf DAX-Speicher | |
Device-Mapper-interne Funktionen (keine Targets fĂŒr dmsetup) |
log | - | Logging |
| io | - | Verteilung von Zugriffen pro Region des Speichers synchron oder asynchron auf eins oder mehrere BlockgerÀte | |
| kcopyd | - | asynchrones Kopieren (fĂŒr snapshot) | |
| persistent data | - | Infrastruktur fĂŒr das einheitliche Speichern von Metadaten fĂŒr mehrere DM-Module; enthĂ€lt: dm-block-manager, dm-transaction-manager, dm-space-map, dm-space-map-metadata, dm-space-map-disk, dm-btree, dm-btree-remove, dm-btree-spine, dm-btree-internal | |
| queue-length | - | Pfadauswahl fĂŒr Multipath (nach LĂ€nge der Warteschlange) | |
| service-time | - | Pfadauswahl fĂŒr Multipath (nach Dauer der Zugriffe) |
Weblinks
[Bearbeiten | Quelltext bearbeiten]Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- â Artikel bei Heise online. Abgerufen am 26. Februar 2012.
- â Dokumentation des Entwicklers. Abgerufen am 26. Februar 2012.