vgsplit

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.

Comments? Use or send an e-mail.