Sichern (und Wiederherstellen) von LVM Partitionen mit LVM-Snapshots

Version 1.0
Autor: Falko Timme
Stand: 11.04.2007

Diese Anleitung veranschaulicht, wie man Sicherungen von LVM-Partitionen mit LVM-Snapshots erstellt. Ein LVM-Snapshot ist eine exakte Kopie einer LVM Partition, der die gesamten Daten des LVM-Volume von dem Moment wiedergibt, in dem der Speicherauszug erstellt wurde. Der große Vorteil der LVM-Snapshots ist, dass man sich keine Sorgen mehr um geöffnete Dateien und Datenbankverbindungen machen muss und auch nicht die Dienste der Partition unterbrechen muss, die gerade genutzt werden. Dies liegt daran, dass der Speicherauszug gewöhnlich in Sekundenbruchteilen erstellt wird und die Benutzer keinerlei Unterbrechung bemerken. Der Speicherauszug sichert dauerhaft die Daten.
In einem eigenen Kapitel am Ende dieser Anleitung wird auch gezeigt, wie man eine LVM-Partition aus einer Sicherungskopie wiederherstellen kann.

Diese Anleitung übernimmt weder Gewährleitsung noch Garantie! Ich übernehme keine Garantie dafür, dass dieses Anleitung bei jedem funktioniert.

1 Einleitung

Ich habe die LVM-Snapshots auf einem Debian Etch Server mit der IP-Adresse 192.168.0.100 and dem Hostnamen server1.example.com. ausprobiert. Der Server hatte zwei Festplatten:
  • /dev/sda (10GB) mit einer kleinen /boot Partition (nicht-LVM), / Partition (LVM, etwas kleiner als 10GB) und eine Auslagerungspartition (LVM)
  • /dev/sdb (60GB), im Moment unbenutzt; sollen genutzt werden, um eine 30GB /backups Partition (LVM) zu erstellen und für die Speicherauszüge der / Partition (10GB - dies reicht, da die / Partition etwas kleiner als 10GB ist).
Ich habe ein Debian Etch VMware image erstellt, das man sich downloaden und auf einem VMware-Server oder einem VMware Player abspielen kann (http://www.howtoforge.com/import_vmware_images zeigt, wie das funktioniert). Diese virtuelle Maschine hat die gleichen technischen Voraussetzungen wie mein Testsystem, das ich oben beschrieben habe. Das root Passwort ist howtoforge. Wenn man diese virtuelle Maschine benutzt, kann man exakt die gleichen Schritte nachvollziehen, die ich in dieser Anleitung mache, um die LVM-Snapshots zu erstellen.

Um die / Partition von der Sicherungskopie wieder herzustellen (siehe das letzte Kapitel dieser Anleitung) braucht man eine Linux Live-CD, die LVM unterstützt. Hierzu eignen sich z.B. Knoppix oder die Debian Etch Netinstall CD, die man als Rettungs-CD benutzen kann, wenn man "rescue" am boot prompt eingibt. Ich werde in diesem Beispiel die Debian Etch Netinstall CD benutzen (die Liste der Mirrors erhält man unter http://www.debian.org/CD/http-ftp/. Ich selbst habe die CD hier heruntergeladen: http://ftp.de.debian.org/debian-cd/4.0_r0/i386/iso-cd/debian-40r0-i386-netinst.iso).

Um eine Sicherungskopie der / Partition zu erstellen werde ich wie folgt vorgehen: Ich werde zunächst einen Speicherauszug von der / Partition und danach eine Sicherungskopie von diesem Speicherauszug (anstelle der aktuellen / Partition!) auf der /backups Partition erstellen (Natürlich kann man die Sicherungskopie abspeichern wo man möchte. Anstatt eine extra /backups LVM-Partition zu erstellen könnte man auch ein externes USB-Laufwerk benutzen). Die Sicherungskopie kann man mit seinem bevorzugetn Backup-Programm erstellen, z.B. mit tar oder dd. Anschließend werde ich den Snapshot löschen, da er nicht mehr gebraucht wird und dann die Systemressourcen weiter nutzen.

Man braucht nicht unbedingt eine zweite Festplatte für den Snapshot - man kann die erste benutzen wenn man sicher ist, dass man genügend freien (nicht zugewiesenen) Speicherplatz hat, um den LVM-Snapshot dort zu speichern (der Platz für den Snapshot sollte genaau so groß sein, wie die zu sichernde LVM-Partition!). Und wie bereits oben erwähnt kann man für das Sichern der Snapshots auch ein externes USB-laufwerk benutzen.

Um mehr über LVM zu lernen sollte man diese Anleitung lesen: http://www.howtoforge.com/linux_lvm.

2 Erstellen der / Backups LVM-Partition

(If you'd like to store your backups somewhere else, e.g on an external USB drive, you don't have to do this.)

Unsere gegenwärtige Situation ist folgende:

pvdisplay


server1:~# pvdisplay
--- Physical volume ---
PV Name /dev/sda5
VG Name server1
PV Size 9.76 GB / not usable 0
Allocatable yes (but full)
PE Size (KByte) 4096
Total PE 2498
Free PE 0
Allocated PE 2498
PV UUID vQIUga-221O-GIKj-81Ct-2ITT-bKPw-kKElpM

vgdisplay


server1:~# vgdisplay
--- Volume group ---
VG Name server1
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 9.76 GB
PE Size 4.00 MB
Total PE 2498
Alloc PE / Size 2498 / 9.76 GB
Free PE / Size 0 / 0
VG UUID jkWyez-c0nT-LCaE-Bzvi-Q4oD-eD3Q-BKIOFC

lvdisplay


server1:~# lvdisplay
--- Logical volume ---
LV Name /dev/server1/root
VG Name server1
LV UUID UK1rjH-LS3l-f7aO-240S-EwGw-0Uws-5ldhlW
LV Write Access read/write
LV Status available
# open 1
LV Size 9.30 GB
Current LE 2382
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 254:0

--- Logical volume ---
LV Name /dev/server1/swap_1
VG Name server1
LV UUID 2PASi6-fQV4-I8sJ-J0yq-Y9lH-SJ32-F9jHaj
LV Write Access read/write
LV Status available
# open 2
LV Size 464.00 MB
Current LE 116
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 254:1

fdisk -l

server1:~# fdisk -l

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 31 248976 83 Linux
/dev/sda2 32 1305 10233405 5 Extended
/dev/sda5 32 1305 10233373+ 8e Linux LVM

Disk /dev/sdb: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/dm-0: 9990 MB, 9990832128 bytes
255 heads, 63 sectors/track, 1214 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/dm-0 doesn't contain a valid partition table

Disk /dev/dm-1: 486 MB, 486539264 bytes
255 heads, 63 sectors/track, 59 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/dm-1 doesn't contain a valid partition table

So beinhaltet /dev/sda die Logical Volumes /dev/server1/root (/ Partition) und /dev/server1/swap_1 (Swap-Partition) plus eine kleine /boot Partition (nicht-LVM).

(BTW, /dev/server1/root ist das gleiche wie /dev/mapper/server1-root auf Debian Etch. Der erste Link ist ein symlink (symbolischer Link) zum zweiten; Ich werde in dieser Anleitung beide Bezeichnungen verwenden. Das gleiche gilt für /dev/server1/swap_1 and /dev/mapper/server1-swap_1.)

Jetzt werde ich die Partition /dev/sdb1 erstellen und der server1 Volume-Gruppe hinzufügen, danach werde ich das Volume /dev/server1/backups erstellen (mit nur 30GB anstatt der vollen 60GB von /dev/sdb, sodass ich genügend Speicherplatz für den Snapshot übrig habe), das ich auf /backups mounten (einhängen) werde:

fdisk /dev/sdb

server1:~# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

The number of cylinders for this disk is set to 7832.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): <-- n Command action
e extended
p primary partition (1-4)
<-- p Partition number (1-4): <-- 1 First cylinder (1-7832, default 1): <-- [ENTER] Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-7832, default 7832):
<-- [ENTER] Using default value 7832
Command (m for help): <-- t Selected partition 1
Hex code (type L to list codes):
<-- 8e Changed system type of partition 1 to 8e (Linux LVM)
Command (m for help): <-- w The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

pvcreate /dev/sdb1
vgextend server1 /dev/sdb1
lvcreate --name backups --size 30G server1
mkfs.ext3 /dev/mapper/server1-backups
mkdir /backups

Jetzt mountet man das /dev/server1/backups Volume auf /backups:

mount /dev/mapper/server1-backups /backups

Um das Volume automatisch beim Systemstart zu mounten, muss man /etc/fstab editieren und die folgende Zeile hinzufügen:

vi /etc/fstab

[...]
/dev/mapper/server1-backups /backups ext3 defaults,errors=remount-ro 0 1
Nun sieht das Ganze so aus:

pvdisplay


server1:~# pvdisplay
--- Physical volume ---
PV Name /dev/sda5
VG Name server1
PV Size 9.76 GB / not usable 0
Allocatable yes (but full)
PE Size (KByte) 4096
Total PE 2498
Free PE 0
Allocated PE 2498
PV UUID vQIUga-221O-GIKj-81Ct-2ITT-bKPw-kKElpM

--- Physical volume ---
PV Name /dev/sdb1
VG Name server1
PV Size 59.99 GB / not usable 0
Allocatable yes
PE Size (KByte) 4096
Total PE 15358
Free PE 7678
Allocated PE 7680
PV UUID cvl1H5-cxRe-iyNg-m2mM-tjxM-AvER-rjqycO

vgdisplay


server1:~# vgdisplay
--- Volume group ---
VG Name server1
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 2
Act PV 2
VG Size 69.75 GB
PE Size 4.00 MB
Total PE 17856
Alloc PE / Size 10178 / 39.76 GB
Free PE / Size 7678 / 29.99 GB
VG UUID jkWyez-c0nT-LCaE-Bzvi-Q4oD-eD3Q-BKIOFC

lvdisplay


server1:~# lvdisplay
--- Logical volume ---
LV Name /dev/server1/root
VG Name server1
LV UUID UK1rjH-LS3l-f7aO-240S-EwGw-0Uws-5ldhlW
LV Write Access read/write
LV Status available
# open 1
LV Size 9.30 GB
Current LE 2382
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 254:0

--- Logical volume ---
LV Name /dev/server1/swap_1
VG Name server1
LV UUID 2PASi6-fQV4-I8sJ-J0yq-Y9lH-SJ32-F9jHaj
LV Write Access read/write
LV Status available
# open 2
LV Size 464.00 MB
Current LE 116
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 254:1

--- Logical volume ---
LV Name /dev/server1/backups
VG Name server1
LV UUID sXq2Xe-y2CE-Ycko-rCoE-M5kl-E1vH-KQRoP6
LV Write Access read/write
LV Status available
# open 1
LV Size 30.00 GB
Current LE 7680
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 254:2

3 Erstellen eines LVM Snapshot von /

Jetzt ist es an der Zeit einen Snapshot des /dev/server1/root Volume zu erstellen. Ich nenne diesen LVM-Snapshot rootsnapshot:

lvcreate -L10G -s -n rootsnapshot /dev/server1/root

Die Ausgabe von

lvdisplay

sollte so aussehen:

server1:~# lvdisplay
--- Logical volume ---
LV Name /dev/server1/root
VG Name server1
LV UUID UK1rjH-LS3l-f7aO-240S-EwGw-0Uws-5ldhlW
LV Write Access read/write
LV snapshot status source of
/dev/server1/rootsnapshot [active]
LV Status available
# open 1
LV Size 9.30 GB
Current LE 2382
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 254:0

--- Logical volume ---
LV Name /dev/server1/swap_1
VG Name server1
LV UUID 2PASi6-fQV4-I8sJ-J0yq-Y9lH-SJ32-F9jHaj
LV Write Access read/write
LV Status available
# open 2
LV Size 464.00 MB
Current LE 116
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 254:1

--- Logical volume ---
LV Name /dev/server1/backups
VG Name server1
LV UUID sXq2Xe-y2CE-Ycko-rCoE-M5kl-E1vH-KQRoP6
LV Write Access read/write
LV Status available
# open 1
LV Size 30.00 GB
Current LE 7680
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 254:2

--- Logical volume ---
LV Name /dev/server1/rootsnapshot
VG Name server1
LV UUID 9zR5X5-OhM5-xUI0-OolP-vLjG-pexO-nk36oz
LV Write Access read/write
LV snapshot status active destination for /dev/server1/root
LV Status available
# open 1
LV Size 9.30 GB
Current LE 2382
COW-table size 10.00 GB
COW-table LE 2560
Allocated to snapshot 0.01%
Snapshot chunk size 8.00 KB
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 254:5

Ich möchte nun /dev/server1/rootsnapshot auf /mnt/server1/rootsnapshot mounten, deshalb muss ich zuerst das Verzeichnis erstellen:

mkdir -p /mnt/server1/rootsnapshot

Dann mounte ich den Snapshot:

mount /dev/server1/rootsnapshot /mnt/server1/rootsnapshot

Nun führe ich den folgenden Befehl aus:

ls -l /mnt/server1/rootsnapshot/

Dies sollte alle Verzeichnisse und Dateien, die ich von / Partition kenne, zeigen:

server1:~# ls -l /mnt/server1/rootsnapshot/
total 132
drwxr-xr-x 2 root root 4096 2007-04-10 21:02 backups
drwxr-xr-x 2 root root 4096 2007-04-10 20:35 bin
drwxr-xr-x 2 root root 4096 2007-04-10 20:25 boot
lrwxrwxrwx 1 root root 11 2007-04-10 20:25 cdrom -> media/cdrom
drwxr-xr-x 13 root root 40960 2007-04-10 20:36 dev
drwxr-xr-x 57 root root 4096 2007-04-10 21:09 etc
drwxr-xr-x 3 root root 4096 2007-04-10 20:36 home
drwxr-xr-x 2 root root 4096 2007-04-10 20:26 initrd
lrwxrwxrwx 1 root root 28 2007-04-10 20:29 initrd.img -> boot/initrd.img-2.6.18-4-486
drwxr-xr-x 13 root root 4096 2007-04-10 20:34 lib
drwx------ 2 root root 16384 2007-04-10 20:25 lost+found
drwxr-xr-x 4 root root 4096 2007-04-10 20:25 media
drwxr-xr-x 2 root root 4096 2006-10-28 16:06 mnt
drwxr-xr-x 2 root root 4096 2007-04-10 20:26 opt
drwxr-xr-x 2 root root 4096 2006-10-28 16:06 proc
drwxr-xr-x 3 root root 4096 2007-04-10 20:42 root
drwxr-xr-x 2 root root 4096 2007-04-10 20:36 sbin
drwxr-xr-x 2 root root 4096 2007-03-07 23:56 selinux
drwxr-xr-x 2 root root 4096 2007-04-10 20:26 srv
drwxr-xr-x 2 root root 4096 2007-01-30 23:27 sys
drwxrwxrwt 2 root root 4096 2007-04-10 21:09 tmp
drwxr-xr-x 10 root root 4096 2007-04-10 20:26 usr
drwxr-xr-x 13 root root 4096 2007-04-10 20:26 var
lrwxrwxrwx 1 root root 25 2007-04-10 20:29 vmlinuz -> boot/vmlinuz-2.6.18-4-486

Jetzt hat man seinen Speicherauszug erfolgreich erstellt!

Nun kann man eine Sicherungskopie des LVM-Snapshots auf der /backups Partition erstellen, indem man sein bevorzugtes Backup-Programm benutzt. Wenn man eine Datei basierte Sicherungskopie möchte, könnte man folgendermaßen vorgehen:

tar -pczf /backups/root.tar.gz /mnt/server1/rootsnapshot

Möchte man ein exate Sicherungskopie Bit für Bit (z.B. für ein Bild), kann man so vorgehen:

dd if=/dev/server1/rootsnapshot of=/backups/root.dd


server1:~# dd if=/dev/server1/rootsnapshot of=/backups/root.dd
19513344+0 records in
19513344+0 records out
9990832128 bytes (10 GB) copied, 320.059 seconds, 31.2 MB/s

Allerdings kann man auch beide Möglichkeiten nutzen, um gegen alles gewappnet zu sein, was mit dem /dev/server1/root Volume passieren könnte. In diesem Fall sollte man zwei Sicherungskopien hintereinander durchführen:

ls -l /backups/


server1:~# ls -l /backups/
total 9947076
drwx------ 2 root root 16384 2007-04-10 21:04 lost+found
-rw-r--r-- 1 root root 9990832128 2007-04-10 21:28 root.dd
-rw-r--r-- 1 root root 184994590 2007-04-10 21:18 root.tar.gz

Danach kann man unmouten und den Snapshot entfernen, damit er nicht unnötig Systemressourcen verbraucht:

umount /mnt/server1/rootsnapshot
lvremove /dev/server1/rootsnapshot

Das war's! Jetzt hat man seine erste Sicherungskopie eines LVM-Snapshot.

4 Wiederherstellen einer Sicherungskopie

Dieses Kaptiel veranschaulicht, wie man das /dev/server1/root Volume von dem dd Image wiederherstellt, das ich im vorherigen Kapitel erstellt habe. Normalerweise kann man eine Sicherungskopie von demselben, laufenden System wiederherstellen, wenn das Volume, das man wiederherstellen möchte, keinerlei systemkritische Dateien enthält. Da aber das /dev/server1/root Volume die System-Partition des Rechners ist, muss man ein Rettungssystem oder eine Live-CD benutzen, um die Sicherungskopie wiederherzustellen. Das Rettungssystem bzw. die Live-CD müssen LVM unterstützen.

Um das /dev/server1/root Volume wiederherzustellen , bootet man das System zunächst von der Debian Etch Netinstall CD und gibt rescue am boot prompt ein:


Jetzt wählt man die Sprache aus:


Nun wählt man das Land:


Jetzt kann man sich ein Tastatur-Layout aussuchen:


Man kann den vorgegebenen Hostname akzeptieren:


Man kann nun auch den vorgegebenen Domainnamen (der leer ist) akzeptieren:


Nun wählt man das Sicherungs-Volume (/dev/server1/backups) als Root-Dateisystem:


Dann wählt man Execute a shell in the installer environment:


Dann klickt man auf Continue:


Nun kommt eine Kommandozeile (shell):


Führen Sie den folgenden Befehl aus :

mount

und nun sollte man sehen, dass /dev/server1/backups auf /target gemounted ist. Jetzt sollte das dd Image auf dem /dev/server1/root Volume zu /target/root.dd geworden sein. Um es wiederherzustellen führt man einfach aus:

dd if=/target/root.dd of=/dev/server1/root

Das war's. Es kann ein paar Minuten dauern ehe der Auftrag fertig ist. Danach kann man die Live-CD entnehmen und das normale System wieder booten.

5 Links

Copyright © 2007 Falko Timme

All Rights Reserved.