Single-Node Installation (Deutsch)

Deutsche Anleitung für eine Proxmox-9 Installation auf einem einzelnen Rechner mit 3 Festplatten.

Proxmox VE Einführung

Proxmox Virtual Environment (Proxmox VE) ist eine Open-Source-Plattform zur Servervirtualisierung, die hypervisorbasierte virtuelle Maschinen und containerbasierte Virtualisierung in einer gemeinsamen Verwaltungslösung vereint. Basierend auf Debian Linux kombiniert Proxmox die Technologien KVM und LXC und stellt Administratoren sowohl eine einheitliche Weboberfläche als auch Kommandozeilenwerkzeuge zur Verwaltung virtueller Infrastrukturen bereit. Aufgrund seiner Flexibilität sowie der integrierten Cluster- und Backup-Funktionen wird Proxmox VE häufig sowohl in Unternehmensumgebungen als auch in Homelabs eingesetzt.


Eckdaten


Architektur und Funktionen

Proxmox VE wird direkt auf der Hardware installiert (Bare-Metal-Betrieb) und benötigt kein zusätzliches Host-Betriebssystem. Die Plattform unterstützt sowohl vollständige Virtualisierung mit KVM als auch leichtgewichtige Container mit LXC, wodurch ressourceneffiziente Deployments möglich sind.

Zu den zentralen Funktionen gehören:


Storage und Backup

Proxmox VE unterstützt eine Vielzahl von Storage-Backends, darunter:

Dies ermöglicht eine flexible Verwaltung der Daten von virtuellen Maschinen und Containern.

Das integrierte Backup-System, der Proxmox Backup Server, unterstützt inkrementelle und deduplizierte Sicherungen. Planung, Durchführung und Verifikation von Backups sind direkt in die Proxmox-Oberfläche integriert.


Clustering und Hochverfügbarkeit

Mehrere Proxmox-Nodes können zu einem Cluster zusammengeschlossen werden, der über das Proxmox Cluster File System (pmxcfs) verwaltet wird.

Dadurch werden folgende Funktionen ermöglicht:

Diese Funktionen unterstützen hohe Verfügbarkeit und gute Skalierbarkeit auch in produktiven Umgebungen.


Nutzung und Community

Durch das Open-Source-Modell und optionalen Subskriptions-Support hat sich rund um Proxmox VE eine große internationale Community gebildet. Die Plattform wird häufig von IT-Fachleuten, Bildungseinrichtungen sowie kleinen und mittelständischen Unternehmen eingesetzt, die eine kosteneffiziente Virtualisierungslösung mit Funktionsumfang auf Enterprise-Niveau suchen.

Proxmox VE bietet dabei viele Funktionen, die mit proprietären Lösungen wie VMware vSphere oder Microsoft Hyper-V vergleichbar sind.

Proxmox VE Installations- und Konfigurationshandbuch

Diese Anleitung beschreibt die Schritte zur Installation und Konfiguration von Proxmox VE, einer leistungsstarken Open-Source-Virtualisierungsplattform. Folge diesen Anweisungen sorgfältig, damit alles reibungslos klappt.

Lade die Proxmox VE ISO herunter

Geh auf die offizielle Proxmox-Website und lade das neueste Proxmox VE ISO-Image für deine Serverarchitektur herunter.

https://www.proxmox.com/de/

Erstelle einen bootfähigen USB-Stick

Nutze BalenaEtcher (oder ein anderes Tool, das du magst, z. B. Rufus oder dd), um die ISO-Datei auf einen USB-Stick zu flashen.

Tipp: Check nach dem Download die ISO-Prüfsumme, damit du sicher bist, dass die Datei heil ist.

Starte die Installation

Falsche Schnittstelle korrigieren (ohne Neuinstallation)

Falls du die falsche Schnittstelle ausgewählt hast:

# Geh auf die lokale Konsole (Monitor+Tastatur oder IPMI/iLO).
nano /etc/network/interfaces

Passe die Zeilen „auto“ und „iface“ an deine gewünschte Netzwerkkarte an (z. B. „enp0s3“) und führ danach aus:

systemctl restart networking

Damit sparst du dir die komplette Neuinstallation.

Konfiguration nach der Installation

Enterprise-Repositorys deaktivieren

Repository ohne Abo aktivieren

Klick auf Hinzufügen → Wähle Ohne Abonnement → Trag ein:

deb https://download.proxmox.com/debian/pve bookworm pve-no-subscription

Bestätige und schließe.

Aktualisiere das System

Starte das System neu, wenn du dazu aufgefordert wirst, damit der neue Kernel und die neuen Dienste geladen werden.

Container-Vorlagen aktualisieren

Öffne die Shell (über die Weboberfläche oder per SSH) und führ folgenden Befehl aus:

pveam update

Damit holst du dir die neuesten LXC-Container-Vorlagen aus dem Proxmox-Repository, sodass du aktuelle Basis-Images (Ubuntu, Debian, Alpine usw.) nutzen kannst.

Du betreibst jetzt einen komplett aktualisierten, abonnementfreien Proxmox VE-Knoten, der bereit ist für VMs, LXCs und Homelab-Experimente.

Proxmox VE neu installieren, ohne VM/LXC-Daten zu verlieren (nur ZFS)

TODO – IN ARBEIT

Warnung: Diese Methode gilt nur, wenn VMs und LXCs auf einem separaten ZFS-Pool liegen, der nicht dein Proxmox-Boot-Pool (rpool) ist.
Wählst du während der Installation die falschen Festplatten aus, löschst du deine VM-/Container-Daten für immer.

Geltungsbereich:
Entwickelt für Proxmox-Systeme mit einem einzigen Knoten, die ZFS nutzen.
Bei einem Cluster mit mehreren Knoten brauchst du zusätzliche Schritte für die Cluster-Wiederherstellung – die werden hier nicht behandelt.


Basisszenario


Schritt 1: Wichtige Konfigurationsdateien sichern

Die VM- und LXC-Metadaten (also quasi die „Shells“) liegen hier:

/etc/pve

Diese Dateien enthalten Namen, Hardware, Festplatten und Ressourcen.

VM-Konfigurationsdateien

/etc/pve/qemu-server/*.conf

LXC-Konfigurationsdateien

/etc/pve/lxc/*.conf

Empfohlene zusätzliche Sicherungen

/etc/network/interfaces
/etc/hosts
/etc/pve/storage.cfg

Tipp: Nutze scp, rsync oder WinSCP, um die Dateien an einen sicheren Ort zu kopieren.


Schritt 2: Alle Ressourcen sauber herunterfahren

Damit die Daten konsistent bleiben:

# Alle VMs stoppen
qm stop $(qm list | awk ‚NR>1 {print $1}‘)

# Alle LXCs stoppen
pct stop $(pct list | awk ‚NR>1 {print $1}‘)

Danach den Host ausschalten:

shutdown -h now

Schritt 3: Proxmox VE (sehr vorsichtig) neu installieren

  1. Von der Proxmox VE-ISO booten

  2. Bei der Festplattenauswahl:

    • Wähle nur die SSDs aus, die zu rpool gehören
    • Wähle auf keinen Fall die NVMe-Platten aus zfs-data aus
  3. Rest der Installation ganz normal durchlaufen

Wichtig: Falsche Festplatten auswählen = deine VM-Daten sind für immer weg.


Schritt 4: Den vorhandenen ZFS-Datenpool importieren

Nach dem ersten Boot:

zpool import

Wenn zfs-data automatisch da ist → super, weiter.
Falls nicht:

zpool import -f zfs-data

Check danach:

zpool status zfs-data
zfs list

Schau, ob die Datensätze mit deinen VM-Festplatten da sind.


Schritt 5: Konfigurationsdateien zurückspielen

Kopier die gesicherten Dateien wieder zurück:

scp qemu/*.conf root@<new-proxmox-ip>:/etc/pve/qemu-server/
scp lxc/*.conf root@<new-proxmox-ip>:/etc/pve/lxc/

Die sollten sofort in der Weboberfläche auftauchen.


Schritt 6: Den ZFS-Pool wieder als Speicher hinzufügen

Option A: Web-GUI (empfohlen)

Rechenzentrum → Speicher → Hinzufügen → ZFS
Auswählen: zfs-data
Inhalt: Festplatten-Image, Container

Option B: storage.cfg wiederherstellen

scp storage.cfg root@<new-proxmox-ip>:/etc/pve/storage.cfg
systemctl restart pve-cluster

Schritt 7: Prüfen, ob /etc/pve funktioniert (sehr wichtig)

Falls /etc/pve leer aussieht:

systemctl status pve-cluster
systemctl status corosync
journalctl -xe

Das Cluster-Dateisystem muss laufen, sonst kannst du die Konfigurationsdateien nicht nutzen.


Abschließende Überprüfung: Test-VM/LXC starten

qm start 100
pct start 103

Starten beide sauber → System ist wieder einsatzbereit.


Hinweis zur Wiederherstellung

Falls du die Konfigurationssicherungen verloren hast, kannst du die Metadaten eventuell trotzdem retten, indem du schaust:

/zfs-data

oder:

zfs list

Die Datensatz-Namen entsprechen meist den VM-IDs.


Zusammenfassung

Wenn du die Konfigurationsdateien sicherst und den alten ZFS-Datenpool einfach wieder importierst, kannst du Proxmox VE neu installieren ohne riesige VM-Disk-Images zu kopieren. Das spart dir massiv Zeit, Bandbreite und Ausfallzeit. Die ganzen Prüfschritte machen den Prozess deutlich sicherer und wiederholbar.

LXC-Festplattengröße in Proxmox erhöhen

Ich habe kürzlich bemerkt, dass mein BookStack LXC-Container auf Proxmox nur 8 GB Speicher zugewiesen hatte.
Zum Glück ist es ziemlich einfach, die Festplattengröße nachträglich zu vergrößern.

Die Festplattengröße über die Proxmox-Weboberfläche vergrößern
Die einfachste Methode geht direkt über die Proxmox VE Oberfläche:

  1. Melde dich in der Proxmox-Oberfläche an.
  2. Öffne deinen Container und geh auf Ressourcen.
  3. Wähle die Root Disk (Wurzel-Festplatte) aus.
  4. Im Dropdown-Menü Volume Action wählst du Resize (Größe ändern).
  5. Gib ein, wie viel zusätzlichen Speicherplatz du hinzufügen möchtest
    (du gibst also nur den Zuwachs an, nicht die endgültige Gesamtgröße).

Wichtig:
Die Festplattengröße kannst du hier nicht verkleinern.

proxmox-increase-disk-size.png

Die Festplattengröße über die Kommandozeile erhöhen

Du kannst die Festplatte auch direkt auf dem Proxmox-Host vergrößern:

  1. SSH dich auf deinen Proxmox-Server.

  2. Führe den Befehl pct resize mit der neuen Größe aus:

pct resize <vmid> <disk> <size>

Bei mir habe ich den Root-Disk meines BookStack-Containers (ID 105) auf 64 GB erhöht:

pct resize 105 rootfs 32G

Wichtig: Du gibst hier die Gesamtgröße an, die der Disk danach haben soll (nicht den Zuwachs).
Im Beispiel oben wird der Disk also auf insgesamt 64 GB gesetzt.

Nach dem Resize meldest du dich im Container an und prüfst die neue Größe mit:

df -h

Beide Methoden (Web-UI und Kommandozeile) funktionieren zuverlässig. Die Weboberfläche zeigt die aktualisierte Festplattengröße sofort an.

Einrichtung eines sicheren SSH-Zugangs für Proxmox und LXC

Das Ziel ist es, ein einheitliches, schlüsselbasiertes Authentifizierungsmodell sowohl für den Proxmox-Host als auch für seine Container aufzubauen:

Dieser Ansatz reduziert die Angriffsfläche und macht alles deutlich einfacher zu verwalten.


Teil 1: Bereite deinen lokalen Rechner vor

Generiere ein SSH-Schlüsselpaar

Falls du noch keins hast:

ssh-keygen -t ed25519 -C "admin"

Speichere es sicher, zum Beispiel hier:

/home/deinname/.ssh/admin_key

Optional: Füge den Schlüssel zum Agenten hinzu

Wenn der Schlüssel eine Passphrase hat:

ssh-add /home/deinname/.ssh/admin_key

Teil 2: Sichere den Proxmox-Host

Erstelle einen Administratorbenutzer

Auf dem Proxmox-Host (über Web-Shell oder SSH):

adduser admin
usermod -aG sudo admin

Stelle den SSH-Schlüssel bereit

ssh-copy-id -i /home/deinname/.ssh/admin_key.pub admin@<Proxmox-Hostname>

Teste den Zugriff:

ssh -i /home/deinname/.ssh/admin_key admin@<Proxmox-Hostname>

Deaktiviere die unsicheren Authentifizierungsmethoden

Bearbeite /etc/ssh/sshd_config:

PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes

Wende die Änderungen an:

systemctl restart sshd

Der Host akzeptiert jetzt nur noch schlüsselbasierte Anmeldungen für den admin-Benutzer.


Teil 3: Sichere deine LXC-Container

Viele Vorlagen erlauben SSH-Zugriff als Root – teilweise sogar mit Passwort. Wende dieselben Sicherheitsmaßnahmen in jedem Container an.

Erstelle einen Administratorbenutzer

Gehe in den Container:

pct enter <CTID>

Lege den Benutzer an und gib ihm sudo-Rechte:

adduser admin
usermod -aG sudo admin

Stelle deinen Schlüssel im Container bereit

Auf deinem lokalen Rechner:

ssh-copy-id -i /home/deinname/.ssh/admin_key.pub admin@<lxc-ip-oder-hostname>

Teste:

ssh admin@<lxc-ip-oder-hostname>

Deaktiviere die unsicheren Methoden im Container

Bearbeite /etc/ssh/sshd_config:

PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes

Starte neu:

sudo systemctl restart sshd

Der Container hat jetzt exakt dieselbe Sicherheitsstufe wie der Host.


Teil 4: Mach dir das Leben mit der lokalen SSH-Konfiguration leichter

Erstelle oder bearbeite die Datei:

~/.ssh/config

Beispiel-Inhalt:

Host proxmox
    HostName <Proxmox-Hostname>
    User admin
    IdentityFile /home/deinname/.ssh/admin_key

Host lxc-admin
    HostName <lxc-ip-oder-hostname>
    User admin
    IdentityFile /home/deinname/.ssh/admin_key

Schütze die Datei:

chmod 600 ~/.ssh/config

Ab jetzt reicht:

ssh proxmox
ssh lxc-admin

Ergebnis

Vorbereitung einer sicheren LXC-Vorlage (Proxmox)

Dieses Kapitel beschreibt, wie du eine gehärtete LXC-Vorlage erstellst, die du in Proxmox klonen kannst. Jeder Container, der aus dieser Vorlage erstellt wird, bietet:

Dieser Ansatz sorgt für konsistente und sichere Deployments ohne manuelle Nachbearbeitungsschritte.

Schritt 1: Einen Basis-Container erstellen

Erstelle einen normalen LXC-Container aus deinem bevorzugten Image, zum Beispiel:

pveam update
pveam download local debian-12-standard_*.tar.zst

Danach deploy den Container:

pct create <CTID> local:vztmpl/debian-12-standard_*.tar.zst

Starte ihn:

pct start <CTID>
pct enter <CTID>

Schritt 2: Den Admin-Benutzer in der Vorlage anlegen

Innerhalb des Containers:

adduser admin
usermod -aG sudo admin

Dieser Benutzer wird der einzige SSH-Einstiegspunkt.

Schritt 3: Deinen SSH-Public-Key installieren

Auf deiner lokalen Maschine stelle sicher, dass du einen Key hast:

ssh-keygen -t ed25519 -C "admin@lxc"

Kopiere ihn in den Container:

ssh-copy-id admin@<container-ip>

Teste den Login:

ssh admin@<container-ip>

Du solltest dich ohne Passwort einloggen können.

Schritt 4: Die SSH-Konfiguration härten

Innerhalb des Containers:

sudo nano /etc/ssh/sshd_config

Wende folgendes an:

- PermitRootLogin yes
+ PermitRootLogin no

- PasswordAuthentication yes
+ PasswordAuthentication no

- ChallengeResponseAuthentication yes
+ ChallengeResponseAuthentication no

(Optional):

PubkeyAuthentication yes

Starte neu:

sudo systemctl restart sshd

Schritt 5: Aufräumen und für die Vorlage vorbereiten

Damit keine temporären Artefakte weitervererbt werden:

Innerhalb des Containers:

history -c
rm -rf /tmp/*
apt clean

Nicht löschen:

Diese Dinge werden für die Funktionalität der Vorlage benötigt.

Schritt 6: Herunterfahren und in eine Vorlage umwandeln

Verlasse den Container und stoppe ihn:

pct stop <CTID>

Wandle ihn in eine Proxmox-Vorlage um:

pct template <CTID>

Der Container ist jetzt als wiederverwendbare Vorlage gespeichert.

Ergebnis

Jeder zukünftige Container, den du aus dieser Vorlage klonst, bietet automatisch:

Keine weiteren SSH-Härtungsschritte mehr nötig.

Beispiel zum Klonen

pct clone <TEMPLATE-ID> 120 --hostname web01 --storage local-lvm
pct start 120

Danach sofort verbinden:

ssh admin@web01

Proxmox VE: Warnung „ignore invalid acl token“ nach dem Löschen von Access Tokens

Zusammenfassung

Nach dem Löschen eines Access Tokens oder eines Benutzers in der Proxmox-GUI kann beim Zugriff auf Container oder VMs (z. B. mittels pct enter oder qm enter) folgende Warnmeldung erscheinen:

user config - ignore invalid acl token 'user@realm!tokenname'

Diese Meldung ist harmlos, weist jedoch auf verwaiste Token-Einträge in der Proxmox-Konfiguration hin und sollte bereinigt werden.

Der Text hier benutzt homepage@pam!homepage-192-168-10-110 als Beispielname.


Symptome


Ursache

Proxmox speichert Benutzer, Tokens und ACLs zentral in der Cluster-Konfigurationsdatei:

/etc/pve/user.cfg

Wichtiger Punkt (GUI-Verhalten)

Beim Löschen eines Users oder Access Tokens in der GUI werden zugehörige ACL-Einträge oder Token-Definitionen nicht automatisch vollständig entfernt.

Das führt zu folgendem Zustand:

Die Meldung ist irreführend, da sie nicht zwingend ein ACL-Problem ist, sondern ein Konfigurationsartefakt.


Diagnose

ACLs prüfen

pvesh get /access/acl

Wenn dort kein Eintrag mit dem genannten Token erscheint, liegt das Problem sehr wahrscheinlich in user.cfg.

Token-Einträge suchen

grep '^token:' /etc/pve/user.cfg

Oder gezielt:

grep 'homepage@pam' /etc/pve/user.cfg

Lösung (empfohlen)

1. Benutzerkonfiguration bearbeiten

nano /etc/pve/user.cfg

2. Verwaisten Token entfernen

Einen Eintrag dieser Art vollständig löschen:

token:homepage@pam!homepage-192-168-10-110:privsep=1:

⚠️ Nur den betroffenen token:-Eintrag entfernen, keine anderen Benutzer-, Rollen- oder ACL-Zeilen.


3. Dienste neu laden

systemctl restart pve-cluster pvedaemon pveproxy

Die Änderung wird clusterweit sofort wirksam (pmxcfs).


4. Verifikation

pct enter <CTID>

Die Warnmeldung sollte nicht mehr erscheinen.


Best Practices / Prävention


Hinweis

Das manuelle Bearbeiten von /etc/pve/user.cfg ist in diesem Fall zulässig und sicher, da es sich um eine vom Cluster-Dateisystem verwaltete Konfigurationsdatei handelt. Änderungen werden sofort synchronisiert.

Erstellen eines LXC-Container

Wir nutzen als Beispiel die ID 110.

Nach der Erstellung gehst du auf den Reiter Konsole und meldest dich als root an.
Falls nur ein Cursor zu sehen ist, klick einfach ins Konsolenfenster und drück Enter – dann erscheint die Eingabeaufforderung.
Melde dich mit root und deinem Passwort an.

System aktualisieren und upgraden:

apt update -qqy && apt upgrade -y

Nach Abschluss des Upgrades einmal neu starten.

Einen administrativen Benutzer anlegen und sudo-Rechte geben:

adduser admin
usermod -aG sudo admin

Ab jetzt kannst du entweder hier weitermachen oder in ein externes Terminal wechseln.

PostgreSQL Installation

Diesen Schritt kannst du als admin oder root machen. Beispiel als admin:

sudo apt update
sudo apt install postgresql postgresql-contrib -y
# Zum postgres-Benutzer wechseln
sudo -u postgres psql
# Innerhalb von psql:
CREATE DATABASE wikijs;
CREATE USER wikiuser WITH PASSWORD 'your_secure_password';
GRANT ALL PRIVILEGES ON DATABASE wikijs TO wikiuser;
\q

Node Installation

Folge den Anweisungen von der Node.js-Website:

sudo apt install curl -y
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash -
sudo apt install nodejs -y
node -v
npm -v
# npm auf die im Terminal angezeigte Version bringen
sudo npm install -g npm@11.6.2

Wiki.js System-Benutzer anlegen

Erstelle einen dedizierten System-Benutzer für den Wiki.js-Dienst:

sudo useradd -r -s /usr/sbin/nologin wikijs
sudo mkdir -p /var/www/wiki
sudo chown wikijs:wikijs /var/www/wiki

Wiki.js Installation

Basierend auf der offiziellen Dokumentation: https://docs.requarks.io/install/linux

Installation

  1. Neueste Wiki.js-Version herunterladen:

    wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
    
  2. Dateien entpacken:

    mkdir wiki
    tar xzf wiki-js.tar.gz -C ./wiki
    cd ./wiki
    
  3. Beispiel-Konfiguration umbenennen:

    mv config.sample.yml config.yml
    
  4. Konfiguration bearbeiten:

    nano config.yml
    
  5. (Nur bei SQLite-Installationen):

    npm rebuild sqlite3
    
  6. Wiki.js starten:

    node server
    
  7. Warte auf die Setup-Meldung und öffne die angegebene URL in deinem Browser.

  8. Den Setup-Wizard durchlaufen.

Als Systemdienst (systemd) einrichten

  1. Service-Datei erstellen:

    sudo nano /etc/systemd/system/wiki.service
    
  2. Folgenden Inhalt einfügen (Pfade bei Bedarf anpassen):

    [Unit]
    Description=Wiki.js
    After=network.target
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/node server
    Restart=always
    User=nobody
    Environment=NODE_ENV=production
    WorkingDirectory=/var/wiki
    
    [Install]
    WantedBy=multi-user.target
    
  3. Speichern und schließen.

  4. systemd neu laden:

    sudo systemctl daemon-reload
    
  5. Dienst starten:

    sudo systemctl start wiki
    
  6. Autostart aktivieren:

    sudo systemctl enable wiki
    

Logs kannst du so anschauen:

journalctl -u wiki

SMB Share der NAS in einen Unpriviliged LXC Container bringen

Nachdem ich zahlreiche Projekte mit Proxmox umgesetzt habe, ist es für mich die vielseitigste Virtualisierungsplattform überhaupt. Dank der großen Anzahl an Community-Skripten und der klaren Ausrichtung auf Home-Lab-Setups lässt sich mit Proxmox und etwas Geduld nahezu alles realisieren – von virtualisierten Entwicklungsumgebungen und produktiven Alltags-VMs bis hin zu vollständigen Hackintosh-Installationen.

Ein NAS habe ich bislang bewusst nicht auf meinen PVE-Systemen betrieben und Storage-Server stets von meinen Proxmox-Workstations getrennt gehalten. Nach mehreren Gesprächen mit einigen Menschen im IRC und XMPP ob es möglich sei einen virtualisierten NAS-Ansatz zu betreiben, kamen wir zu dem Schluss, dass es zwar geht, aber dennoch keine optimale Sache sei und es zum testen und ausprobieren ok, aber für Produktivsysteme nicht geeignet ist. Allerdings fanden wir bei der Diskussion eine elegante Möglichkeit, Netzwerkfreigaben aus dieser VM mit unprivilegierten LXCs zu verbinden – ohne den sonst üblichen, aufwendigen Terminal-Einsatz. Und darum geht es hier.

Warum macht man das?

Nützlich, wenn ausschließlich unprivilegierte LXCs zum Einsatz kommen

Zwischen meiner ausgeprägten Neigung, möglichst viele Serverkomponenten anzuschaffen, betreibe ich sowohl ein primäres als auch ein sekundäres NAS, wobei Letzteres für Storage-Experimente genutzt wird. Wer zum Testen kein separates NAS sein eigenen nennt, kann unter Proxmox auch ein OpenMediaVault oder ein TrueNAS in einer VM einrichten. Damit funktioniert es genauso gut.

Überblick

Im Hinblick auf die Netzwerkfreigaben sieht mein Setup wie folgt aus: Auf meinem Test-NAS läuft eine SMB-Freigabe, die zunächst auf dem PVE-Host eingebunden wird. Anschließend wird per Terminal ein Mountpunkt auf den Node für den LXC eingerichtet, sodass die Freigabe dort wie ein lokales Laufwerk erscheint. Dieser Umweg ist notwendig, da unprivilegierte Container häufig Berechtigungsprobleme beim direkten Einbinden von Netzwerkfreigaben verursachen. Aus Sicherheitsgründen sind unprivilegierte LXCs zwar vorzuziehen, sie erschweren jedoch genau dieses Szenario. Der beschriebene Ansatz umgeht diese Einschränkung und ermöglicht die Nutzung von SMB-Freigaben in sicheren, unprivilegierten Containern, ohne sich mit komplexen UID-/GID-Zuordnungen befassen zu müssen.

Annahmen

Auserdem gehen wir davon aus, dass auf dem NAS ein Nutzer namens "Testuser" mit Passwort existiert und die Freigabe unter smb://192.168.10.20/test-folder erreichbar ist.

Außerdem verfügen wir über einen beliebigen LXC Container den wir zum Testen verwenden wollen. Ich habe hierzu einfach einen neuen LXC mit einer ID von 500 erstellt mit minimal CPU und RAM Angaben.

Synology Nutzer und Share

image.png

image.png

Einbinden des Share in Proxmox Node

image.png

Nachdem die SMB-Freigabe auf der Synology eingerichtet war, wechselte ich zu meinem Proxmox-Host. Vor dem Anlegen des LXCs öffnete ich in der Proxmox-Weboberfläche den Datastore, ging auf den Reiter Storage und wählte über Add → CIFS/SMB eine neue Netzwerkfreigabe aus. Als ID genügt ein beliebiger Name, als Server trug ich die IP-Adresse der Synology ein und hinterlegte Benutzername sowie Passwort des SMB-Kontos. Anschließend wurde die Freigabe automatisch erkannt und hinzugefügt.

image.png

Als Nächstes erstellte ich ein Verzeichnis, das als Mountpunkt im LXC dienen sollte. Dafür wechselte ich in die Shell meines debianbasierten unprivilegierten Container den ich zu Testzwecken mit der ID 500 angelegt hatte. Anstatt zunächst Anwendungen zu konfigurieren, wechselte ich in der Proxmox-Oberfläche direkt in die Console des Containers und legte mit mkdir /mnt/test-folder das entsprechende Verzeichnis an.

image.png

Zum Schluss wechselte ich auf dem Proxmox-Host in die Shell, navigierte nach /etc/pve/lxc, öffnete die Konfigurationsdatei des entsprechenden Containers (500.conf) und ergänzte dort die erforderliche Mount-Konfiguration, um die SMB-Freigabe im LXC verfügbar zu machen.

image.png

Hier verweist die Variable test-folder auf die ID, die ich der SMB-Freigabe in Proxmox zugewiesen hatte. Auch ohne einen Neustart sollte es funktionieren, zur Sicherheit aber, ist es sinnvoll einen Neustart des Containers durchzuführen und dann zu schauen, ob dar eingebundene Verzeichnis im LXC sichtbar wird. In meinem Fall hat es geklappt.

image.png

Test der Verbindung und erweitern der Rechte

Zur Überprüfung lud ich eine Datei auf die Synology NAS hoch, die anschließend unmittelbar im Container erschien. Damit war bestätigt, dass die Einbindung der SMB-Freigabe korrekt funktionierte.

Das tut es auch soweit so gut. Innerhalb des LXC kann ich nun lesend auf die Dateien zugreifen. Schreiben jedoch nicht, da die Rechte nicht weitergereicht werden.

Um es dem lokalen root Nutzer des LXC zu ermöglichen auch Daten zu schreiben, ist noch ein kleiner Handgriff von Nöten.

Und zwar müssen wir auf dem Proxmox Node dazu einmal die /etc/pve/storage.cfg öffnen und folgende Zeile hinzüfugen

options uid=100000,gid=100000,file_mode=0770,dir_mode=0770

image.png

Wenn wir das gemacht haben, speichern wir die Datei und starten die LXC neu. Danach sollte der Ordner nun Root gehören, und die korrekten Berechtigungen haben.

image.png

Ultraleichte Linux-Optionen für Proxmox: DietPi und seine minimalistischen Alternativen

DietPi ist eine extrem optimierte Debian-basierte Distribution, die speziell für minimalen Ressourcenverbrauch entwickelt wurde. Dadurch eignet sie sich hervorragend als Basis für Proxmox LXC-Container und leichtgewichtige VMs. Mit ihrem winzigen Footprint, kaum laufenden Hintergrundprozessen und einem RAM-optimierten Logging-System liefert sie beeindruckende Performance – selbst auf eher bescheidener Hardware.

Das integrierte DietPi-Software-System macht die Sache noch einfacher: Beliebte Anwendungen wie Pi-hole, Docker, Home Assistant oder Nextcloud installierst und konfigurierst du mit nur wenigen Auswahlen – fertig vorkonfiguriert, ohne stundenlanges manuelles Herumgefummel.

DietPi steht aber nicht allein da. Es gibt mehrere andere minimalistische Linux-Distributionen, die ähnliche Ziele verfolgen:

Alle diese Varianten bieten unterschiedliche Kompromisse zwischen Größe, Features und Bequemlichkeit. DietPi hebt sich vor allem durch seine Automatisierung und Optimierungs-Tools ab – du bekommst schnell eine einsatzbereite Umgebung, ohne dass der Ressourcenverbrauch explodiert.

Für Proxmox-Nutzer, die maximale Effizienz ohne unnötige Komplexität wollen, bieten DietPi und seine minimalistischen Alternativen eine richtig starke und flexible Basis.

LXC Post-Install: User-Setup & SSH Hardening

Dieses Post-Install-Skript wird als root in einem frischen LXC-Container ausgeführt. Es automatisiert die grundlegende Einrichtung und Absicherung des Systems. Folgende Schritte werden durchgeführt:


1. Vorbereitung (Host-System)

Lege das Post-Install-Skript (z.B. post_install_ssh.sh) und deinen Public Key (z.B. ADMIN.pub) in einem gemeinsamen Verzeichnis auf deinem Rechner ab.

Wechsle im Terminal in dieses Verzeichnis und starte einen temporären Python-Webserver, um die Dateien im Netzwerk bereitzustellen:

python -m http.server 8080

Hinweis: Notiere dir die IP-Adresse dieses Rechners (im folgenden Beispiel 10.10.10.10), da diese im nächsten Schritt benötigt wird.


2. Ausführung (LXC-Container)

Verbinde dich als root mit dem neuen LXC-Container.

Führe den folgenden Befehl aus. Er lädt das Skript herunter, macht es ausführbar und übergibt den Inhalt deines Public Keys direkt als Argument an das Skript.

(Passe die IP-Adresse 10.10.10.10 entsprechend an!)

curl -fsS [http://10.10.10.10:8080/post_install_ssh.sh](http://10.10.10.10:8080/post_install_ssh.sh) -o /tmp/bootstrap.sh \
  && chmod +x /tmp/bootstrap.sh \
  && /tmp/bootstrap.sh "$(curl -fsS [http://10.10.10.10:8080/ADMIN.pub](http://10.10.10.10:8080/ADMIN.pub))"

3. Das Post-Install-Skript (post_install_ssh.sh)

Wichtig: Passe den Wert USER_NAME="ADMIN" an deinen gewünschten Benutzernamen an, bevor du das Skript über den Webserver bereitstellst.

#!/usr/bin/env bash
set -euo pipefail

USER_NAME="ADMIN"
PUBKEY="${1:-}"
SSHD_CONFIG="/etc/ssh/sshd_config"

echo "==== SSH Bootstrap Starting ===="

########################################
# Ensure user exists
########################################
if id "${USER_NAME}" &>/dev/null; then
    echo "User ${USER_NAME} already exists."
else
    echo "Creating user ${USER_NAME}..."
    useradd -m -s /bin/bash "${USER_NAME}"
fi

########################################
# Ensure sudo privileges
########################################
if ! id -nG "${USER_NAME}" | grep -qw sudo; then
    echo "Adding ${USER_NAME} to sudo group..."
    usermod -aG sudo "${USER_NAME}"
fi

########################################
# Configure passwordless sudo
########################################
echo "Installing sudo if it is not installed"
apt install sudo -y -q

SUDO_FILE="/etc/sudoers.d/${USER_NAME}"

echo "Configuring passwordless sudo for ${USER_NAME}..."
echo "${USER_NAME} ALL=(ALL) NOPASSWD: ALL" > "${SUDO_FILE}"
chmod 440 "${SUDO_FILE}"

# Validate sudoers syntax before proceeding
visudo -cf "${SUDO_FILE}"

########################################
# Configure SSH key
########################################
SSH_DIR="/home/${USER_NAME}/.ssh"
AUTHORIZED_KEYS="${SSH_DIR}/authorized_keys"

mkdir -p "${SSH_DIR}"
chmod 700 "${SSH_DIR}"
touch "${AUTHORIZED_KEYS}"
chmod 600 "${AUTHORIZED_KEYS}"
chown -R "${USER_NAME}:${USER_NAME}" "${SSH_DIR}"

if [[ -n "${PUBKEY}" ]]; then
    if ! grep -qxF "${PUBKEY}" "${AUTHORIZED_KEYS}"; then
        echo "Installing public key..."
        echo "${PUBKEY}" >> "${AUTHORIZED_KEYS}"
    fi
else
    echo "WARNING: No public key supplied."
fi

########################################
# Remove all root SSH authorized keys
########################################
ROOT_SSH_DIR="/root/.ssh"
ROOT_AUTH_KEYS="${ROOT_SSH_DIR}/authorized_keys"
ROOT_AUTH_KEYS2="${ROOT_SSH_DIR}/authorized_keys2"

echo "Removing root SSH authorized keys..."

if [[ -d "${ROOT_SSH_DIR}" ]]; then
    rm -f "${ROOT_AUTH_KEYS}" "${ROOT_AUTH_KEYS2}"
    chmod 700 "${ROOT_SSH_DIR}" 2>/dev/null || true
    chown root:root "${ROOT_SSH_DIR}" 2>/dev/null || true
    echo "Root authorized_keys removed."
else
    echo "No root .ssh directory present."
fi

########################################
# Backup sshd_config
########################################
BACKUP="${SSHD_CONFIG}.$(date +%F-%H%M%S).bak"
cp "${SSHD_CONFIG}" "${BACKUP}"
echo "Backup created at ${BACKUP}"

########################################
# Idempotent config helper
########################################
set_config() {
    local key="$1"
    local value="$2"

    if grep -qiE "^\s*#?\s*${key}\b" "${SSHD_CONFIG}"; then
        sed -ri "s|^\s*#?\s*${key}\b.*|${key} ${value}|I" "${SSHD_CONFIG}"
    else
        echo "${key} ${value}" >> "${SSHD_CONFIG}"
    fi
}

########################################
# Apply SSH hardening
########################################
echo "Applying SSH hardening..."

set_config "PermitRootLogin" "no"
set_config "PasswordAuthentication" "no"
set_config "KbdInteractiveAuthentication" "no"
set_config "ChallengeResponseAuthentication" "no"
set_config "PubkeyAuthentication" "yes"
set_config "AllowUsers" "${USER_NAME}"

########################################
# Validate before restart
########################################
echo "Validating sshd config..."
sshd -t

########################################
# Restart SSH
########################################
echo "Restarting SSH service..."
if command -v systemctl &>/dev/null; then
    systemctl restart sshd 2>/dev/null || systemctl restart ssh
else
    service ssh restart
fi

echo "==== SSH Hardening Complete ===="
echo "✔ Root SSH disabled"
echo "✔ Password auth disabled"
echo "✔ Only ${USER_NAME} allowed"

4. Beispiel-Ausgabe

Bei einer erfolgreichen Ausführung sollte die Ausgabe im Terminal deines LXC-Containers in etwa so aussehen:

==== SSH Bootstrap Starting ====
Creating user ADMIN...
Adding ADMIN to sudo group...
Installing sudo if it is not installed
Reading package lists...
Building dependency tree...
Reading state information...
sudo is already the newest version (1.9.16p2-3+deb13u1).
Summary:
  Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 0
Configuring passwordless sudo for ADMIN...
/etc/sudoers.d/ADMIN: parsed OK
Installing public key...
Removing root SSH authorized keys...
Root authorized_keys removed.
Backup created at /etc/ssh/sshd_config.2026-03-18-191349.bak
Applying SSH hardening...
Validating sshd config...
Restarting SSH service...
==== SSH Hardening Complete ====
✔ Root SSH disabled
✔ Password auth disabled
✔ Only ADMIN allowed

5. Login nach der Einrichtung

Sobald das Skript erfolgreich durchgelaufen ist, wurde der root-Login über SSH deaktiviert. Du kannst dich nun von deinem Client-Rechner aus (auf dem der passende Private Key liegt) sicher mit dem neu erstellten Benutzer anmelden:

ssh ADMIN@<IP-ADRESSE-DES-LXC>

Da das Skript passwortloses sudo eingerichtet hat, kannst du administrative Befehle nun einfach mit vorangestelltem sudo ausführen, ohne ein Passwort eingeben zu müssen (z.B. sudo apt update).