Wie man einen LVM Thin Pool auf einem Proxmox Cluster Node “nachrüstet”, wenn man schon alt ist oder zu bekifft war um das bei der Einrichtung zu erledigen.

Geplänkel

Ich weiß das ist ein bisschen krank aber ich hab schon immer irgendwelche Server im Keller stehen. Meine erste “richtige” Firewall war (ungefähr Mitte der 1990er) ein ausgemusterter IBM PS/2 Model 70 mit zwei 3COM Netzwerkkarten (rasante 10MBit via BNC-Kabel).

Da lief dann ein Linux, entweder Slackware oder SuSE (da war das noch cool), das weiß ich nicht mehr so genau. Auf jeden Fall mit ipchains als Firewall-Software. Und dahinter, im internen Netz, ein ausgedienter Server mit erst Novell Netware, später Windows NT und dem Mercury Mail Transport System.

Im Laufe der Jahre hat sich das natürlich gewandelt und heute läuft da ein Proxmox VE Cluster, sehr energieeffizient auf mehreren Mini PCs, zum Beispiel dem AM06 Pro von Acemagician, den man hierzulande für vergleichsweise kleines Geld bei Otto kaufen kann.

Die Switches sind - wegen dem sehr guten Preis-Leistungs-Verhältnis - von Mikrotik. Aktuell hab ich da einen CSS610-8G-2S+. Der kostet ein bisschen mehr als 100 Euro im OMG Store und das ist für einen Switch mit dem Feature Set (8 Gigabit-Ports, 2 x SFP+, Managed) ein absoluter Preis-Leistungs-Hammer.

CSS610-8G-2S+

Aber ich schweife ab. Das Thema ist eigentlich: Wie lege ich nachträglich einen Thin Pool in Proxmox VE an? Dazu erst mal ein wenig Vorgeschichte:

Proxmox auf dem Mac Mini

Neulich habe ich Proxmox VE auf einen alten Mac Mini (A1347) installiert. Das war so ne Testinstallation und lief prächtig. Später hatte ich dann die Idee, ich könne den ja meinem bereits bestehenden Proxmox Cluster hinzu fügen. Dabei hatte ich nicht bedacht, dass ich auf dem Mac Mini ja bei der Proxmox-Installation ein ZFS-Raid mit den beiden internen SSDs gebaut habe (BTW voll Klasse dass das mit Proxmox geht, würde ich mir auch von Debian wünschen, ist aber wohl ein Lizenz-Problem).

Da stand ich dann vor der Herausforderung, dass ich gar keinen LVM Thin Pool auf der Maschine habe. Ich hab zwar (aus akademischen Gründen) auch Ceph aber das läuft mit nur 2 OSDs pro Node und einem 2.5Gbps Ceph Netz mehr schlecht als recht, daher sind die wichtigeren VMs und Container auf lokalem Storage. Aus diesem Grund hab ich an den Mac noch ne externe Platte dran gehängt und da nen LVM Thin Pool eingerichtet.

Exkurs: Thin Provisioning

Thin Provisioning ist, wenn Du einem System (das muss nicht zwingend eine virtuelle Maschine sein) zwar Speicher zuweist, dieser aber erst bei Schreibzugriffen allokiert wird.

Eine beliebte Technik auf Hypervisor-Systemen wie VMware ESX oder Proxmox VE, da man hier sehr einfach überprovisionieren kann, das heisst, den virtuellen Maschinen mehr Speicher zuweisen, als physikalisch zur Verfügung steht.

Das wird natürlich ein Problem, wenn die VMs den Speicher tatsächlich alle allokieren wollen, aber das kennt man ja. Ich sag nur FIAT. xD

Vorbereitungen

Man kann die Konfiguration zwar nicht im Gui klicken, es geht aber auch an der Kommandozeile recht einfach, wenn man mal die Zusammenhänge verstanden hat.

Auf bereits konfiguriertem Node kann man in der /etc/pve/storage.cfg nachschauen, wie die Dateisysteme und Pools benannt sind, damit das auf dem neuen Node auch gleich aussieht, sonst wird das im Clusterbetrieb schwierig, z.B. wenn man eine Maschine migriert und sich die Dateisystembezeichnungen ändern. Aus diesem Grund sollten Storage und Netzwerk in einem PVE Cluster auf allen Nodes immer gleich benannt sein.

root@pve:~# grep -A 3 lvmthin /etc/pve/storage.cfg
lvmthin: local-lvm
        thinpool data
        vgname pve
        content rootdir,images

Okay, Thinpool heisst data, die Volume Group pve.

An den Mac wird dann eine externe Platte dran gehängt. Da hatte ich ein bisschen Spaß: Einige USB-Storage-Adapter funktionieren unter Linux eher Suboptimal. Entweder werden die Datenträger nicht erkannt oder es gibt sporadische Fehler oder man muss sich mit irgendwelchen Modprobe-Quirks behelfen damit die richtig laufen. Unschön.

Ich habe da ein bisschen experimentiert und verwende inzwischen für NVMEs die Gehäuse von Sabrenet und für SSDs die Ugreen-Gehäuse. Im konkreten Fall meldet sich die Platte nach dem Verbinden mit /dev/sdc am System und kann damit eingebunden werden.

LVM-Konfiguration

Erst wird ein Physical Volume erstellt, also der neue Datenträger für die Verwendung mit LVM initialisiert:

pvcreate /dev/sdc

Dann wird auf diesem Physical Volume eine Volume Group namens pve erstellt. Eine Volume Group dient hauptsächlich als Abstrahierungsschicht zwischen physischen und logischen Datenträgern und ermöglicht die Zusammenfassung mehrerer physischer Datenträger zu einer einzigen logischen Speicher-Struktur:

vgcreate pve /dev/sdc

Im nächsten Schritt erstellt man zwei Logical Volume genannte logische Datenträger: Einen für die Metadaten und einen für die eigentlichen Daten. Das Metadata LV ist quasi die Buchhaltung des eigentlichen Datenträgers: Hier wird vermerkt, welche Datenblöcke tatsächlich verwendet werden Siehe lvmthin-Manpage.

lvcreate -L 1G -n data_meta pve
lvcreate -L 250G -n data pve

Die benötigte Größe des Metadata LV zu berechnen, scheint irgendwie schwierig zu sein, die lvmthin-Manpage sagt dazu:

It can be hard to predict the amount of metadata space that will be needed, so it is recommended to start with a size of 1GiB which should be enough for all practical purposes.

Man kann das wohl nachträglich anpassen. Frage mich zwar, wie das gehen soll aber die müssen’s wissen. xD Letzter Schritt: Das Metadata- und das Data-LV zu einem Thin Pool zusammentackern:

lvconvert --type thin-pool --poolmetadata pve/data_meta pve/data

Der so angelegte Thin Pool sollte jetzt automatisch (spätestens nach Ab- und Anmelden) im Proxmox Gui auftauchen und kann verwendet werden.