Werkstatt & Experimente Homelab & Server
Zwei USB-Festplatten, ein Proxmox und eine Horde Ratten
Ausgangspunkt war ein vorhandenes NAS, das für seinen verbliebenen Einsatzzweck unnötig Strom verbrauchte. Da ohnehin ein Proxmox-Server läuft, wollten wir prüfen, ob sich zwei vorhandene USB-Festplatten direkt am Proxmox-Host betreiben und über einen schlanken Debian-LXC mit Samba im Netzwerk bereitstellen lassen – als ganz normaler Netzwerkspeicher für Daten und Downloads.

Die Idee ist schnell erzählt: Die Festplatten hängen per USB am Proxmox-Host, werden dort fest eingehängt und dann an einen kleinen Container durchgereicht. Erst im Container läuft Samba und stellt die Daten im Netzwerk bereit.

Zuerst die Datenträger identifizieren – zum Beispiel mit:
lsblk -f
In unserem realen Aufbau wurden zwei USB-Festplatten erkannt. Beide verwenden NTFS und wurden mit dem Linux-Treiber ntfs3 eingebunden.
Mountpoints anlegen:
mkdir -p /mnt/wd8tb
mkdir -p /mnt/wd14tb
Die produktive Konfiguration verwendet UUIDs in /etc/fstab. So hängt die Zuordnung nicht davon ab, ob Linux eine Platte beim nächsten Start als /dev/sda, /dev/sdb usw. erkennt.
Vor jeder Änderung eine Sicherung anlegen:
cp /etc/fstab /etc/fstab.backup-YYYYMMDD
Danach die UUID-basierten Einträge ergänzen. Die Werte in spitzen Klammern sind Platzhalter:
UUID=<UUID-DER-ERSTEN-PLATTE> /mnt/wd8tb ntfs3 <OPTIONEN> 0 0
UUID=<UUID-DER-ZWEITEN-PLATTE> /mnt/wd14tb ntfs3 <OPTIONEN> 0 0
Konfiguration anschließend prüfen:
systemctl daemon-reload
mount -a
findmnt /mnt/wd8tb
findmnt /mnt/wd14tb

Für den Fileserver wurde ein schlanker Debian-13-LXC eingerichtet. Mehr braucht es für Samba nicht.
Die auf dem Proxmox-Host eingehängten USB-Festplatten werden als Bind Mounts in den Container eingebunden. In der Container-Konfiguration auf dem Host (/etc/pve/lxc/<CTID>.conf) sieht das in unserem Aufbau so aus:
mp0: /mnt/wd8tb,mp=/mnt/wd8tb
mp1: /mnt/wd14tb,mp=/mnt/wd14tb
Danach im Container kontrollieren, ob beide Platten ankommen:
df -h /mnt/wd8tb /mnt/wd14tb
Im Debian-LXC Samba installieren und einen Benutzer für den SMB-Zugriff anlegen:
apt update
apt install samba
smbpasswd -a <benutzer>
Die beiden Datenträger werden anschließend als eigene Freigaben in der Samba-Konfiguration angelegt. Die Grundstruktur:
[WD8TB]
path = /mnt/wd8tb
browseable = yes
read only = no
guest ok = no
valid users = <benutzer>
[WD14TB]
path = /mnt/wd14tb
browseable = yes
read only = no
guest ok = no
valid users = <benutzer>
force user, force group, create mask, directory maskIn unserem tatsächlichen Aufbau haben wir zusätzlich diese vier Optionen verwendet. Kurz erklärt:
force user / force group – alle Zugriffe über die Freigabe laufen im Container unter einem festen Benutzer bzw. einer festen Gruppe.create mask / directory mask – legen fest, welche Rechte neu angelegte Dateien bzw. Verzeichnisse höchstens bekommen.Das ist keine allgemeine Empfehlung: Welche Werte sinnvoll sind, hängt davon ab, wie Rechte auf dem Host, im Container und auf dem Dateisystem zusammenspielen. Berechtigungen müssen zum eigenen System passen.
Konfiguration prüfen und Dienst kontrollieren:
testparm
systemctl status smbd

Vom Windows-PC aus geht es im Explorer über die Adresse des Fileservers:
\\<IP-DES-FILESERVERS>
Dabei nicht nur schauen, ob die Freigaben auftauchen. Mindestens das hier gehört zum Test:
In unserem Test funktionierten Lesen und Schreiben auf beiden Datenträgern.

Aus dem Rattenlabor
Eigentlich lief alles. Also wollten wir die Samba-Konfiguration noch schnell aufräumen. Der standardmäßige Bereich [homes] stand da herum, und für unsere beiden eigentlichen Freigaben brauchten wir ihn nicht. Also: weg damit.
Das sieht überflüssig aus.
Muss ich was aufräumen?
[homes] verschwindet.Auftrag erledigt.
Danach verweigerte Windows plötzlich den Zugriff. Der direkte Samba-Test funktionierte aber weiterhin – Samba selbst und die eigentlichen Freigaben waren also grundsätzlich erreichbar. Nachdem [homes] wiederhergestellt war, klappte der Windows-Zugriff sofort wieder.
Unsere funktionierende [homes]-Konfiguration:
[homes]
browseable = No
comment = Home Directories
create mask = 0700
directory mask = 0700
valid users = %S

Am Ende funktionierte:
findmnt /mnt/wd8tb
findmnt /mnt/wd14tb
pct status <CTID>
pct exec <CTID> -- systemctl is-active smbd
pct exec <CTID> -- df -h /mnt/wd8tb /mnt/wd14tb
Anschließend noch einmal den Lese- und Schreibzugriff von Windows testen.

Aus dem Rattenlabor
Alle Tests grün, Checkliste abgehakt, Kaffee verdient. Dann kam der eigentliche Umzug: vorhandene Daten vom QNAP auf die neue Samba-Freigabe verschieben. Und Windows so:
Schreibtest bestanden. Was soll da schon passieren?
Aber … der Schreibtest hat doch funktioniert.
Das war ein echter Fehler aus unserem Aufbau – trotz zuvor erfolgreicher Schreibtests unter Windows.
Zuerst haben wir im Container nachgesehen, wem der Datenträger und der betroffene Ordner gehören:
pct exec <CTID> -- ls -ld /mnt/<datentraeger>
pct exec <CTID> -- ls -ld "/mnt/<datentraeger>/<problematischer-ordner>"
Die Verzeichnisse erschienen als nobody nogroup. Danach die tatsächlichen Mountoptionen auf dem Proxmox-Host:
findmnt -no SOURCE,FSTYPE,OPTIONS /mnt/<datentraeger>
Der NTFS3-Datenträger war effektiv mit uid=0,gid=0 eingebunden – er gehörte also Host-root.
Der Fileserver läuft als unprivilegierter LXC. Deshalb entspricht root im Container nicht automatisch der Host-UID 0 – die Benutzer- und Gruppen-IDs des Containers werden auf einen eigenen Bereich des Hosts abgebildet. Dateien, die Host-UID 0 gehören, liegen außerhalb dieses Bereichs; im Container tauchen sie deshalb als nobody nogroup auf, und Container-root darf dort nicht einfach schreiben.
Das verwendete Mapping lässt sich auf dem Host prüfen:
grep '^root:' /etc/subuid /etc/subgid
In unserem konkreten System ergab sich:
/etc/subuid:root:100000:65536
/etc/subgid:root:100000:65536
Damit entspricht Container-root in unserem Aufbau der Host-UID/GID 100000.
Vor der Änderung wurde /etc/fstab wieder gesichert (siehe Kapitel 02). Ursprünglich waren die Datenträger sinngemäß so eingebunden:
UUID=<UUID> /mnt/<datentraeger> ntfs3 defaults,nofail 0 0
Für unseren unprivilegierten Container wurde die Besitzzuordnung passend zum ermittelten Mapping ergänzt:
UUID=<UUID> /mnt/<datentraeger> ntfs3 defaults,nofail,uid=100000,gid=100000 0 0
Der LXC wurde vor dem Neu-Einhängen gestoppt:
pct stop <CTID>
Kleiner Stolperstein nebenbei
Mitten in den Arbeiten meldete sich die fstab selbst:
/etc/fstab: parse error at line 1
Schuld war die Kopfzeile ganz oben – ihr fehlte das führende Kommentarzeichen:
<file system> <mount point> <type> <options> <dump> <pass>
# <file system> <mount point> <type> <options> <dump> <pass>
Ein einzelnes #. Die Ratten haben es inzwischen eingerahmt.
Vor dem tatsächlichen Mount wurde die Syntax mit einem Testlauf geprüft – -f tut nur so, als würde es einhängen:
mount -a -f
Danach neu einlesen, einhängen und kontrollieren:
systemctl daemon-reload
mount /mnt/<datentraeger>
findmnt -no SOURCE,FSTYPE,OPTIONS /mnt/<datentraeger>
Jetzt war die gewünschte UID/GID-Zuordnung aktiv.
Container starten und noch einmal nachsehen:
pct start <CTID>
pct exec <CTID> -- ls -ld /mnt/<datentraeger>
Die Verzeichnisse erschienen nicht mehr als nobody nogroup, sondern korrekt als root root. Anschließend direkt im zuvor problematischen Ordner ein Schreibtest:
pct exec <CTID> -- touch "/mnt/<datentraeger>/<problematischer-ordner>/schreibtest.txt"
Der Test war erfolgreich; die Testdatei wurde danach wieder entfernt.
Ergebnis aus dem realen Betrieb: Nach dieser Korrektur funktioniert auch das tatsächliche Schreiben bzw. Verschieben der Daten vom QNAP auf die neue Samba-Freigabe.
Der Labortest war bestanden. Dann kam die Realität – und noch eine Ratte kroch aus dem Berechtigungsmodell.
Ein universeller NAS-Ersatz ist das nicht. Für unseren konkreten Einsatzzweck ließen sich die vorhandenen USB-Festplatten aber mit sehr wenig zusätzlichem Ressourcenbedarf über den ohnehin laufenden Proxmox-Server als Netzwerkspeicher bereitstellen.
Versuch erfolgreich. Zwei Festplatten im Netz, ein Gerät weniger im Dauerbetrieb – und die RiB haben gelernt, dass nicht alles, was überflüssig aussieht, auch gelöscht werden sollte.