proxmox virtualization lxc containers namespaces cgroups security sysadmin-deep-dive

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

  1. Namespaces (Sichtbarkeit): Sorgen dafür, dass ein Container nur seine eigenen Prozesse, Netzwerkinterfaces und Mount-Points sieht.
  2. 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?