Es ist eigentlich schon eine Weile her, dass ich das erste Mal dachte zu wissen, wie geil LVM ist. Ich hab mich aber geirrt, es ist noch geiler.
Die Geschichte: beim Aufsetzen eines Systems konnte ich mich nicht gleich dazu durchringen, /home auf ein LUKS-Device zu legen. Stattdessen habe ich /boot und das root-FS in normale Partitionen gepackt und über den Rest des Platzes ein Physical Volume angelegt, das nie mehr als zur Hälfte belegt war.
Grob rekostruiert:
$ pvs
PV VG Fmt Attr PSize PFree
/dev/sda3 vg0 lvm2 a-- 127.99g 75.60g
$ vgs
VG #PV #LV #SN Attr VSize VFree
vg0 1 3 0 wz--n- 127.99g 75.60g
$ lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
home vg0 -wi-ao-- 22.28g
swap vg0 -wi-ao-- 1.91g
usr vg0 -wi-ao-- 10.24g
var vg0 -wi-ao-- 10.24g
So, wie kriege ich jetzt die Daten von nur einem Volume in einer VG möglichst live in eine neue VG auf einem LUKS-Volume migriert? -Erstaunlich einfach!
Zuerst musste ich Platz für eine neue Partition schaffen. Dazu habe ich
erst das Physical Volume mit pvresize
verkleinert und anschließend mit
parted
die zu große Partition gelöscht und mit dem gleichen
Startsektor aber geringerer Größe wieder angelegt. Das ist der heikelste
Teil. Um Rechenfehler (MB/MiB etc.) zu umgehen, empfiehlt es sich, die
neue Partition größzügig anzulegen und anschließend nochmal pvresize
darauf loszulassen.
Danach habe ich im freien Platz eine neue Partition darauf angelegt und
per cryptsetup luksFormat
den LUKS-container erstellt. Den dann per
cryptsetup luksOpen
aufgemacht und mit vgextend
der existierenden VG
hinzugefügt.
Die Situation jetzt also: /home ist immer noch in der gleichen VG, aber zu dieser VG gehört jetzt auch ein, noch ungenutztes, Physical Volume mit LUKS darunter.
Trick 1 (den kannte ich schon länger): mit Hilfe von pvmove
kann man
LVs von einem PV auf ein anderes verschieben. Ich habe das bisher nur
gemacht, um eine komplette VG auf einen anderen Datenträger zu
verschieben. Hier habe ich das benutzt, um /home auf den LUKS-Container
zu verschieben. Das ist je nach Größe der LV recht zeitintensiv, geht
aber schneller, als viele kleine Dateien zu kopieren und vor Allem halt
online.
Trick 2: Da nun /home auf einem anderen PV liegt, als alle anderen LVs,
kann man mit vgsplit
dieses PV samt LV in eine neue VG schieben. Das
geht nun leider nicht mehr online, aber immerhin sehr schnell. Also
umount /home
, vgsplit -n vg0 crypto0
, vgchange -ay crypto0
und
wieder mount /home
.
Voilà:
$ pvs
PV VG Fmt Attr PSize PFree
/dev/mapper/home-decrypted crypto0 lvm2 a-- 27.94g 4.66g
/dev/sda3 vg0 lvm2 a-- 47.99g 25.60g
$ vgs
VG #PV #LV #SN Attr VSize VFree
crypto0 1 1 0 wz--n- 27.94g 4.66g
vg0 1 3 0 wz--n- 47.99g 25.60g
$ lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
home crypto0 -wi-ao-- 23.28g
swap vg0 -wi-ao-- 1.91g
usr vg0 -wi-ao-- 10.24g
var vg0 -wi-ao-- 10.24g
Zum Schluss muss man dann nur noch die /etc/{fs,crypt}tab
anpassen und
bei Bedarf die alte, unverschlüsselte Partition so vergrößern, dass der
Verschnitt weg ist.