Zum Inhalt springen

Device Mapper

aus Wikipedia, der freien EnzyklopÀdie

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 reload
    • dmsetup suspend
    • dmsetup resume
  • Nachrichten an das GerĂ€t. Mit dmsetup message kö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:

  1. Startsektor
  2. Anzahl aufeinanderfolgender Sektoren mit demselben Ziel
  3. Zieltyp (Target)
  4. 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 ls
  • dmsetup ls --tree und
  • ls -ld /sys/devices/virtual/block/dm-*

kann man sich die bestehenden Device-Mapper-GerÀte anzeigen lassen. Mit

  • dmsetup deps
  • dmsetup info
  • dmsetup status
  • dmsetup 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:

  1. 0 25165824 linear 8:8 384
  2. 0 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):

  1. vg0-test
  2. vg0-test-real
  3. vg0-test--snap
  4. vg0-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.

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.

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-cache
  • dm-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.

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.

Device Mapper Targets und interne Komponenten
Targetvia LVMFunktion
direkte Abbildung des Speichers auf ein anderes GerÀt linearjaAbbildung auf einen oder mehrere Bereiche eines BlockgerÀts
zonedneinprĂ€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
ebsneinentspricht linear, aber emuliert ein BlockgerĂ€t mit kleinerer BlockgrĂ¶ĂŸe
eraneinentspricht linear, aber erfasst fĂŒr die einzelnen Regionen des Speichers, wann sie zuletzt beschrieben wurden
multipathneinMultipath
Abbildung des Speichers auf mehrere GerÀte stripedjanichtredundante Verteilung der Daten auf mehrere GerÀte; entspricht RAID-Level 0
raidjaRAID-Level 0, 1, 4, 5 (diverse Varianten), 6 (diverse Varianten), 10
unstripedneinUmkehrung von striped, um logisch auf ein UrsprungsgerĂ€t zugreifen zu können, ohne direkt physisch darauf zugreifen zu mĂŒssen
switchneinentspricht linear, aber fĂŒr eine riesige Anzahl von Speicherbereichen, so dass die Verwendung von linear ineffizient wĂ€re
(thickLVM) Snapshots snapshot-originjaVorbereitung eines BlockgerĂ€ts fĂŒr die Erstellung von Snapshots
snapshotjaErstellen eines Snapshots (mehrere können gleichzeitig existieren)
snapshot-mergejaÜbernahme der seit dem Snapshot geschriebenen Daten in das UrsprungsgerĂ€t
thin provisioning thin-pooljaThin-Provisioning-Speicherpool und -Metadaten (mit Snapshots); Vorbereitung fĂŒr die Erstellung eines Thin-Provisioning-BlockgerĂ€ts
thinjaThin-Provisioning-BlockgerÀt
vdojavirtual data optimizer: Deduplikation
Caching cachejaLese- (writethrough) oder Schreib-Lese-Cache (writeback)
writecachejaSchreibpuffer / Schreibcache
cloneneinKopiert den Inhalt eines (langsamen) Nur-lese-BlockgerÀts bei jedem Lese- oder Schreibzugriff auf einen neuen Speicherbereich
pcacheneinErmöglicht den (Cache-)Zugriff auf DAX-Speicher
VerschlĂŒsselung / IntegritĂ€tssicherung cryptneinVerschlĂŒ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
integrityjaSicherung der einzelnen Blöcke mit Hashwerten (können von dm-crypt bereitgestellt werden) oder PrĂŒfsummen auf einem beschreibbaren GerĂ€t
imaneinInterface diverser Device-Mapper-Targets zur Linux Integrity Measurement Architecture
verityneinSicherung eines kompletten Nur-lese-BlockgerĂ€ts mit einem Hash-Baum (v. a. fĂŒrs Booten)
Tests / Debugging delayneinfĂŒhrt Lese- und/oder Schreibzugriffe verzögert aus und kann sie auf mehrere GerĂ€te verteilen
dustneinErzeugt fĂŒr konfigurierbare Sektoren einen I/O-Fehler, der nach einem Schreibzugriff nicht mehr auftritt (emuliert das Remapping von Ersatzsektoren in Festplatten)
errorneinErzeugt fĂŒr jeden Zugriff einen I/O-Fehler
flakeyneinerzeugt (konfigurierbar) Fehler bei Lese- und/oder Schreibzugriffen (ermöglicht das Verwerfen von Schreibzugriffen)
log-writesneinreicht Schreibzugriffe an ein BlockgerĂ€t durch und loggt sie auf einem anderen; v. a. fĂŒr die Entwicklung von Dateisystemen
zeroneinliefert bei Lesezugriffen nur Nullen, verwirft Schreibzugriffe (blockorientierte Analogie zu /dev/null); kann zusammen mit Snapshots thin provisioning simulieren
Spezialhardware inlinecryptneinVerschlĂŒsselungshardware in Android-Smartphones
pcacheneinErmö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)

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. ↑ Artikel bei Heise online. Abgerufen am 26. Februar 2012.
  2. ↑ Dokumentation des Entwicklers. Abgerufen am 26. Februar 2012.