Zurück zur Startseite

Samba, ZFS, VirtioFS: Einrichtung eines Dateiservers mit ACL und XATTR

Detaillierte Anleitung zur Integration von Samba mit ZFS über VirtioFS auf KVM, Behebung von ACL- und xattr-Problemen für Windows-kompatible Zugriffsrechte und Schattenkopien.

Samba, ZFS und VirtioFS: Tiefgehende Analyse von ACL- und xattr-Problemen in NAS
Advertisement 728x90

Samba und ZFS mit VirtioFS integrieren: ACL- und XATTR-Herausforderungen meistern

Der Aufbau eines hochperformanten SMB-Dateiservers mit ZFS-Speicher in einer KVM-virtualisierten Umgebung mittels VirtioFS birgt einzigartige Herausforderungen, insbesondere hinsichtlich der korrekten Handhabung von Zugriffssteuerungslisten (ACLs) und erweiterten Attributen (xattr), um die Kompatibilität mit Windows-Clients zu gewährleisten. Dieser Artikel beschreibt den Konfigurationsprozess und wie man zentrale Hürden überwindet, um die volle Funktionalität und einen stabilen Betrieb der Dateifreigabe sicherzustellen.

Wahl von VirtioFS für die Speichervirtualisierung

Beim Aufbau eines Network Attached Storage (NAS) auf Basis von ZFS und der anschließenden Einrichtung von Freigaben über Samba ist eine effiziente Methode zur Anbindung des ZFS-Pools an die virtuelle Maschine (VM) erforderlich. Zunächst wurden verschiedene Ansätze in Betracht gezogen, darunter NFS, doch die direkte Verzeichnisdurchleitung (Direct Directory Pass-Through), die der KVM-Hypervisor bietet, erregte besondere Aufmerksamkeit. Unter den verfügbaren Optionen, wie virtio-9p und VirtioFS, wurde Letzteres gewählt.

virtio-9p wurde aufgrund seiner Instabilität, begrenzten POSIX-Unterstützung und schlechten Performance ausgeschlossen, was es für kritische Dateiserver-Aufgaben ungeeignet machte. VirtioFS hingegen zeigte dank seiner Architektur, die virtuellen Maschinen den direkten und performanten Zugriff auf das Dateisystem des Hosts ermöglicht, ein deutlich größeres Potenzial.

Google AdInline article slot

Trotz seiner klaren Vorteile hatte VirtioFS jedoch seine Eigenheiten. Standardmäßige virt-manager-Einstellungen boten keine Optionen, die Unterstützung für erweiterte Attribute (xattr) und Zugriffssteuerungslisten (ACLs) zu aktivieren, welche für das korrekte Zusammenspiel von Samba mit Windows-Clients entscheidend sind. Erweiterte Attribute ermöglichen das Speichern zusätzlicher Dateiinformationen, während ACLs detaillierte Zugriffsrechte für Benutzer und Gruppen definieren und die Grundlage für NTFS-Berechtigungen in Windows bilden. Ohne diese Funktionen wäre eine vollständige Integration von Samba und ZFS unmöglich.

Konfiguration von VirtioFS für ACL- und XATTR-Unterstützung

Die größte Herausforderung bestand darin, sicherzustellen, dass der auf dem Host laufende virtiofsd-Daemon mit den notwendigen Parametern --xattr und --posix-acl gestartet wird. Eine direkte Bearbeitung der XML-Konfiguration der VM über libvirt oder Qemu erwies sich als ineffektiv, da es nicht möglich war, alle erforderlichen Parameter für den virtiofsd-Start korrekt zu übergeben.

Die Lösung war die Verwendung eines Wrappers – eines einfachen Skripts, das virtiofsd mit den gewünschten Flags startet. Dieser Ansatz umging die Einschränkungen von libvirt und garantierte die Aktivierung der vollständigen ACL- und xattr-Unterstützung für das durchgeleitete Verzeichnis. Der Prozess zum Erstellen und Anwenden des Wrappers umfasst die folgenden Schritte:

Google AdInline article slot
  • Erstellen des Wrapper-Skripts:

Erstellen Sie eine Datei /usr/libexec/virtiofsdfix mit folgendem Inhalt:

```bash

#!/bin/bash

Google AdInline article slot

exec /usr/libexec/virtiofsd "$@" --xattr --posix-acl --sandbox none

```

Der Parameter --sandbox none wurde während der Experimente hinzugefügt und soll die Isolation deaktivieren, was in einigen Fällen wichtig sein kann.

  • Berechtigungen setzen:

Erteilen Sie dem Skript Ausführungsrechte und kopieren Sie die Sicherheitskontexte vom ursprünglichen virtiofsd-Daemon:

```bash

sudo chmod +x /usr/libexec/virtiofsdfix

sudo chcon --reference=/usr/libexec/virtiofsd /usr/libexec/virtiofsdfix

```

  • VM-Konfiguration anpassen:

In der XML-Konfiguration der virtuellen Maschine (über virt-manager oder virsh edit) geben Sie den Pfad zum erstellten Wrapper-Skript als Haupt-VirtioFS-Modul an.

Nach diesen Schritten leitet VirtioFS das Dateisystem des Hosts korrekt in die virtuelle Maschine weiter, mit aktiver xattr- und POSIX-ACL-Unterstützung. Dies bildet die grundlegende Basis für die weitere Integration mit ZFS und Samba.

ZFS-Konfiguration für korrekten ACL-Betrieb

Selbst wenn VirtioFS korrekt für die Weiterleitung von erweiterten Attributen und POSIX-ACLs konfiguriert ist, erfordert das ZFS-Dateisystem eine spezifische Konfiguration für die vollständige Unterstützung dieser Funktionen. Damit ein ZFS-Dataset ACLs, ähnlich denen in Windows (NTFS-ACLs), korrekt verarbeiten kann, müssen mehrere wichtige Eigenschaften gesetzt werden:

  • zfs set acltype=posixacl pool/smbfs:

Diese Eigenschaft aktiviert die Unterstützung für standardmäßige Linux POSIX-ACLs für das angegebene Dataset. Sie ermöglicht die korrekte Funktion von Befehlen wie getfacl und setfacl, was eine Voraussetzung für Samba ist.

  • zfs set aclinherit=passthrough pool/smbfs:

Diese Eigenschaft definiert das Vererbungsverhalten von ACLs. Der Wert passthrough stellt sicher, dass neue Dateien oder Verzeichnisse, die innerhalb des Datasets erstellt werden, automatisch Zugriffsrechte vom übergeordneten Verzeichnis erben. Dies ist entscheidend für die Aufrechterhaltung konsistenter Berechtigungen innerhalb der Dateistruktur, insbesondere im Kontext von Windows-Freigaben.

  • zfs set aclmode=passthrough pool/smbfs:

Diese Eigenschaft setzt den Nicht-Interferenz-Modus von ZFS für ACLs. Im passthrough-Modus versucht ZFS nicht, ACLs zu interpretieren oder zu modifizieren, sondern leitet sie einfach unverändert durch. Dies gewährleistet maximale Kompatibilität mit externen Systemen, wie Samba, die ihre eigenen ACLs verwalten.

Nach der Konfiguration von ZFS und VirtioFS bleibt nur noch der Schritt, das durchgeleitete Verzeichnis innerhalb der Gast-VM zu mounten. Dies kann durch Hinzufügen der entsprechenden Zeile zu /etc/fstab erfolgen:

fs   /fs   virtiofs   rw,noatime,_netdev,nofail

Nach Ausführung von mount -a ist das ZFS-Verzeichnis in der VM unter /fs zugänglich und bereit für die Verwendung durch Samba.

Samba-Probleme mit acl_xattr und security.NTACL

Mit der grundlegenden VirtioFS- und ZFS-Einrichtung ist der nächste Schritt die Samba-Konfiguration. Eine typische Einrichtung für ein lokales Verzeichnis, einschließlich vfs objects = acl_xattr, funktioniert einwandfrei und ermöglicht Samba das Schreiben erweiterter Attribute, einschließlich derer, die für Windows-ACLs verwendet werden. Beim Versuch, diese Konfiguration jedoch auf ein über VirtioFS durchgeleitetes Verzeichnis anzuwenden, tritt ein Problem auf: Samba weigert sich, XATTR-Attribute, insbesondere security.NTACL, zu schreiben.

Das Problem äußert sich darin, dass Standard-setfacl-Befehle für POSIX-ACLs sowohl auf lokalen Festplatten als auch auf VirtioFS korrekt funktionieren, das Schreiben von Samba-spezifischen Attributen wie security.NTACL jedoch fehlschlägt. Dies verhindert die volle Funktionalität mit Windows-Berechtigungen, da Samba die notwendigen Sicherheitsdeskriptor-Informationen nicht speichern kann. Selbst das Deaktivieren von SELinux auf dem Host führte nicht zum gewünschten Ergebnis.

Tests, die mit setfattr durchgeführt wurden, um das Schreiben von Samba-Attributen zu simulieren, offenbarten ein Schlüsselproblem. Beim Versuch, das Attribut security.NTACL als Domänenbenutzer zu schreiben, schlug der Vorgang sowohl für eine lokale Datei als auch für eine Datei auf VirtioFS fehl. Bei der Durchführung desselben Vorgangs als Superuser (root) gelang das Schreiben von security.NTACL auf einer lokalen Festplatte, während es auf VirtioFS weiterhin fehlschlug.

Dies deutet auf einen grundlegenden Unterschied in der Handhabung erweiterter Attribute hin:

  • security.NTACL: Dieses Attribut befindet sich im security-Namespace und wird von Samba verwendet, um Windows-Berechtigungen (NTFS-ACLs) zu speichern. Das Schreiben in diesen Namespace ist streng eingeschränkt und erfordert CAP_SYS_ADMIN-Privilegien, was Root-Rechten entspricht. Normale Benutzer, selbst Dateibesitzer, können dieses Attribut nicht direkt ändern oder löschen.
  • user.NTACL: Dieses Attribut befindet sich im user-Namespace. Jeder Benutzer mit Schreibberechtigungen für die Datei kann Attribute in diesem Namespace ändern.

Der Hauptgrund für das Scheitern mit VirtioFS ist, dass selbst mit dem Parameter --sandbox none und einem Versuch, als root (via sudo) zu schreiben, VirtioFS auf Kernel-Ebene oder durch seine eigene Implementierung anscheinend das Schreiben in den security.NTACL-Namespace blockiert. Dies verhindert das korrekte Speichern der Windows-Berechtigungen von Samba.

Lösung: Umleitung von security.NTACL auf user.NTACL und ZFS-Snapshot-Integration

Da Samba Attribute nicht korrekt in den security.NTACL-Namespace über VirtioFS schreiben kann, besteht die einzig praktikable Lösung darin, diese Attribute in den user.NTACL-Benutzer-Namespace umzuleiten. Obwohl dies eher ein Workaround als eine vollständige Lösung des grundlegenden VirtioFS-Problems ist, ermöglicht es Samba, alle notwendigen Windows-Berechtigungsinformationen zu speichern. Es ist wichtig zu beachten, dass dieser Ansatz akzeptabel ist, wenn Benutzer ausschließlich über SMB mit dem Server interagieren und keinen direkten Zugriff auf das Dateisystem des Hosts oder der Gast-VM haben.

Um diese Lösung zu implementieren, müssen die folgenden Parameter in die Samba-Konfigurationsdatei (smb.conf) eingefügt werden:

[VirtioFS]
    path = /fs
    writable = yes
    admin users = "domain\admin-domain" "superadmin"

    vfs objects = acl_xattr shadow_copy2

    # user.NTACL
    acl_xattr:security_acl_name = user.NTACL
    acl_xattr:ignore system acls = yes


    shadow:basedir = /fs
    shadow:snapdir = .zfs/snapshot
    shadow:format = GMT-%Y.%m.%d_%H.%M.%S
    shadow:sort = desc
    shadow:localtime = yes

Hier sind die entscheidenden Zeilen:

  • acl_xattr:security_acl_name = user.NTACL: Weist Samba an, user.NTACL anstelle von security.NTACL zum Speichern von Sicherheitsdeskriptoren zu verwenden.
  • acl_xattr:ignore system acls = yes: Dieser Parameter weist Samba an, System-ACLs zu ignorieren und sich auf seine eigenen Mechanismen zur Speicherung von Berechtigungen zu verlassen.

ZFS-Snapshots mit Samba integrieren

Um Windows-Clients die Funktionalität von Schattenkopien (Shadow Copies) zur Wiederherstellung früherer Dateiversionen bereitzustellen, wird das Modul shadow_copy2 verwendet. Es integriert sich mit den Snapshot-Funktionen von ZFS. In der bereitgestellten Konfiguration:

  • vfs objects = acl_xattr shadow_copy2: Aktiviert das shadow_copy2-Modul.
  • shadow:basedir = /fs: Gibt das Basisverzeichnis für Schattenkopien an.
  • shadow:snapdir = .zfs/snapshot: Definiert das Unterverzeichnis, in dem ZFS seine Snapshots speichert. Für den korrekten Betrieb muss der ZFS-Pool die Eigenschaft listsnapshots=on gesetzt haben (z.B. zpool set listsnapshots=on pool_name), was Samba ermöglicht, verfügbare Snapshots zu erkennen und anzuzeigen.
  • shadow:format, shadow:sort, shadow:localtime: Konfigurieren das Anzeigeformat und die Sortierung der Snapshots.

Somit ermöglicht diese Konfiguration die Erstellung eines voll funktionsfähigen Samba-Dateiservers auf ZFS über VirtioFS, der trotz der anfänglichen Schwierigkeiten mit security.NTACL den korrekten Betrieb mit Windows-ACLs und Schattenkopien gewährleistet.

Wichtige Erkenntnisse

  • VirtioFS und ACL/xattr: Für die volle Samba-Funktionalität mit Windows-ACLs über VirtioFS muss der virtiofsd-Daemon mit den Parametern --xattr und --posix-acl gestartet werden, oft unter Verwendung eines Wrapper-Skripts.
  • ZFS-Konfiguration: ZFS-Datasets, die für die Samba-Freigabe verwendet werden, müssen für die korrekte ACL-Behandlung mit den Eigenschaften acltype=posixacl, aclinherit=passthrough und aclmode=passthrough konfiguriert werden.
  • security.NTACL-Problem: Samba versucht standardmäßig, Windows-Sicherheitsdeskriptoren in security.NTACL zu schreiben, was root-Privilegien erfordert und von VirtioFS blockiert werden kann.
  • Lösung über user.NTACL: Ein effektiver Workaround ist die Umleitung von Samba zur Verwendung von user.NTACL für die Speicherung von Sicherheitsattributen über den Parameter acl_xattr:security_acl_name = user.NTACL.
  • ZFS-Snapshots und Samba: Die Integration von ZFS-Snapshots für Windows-Schattenkopien wird durch das shadow_copy2-Modul in Samba erreicht, was eine entsprechende ZFS-Pool-Eigenschaftskonfiguration erfordert.

— Editorial Team

Advertisement 728x90

Weiterlesen