GNU / Linux: Overlay Block Device / Stackable Block Device

14

GNU / Linux hat einen Union Mount, der Dirs überlagert. Sie können also ein beschreibbares Verzeichnis über ein schreibgeschütztes Verzeichnis mounten. Wenn das beschreibbare Verzeichnis nicht angehängt ist, bleibt das schreibgeschützte Verzeichnis unberührt.

Ich suche nach der gleichen Funktionalität für Blockgeräte - vorzugsweise mit dem beschreibbaren Teil, der in einer Datei gespeichert ist. Also würde ich gerne etwas machen wie:

device-setup /dev/newdevice /dev/read-only-device overlayfile

Wenn ich in / dev / newdevice schreibe, sollten die Änderungen in einer Überlagerungsdatei gespeichert werden. Wenn ich die Sektoren lese, in die geschrieben wurde, sollte ich die Daten aus der Überlagerungsdatei erhalten. Wenn ich Sektoren lese, in die nicht geschrieben wurde, sollte ich die Daten von / dev / read-only-device erhalten.

Gibt es so ein Tool?

Ole Tange
quelle
Ein ähnlicher Q & A: LVM-ähnlicher Schnappschuss auf einem normalen Blockgerät .
imz - Ivan Zakharyaschev

Antworten:

21

Sie können dies mit dem Geräte-Mapper und seinem snapshotZiel tun .

Grundsätzlich tun Sie dasselbe wie bei LVM, wenn Sie einen beschreibbaren Snapshot erstellen.

dev=/dev/read-only-device
ovl=/path/to/overlay.file
newdevname=newdevice
size=$(blockdev --getsz "$dev")

loop=$(losetup -f --show -- "$ovl")
printf '%s\n' "0 $size snapshot $dev $loop P 8" |
  dmsetup create "$newdevname"

Dann können Sie auf das überlagerte Gerät als zugreifen /dev/mapper/newdevice.

Wenn Sie gleichzeitig Zugriff auf das Originalgerät benötigen, haben Sie folgende Möglichkeiten:

printf '%s\n' "0 $size snapshot-origin $dev" |
  dmsetup create originaldevice

Und greifen Sie darauf zu /dev/mapper/originaldevice.

Sie können auf dieses Gerät schreiben. Zusätzlich zu den auf das Snapshot-Gerät geschriebenen Chunks enthält die Overlay-Datei eine Kopie der Chunks, die beim Schreiben auf den Snapshot-Ursprung überschrieben wurden.

Die Überlagerungsdatei kann eine Sparse-Datei sein. (Erstellen Sie sie beispielsweise als truncate -s10G the-file) und müssen nicht so groß sein wie das Originalgerät. Sie können feststellen, wie voll es mit ist dmsetup status "$newdevname".

Hinweis: Für ein Snapshot-Gerät gelten Größen- und Inhaltsanforderungen .

Stéphane Chazelas
quelle
1
Eine anschließende interessante Frage ist, ob die akkumulierten Änderungen später in das ursprüngliche Gerät
imz - Ivan Zakharyaschev
1
Die anschließende Antwort: ja. "Mit Device-Mapper können Sie ... *) einen Snapshot eines Blockgeräts wieder mit dem Ursprungsgerät des Snapshots zusammenführen." kernel.org/doc/Documentation/device-mapper/snapshot.txt
imz - Ivan Zakharyaschev
Was bedeutet der Chunksize-Parameter für das Snapshot-Ziel (in Ihrem Fall 8)? Wie wähle ich es aus?
Imz - Ivan Zakharyaschev
1
@Tom Diese Zahlen in DM-Tabellen beziehen sich immer auf 512-Byte-Einheiten, nicht auf die physische Sektorgröße der zugrunde liegenden Blockgeräte. Es wäre also eine schlechte Idee, einen Snapshot auf einem Gerät mit 4K-Sektoren zu verwenden, der kein Vielfaches von 8 ist.
Stéphane Chazelas
1
@Tom, die Blockgröße bestimmt die Granularität des Schnappschusses. Es geht nicht um die Blockgröße des FS für die Overlay-Datei, sondern um die Genauigkeit der E / A-Vorgänge, die auf dem Blockgerät ausgeführt werden. Daher der Rollback. Vielen Dank für die getsz vs getsize.
Stéphane Chazelas