Auf dem einen System hier besteht das LVM aus zwei VGs, die den beiden Platten entsprechen:
- vg0 (
/dev/sda5
) ist die schnelle, kleine SSD - vg1 (
/dev/sdb1
) ist die große, langsame rotierende Scheibe
Bis auf
/boot
und eine kleine Rettungspartition mit einem zweiten Linux (falls man mal was macht, was das LVM offline braucht – ein USB-Bootstick ist wäre mir zu umständlich, der ist nie da, wenn man ihn braucht) liegt das gesamte System im LVM. Durch das anstehende Release von Warlords of Draenor muss mehr Platz auf die WoW-Partition (plus ca. 10 GB). WoW ist wichtig und muss schnell starten, also liegt das auf der SSD. Die ist natürlich rappelvoll. Also müssen bestehende unwichtige LVs von vg0 auf vg1 umziehen – aber wie?
Ich habe gegoogelt und bin dabei auf
vgsplit
gestoßen – leider war entweder die Anleitung murksig oder ich habe nicht richtig gelesen auf, jeden Fall macht das Kommando nicht das, was ich dachte. Nach dem ersten
vgsplit
-Aufruf lagen ALLE LVs plötzlich in einer einzigen VG. Kurzer Schreckmoment „Hilfe, das ganze System zersägt!“, aber: Ruhe bewahren, nachdenken. Wenn man VGs mit vgsplit zusammenfassen, also „unsplitten“ kann, dann wird man die auch erst recht gesplittet bekommen, also so wie vorher. Manpage lesen wird helfen. Ist halt nur nervig, jetzt nachzugucken, welche LVs vorher auf vg0 und welche auf vg1 gelebt haben…
Aber schau:
vgsplit
kann anhand eines PVs unterscheiden, was wohin gesplittet werden soll und genau das ist ja mein Unterscheidungsmerkmal für die Volume-Zugehörigkeit. Passt also genau!
Aus diesem kleinen gar-nicht-so-Missgeschick ist jetzt diese Anleitung herausgekommen:
IST
- VG vg0 bestehe aus dem PV
/dev/sda5
- VG vg1 bestehe aus dem PV
/dev/sdb1
SOLL
- LV vg0/foo soll umziehen nach vg1/foo
HOWTO
- Irgendwie von „außerhalb“ des Systems booten, alle LVs in vg0 und vg1 müssen offline sein (das ginge z.B. über einen grml-Stick oder halt über meine Rescue-Partiton).
- Sicherstellen, dass alle LVs offline sind:
- % vgchange -an vg0
- % vgchange -an vg1
- Beide VGs in einem gemeinsamen Topf schmeißen (alles von
/dev/sdb1
in vg1 wandert mit nach vg0):
- % vgsplit vg1 vg0 /dev/sdb1
Jetzt gibt es nur noch ein vg0, in dem beide PVs enthalten sind.
- Einfach und naheliegend: das (oder die) betreffende(n) LV(s) vom einen PV ins andere verschieben – das geht, die sind ja momentan in der gleichen VG:
- % pvmove -n foo /dev/sda5 /dev/sdb1
Abwarten, bis das fertig wird, es sagt Bescheid.
- Und nun der Zaubertrick: alle LVs, die auf dem PV
/dev/sdb1
liegen, wandern wieder zurück in das vg1:
- % vgsplit vg0 vg1 /dev/sdb1
Look ma, no hands!
Und wenn sich jetzt jemand fragt, warum ich überhaupt zwei VGs benutze: Das ist hier historisch so gewachsen.
Auf einem anderen System, das ebenfalls SSD und Festplatte parallel benutzt, habe ich nur eine einzige VG im Einsatz. Mittels
pvmove
habe ich mir da auch alles so sortiert, dass die wichtigen Dinge auf der schnellen SSD liegen. LVM sollte eigentlich schlau genug sein, ein per
lvresize
vergrößertes LV auf dem gleichen PV bleibt, sofern noch Platz ist (also nicht plötzlich ein absichtlich auf die SSD verschobenes LV, das vergrößert wird, zur Hälfte auf der Festplatte liegt). Da gibt es einen Automatismus, alternativ man kann das ganze auch expliziert kontrollieren, wenn man sich mit
lvchange --alloc
beschäftigt (siehe auch
lvm(8)
). Kontrollieren geht am einfachsten mit
lvs -o +devices
.
Oder, wenn man nicht kontrollieren will, einfach wie in meinem Fall hier zwei getrennte VGs benutzen, da ist auf Anhieb klar, was wo liegt und es kann kein „halb hier halb da“ geben. Verschieben eines LV wird dann umständlicher (siehe oben) und das Verteilen einer LV auf zwei VGs ist natürlich unmöglich.