Proxmox LXC: Container-Architektur & Deep Dive
Maximale Dichte, minimaler Overhead. In diesem Deep Dive analysieren wir die Anatomie von Linux Containern (LXC) in Proxmox. Wir erklären, wie Namespaces und Cgroups für Isolation sorgen, warum 'Unprivileged' der Sicherheitsstandard ist und wann ein Container einer VM überlegen ist.
# Proxmox LXC: Die Leichtgewichte der Virtualisierung
TL;DR / Management Summary Während eine VM ein komplettes Hardware-Set emuliert, teilt sich ein LXC (Linux Container) den Kernel mit dem Proxmox-Host. Das Ergebnis: Fast kein CPU-Overhead, blitzschnelle Startzeiten und eine extreme Packungsdichte. Ein Senior Admin nutzt LXC für zustandslose Dienste, Webserver und Microservices. Für Windows oder Hochsicherheits-Workloads bleibt die VM jedoch die erste Wahl.
# 1. Die Anatomie: Wie LXC funktioniert
Im Gegensatz zu Docker, das für Applikations-Container optimiert ist, bietet LXC in Proxmox komplette System-Container. Sie verhalten sich wie ein vollwertiges Betriebssystem, inklusive init-System (systemd), Cron-Jobs und SSH-Zugang.
# Schichtenmodell: VM vs. LXC (Mermaid)
graph TD
subgraph VM[Virtual Machine - KVM]
App1[App A] --> GOS[Guest OS Kernel]
GOS --> VHW[Virt Hardware]
VHW --> HYP[Hypervisor - KVM/QEMU]
HYP --> HK[Host Kernel]
end
subgraph LXC[Linux Container]
App2[App B] --> NS[Namespaces / Cgroups]
NS --> HK
end
HK --> HW[Physical Hardware]
style NS fill:#f96,stroke:#333
style HYP fill:#9f9,stroke:#333
# Die zwei Säulen der Isolation
- Namespaces (Sichtbarkeit): Sorgen dafür, dass ein Container nur seine eigenen Prozesse, Netzwerkinterfaces und Mount-Points sieht.
- Control Groups / cgroups (Ressourcen): Begrenzen, wie viel CPU, RAM und I/O ein Container verbrauchen darf. Sie verhindern, dass ein “Amok-laufender” Container den gesamten Host lahmlegt.
# 2. Sicherheit: Privileged vs. Unprivileged
Dies ist die wichtigste Entscheidung beim Design einer Container-Infrastruktur.
# Unprivileged Container (Der Standard)
In einem unprivilegierten Container wird die User-ID (UID) gemappt.
- Mechanismus: Die UID 0 (root) im Container entspricht z.B. der UID 100000 auf dem Host.
- Vorteil: Wenn ein Angreifer aus dem Container ausbricht, landet er auf dem Host als ein völlig unbedeutender User ohne Rechte.
# UID Mapping Visualisierung (Mermaid)
graph LR
subgraph Container[LXC Container]
CRoot[UID 0 - root]
CUser[UID 1000 - www-data]
end
subgraph Host[Proxmox Host]
HRoot[UID 0 - root]
HMap1[UID 100000]
HMap2[UID 101000]
end
CRoot -- "Mapped to" --> HMap1
CUser -- "Mapped to" --> HMap2
HRoot -.-> |Kein Mapping!| CRoot
style HRoot fill:#f66,stroke:#333
# 3. Performance: Warum LXC unschlagbar ist
Da LXC keinen eigenen Kernel bootet, gibt es keinen “Hypervisor-Strafzoll”.
- CPU: Fast identisch mit Bare-Metal Performance.
- RAM: Ein LXC belegt nur den Speicher, den die Applikationen tatsächlich brauchen. Es gibt keinen reservierten Speicher für den Gast-Kernel.
- Storage I/O: Da LXC direkt auf das Host-Dateisystem oder ZFS-Datasets zugreifen kann, entfällt die Emulationsschicht der virtuellen Disk-Controller.
# 4. Day-2 Operations: Container-Management
# Bind Mounts: Daten teilen
Ein mächtiges Feature von LXC ist die Fähigkeit, Verzeichnisse vom Host direkt in den Container zu mounten.
- Anwendungsfall: Ein zentrales Backup-Verzeichnis oder ein großer Datenspeicher auf dem Host soll für mehrere Container verfügbar sein.
# Beispiel: Mount von /mnt/data (Host) nach /var/www/data (LXC 100)
pct set 100 -mp0 /mnt/data,mp=/var/www/data
# Ressourcen-Hotplug
CPU und RAM können bei LXC im laufenden Betrieb ohne Neustart angepasst werden. Proxmox nutzt hierfür die cgroups-Schnittstellen des Kernels.
# 5. Troubleshooting & “War Stories”
# Die “NFS-Mount” Falle
Szenario: Ein Admin wollte ein NFS-Share direkt innerhalb eines unprivilegierten LXC mounten.
Symptom: mount: permission denied.
Ursache: Unprivilegierte Container dürfen aus Sicherheitsgründen keine Kernel-Dateisysteme mounten.
Lösung: Aktivieren Sie das Feature NFS in den Container-Optionen (erfordert moderne PVE-Versionen) oder nutzen Sie einen Bind-Mount vom Host.
# Der “Zombi-Prozess” im Cluster
Szenario: Ein Container ließ sich nicht mehr stoppen oder löschen. Ursache: Ein Prozess im Container hing im “D-State” (Uninterruptible Sleep), meist durch einen hängenden I/O-Zugriff auf ein defektes NFS-Share am Host. Lösung: Da der Container den Host-Kernel teilt, kann ein solcher Prozess nicht einfach “getötet” werden. Oft hilft nur ein Reboot des gesamten Hosts, nachdem das Speicherproblem gelöst wurde.
# 6. Experten-Checkliste für LXC
- [ ] Unprivileged Modus gewählt (Sicherheit)?
- [ ] Cgroup v2 am Host aktiv (für feingranulares Limitierung)?
- [ ] Features (NFS, FUSE, etc.) nur bei Bedarf aktiviert?
- [ ] Root-Disk auf ZFS oder LVM-Thin (für schnelle Snapshots)?
- [ ] Templates regelmäßig aktualisiert?