Sichern (und Wiederherstellen) von LVM Partitionen mit LVM-Snapshots
Version 1.0
Autor: Falko Timme <ft [at] falkotimme [dot] com>
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 (https://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: https://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