Powrót do strony głównej

Samba, ZFS, VirtioFS: Konfiguracja serwera plików z ACL i XATTR

Szczegółowy przewodnik po integracji Samba z ZFS poprzez VirtioFS na KVM, rozwiązywaniu problemów z ACL i xattr dla praw dostępu kompatybilnych z Windows i kopii w tle.

Samba, ZFS i VirtioFS: Dogłębna analiza problemów ACL i xattr w NAS
Advertisement 728x90

Integracja Samby i ZFS przez VirtioFS: Rozwiązanie problemów z ACL i XATTR w środowiskach wirtualnych

Rozwój wysokowydajnego serwera plików SMB z pamięcią masową opartą na ZFS w wirtualizowanym środowisku KVM za pośrednictwem VirtioFS wiąże się z unikalnymi wyzwaniami, zwłaszcza w zakresie prawidłowej obsługi list kontroli dostępu (ACL) i rozszerzonych atrybutów (xattr), aby zapewnić kompatybilność z klientami Windows. Niniejszy artykuł szczegółowo opisuje proces konfiguracji i pokonywania kluczowych przeszkód, zapewniając pełną funkcjonalność i stabilną pracę udostępnionego zasobu plików.

Wybór VirtioFS do wirtualizacji pamięci masowej

Podczas tworzenia sieciowej pamięci masowej (NAS) opartej na ZFS, z późniejszą organizacją folderów współdzielonych za pośrednictwem Samby, pojawia się potrzeba efektywnego sposobu podłączenia puli ZFS do maszyny wirtualnej (VM). Początkowo rozważano różne podejścia, w tym NFS, jednak szczególną uwagę zwróciło bezpośrednie przekazywanie katalogu do VM, oferowane przez hiperwizor KVM. Spośród dostępnych opcji, takich jak virtio-9p i VirtioFS, wybór padł na VirtioFS.

virtio-9p został wykluczony z rozważań ze względu na jego niestabilność, ograniczone wsparcie POSIX i niską wydajność, co czyniło go nieodpowiednim do krytycznych zadań serwera plików. VirtioFS, przeciwnie, wykazywał znacznie większy potencjał dzięki swojej architekturze, pozwalającej maszynom wirtualnym na bezpośredni dostęp do systemu plików hosta z wysoką wydajnością.

Google AdInline article slot

Jednak pomimo oczywistych zalet, VirtioFS miał swoje niuanse. Standardowe ustawienia virt-manager nie oferowały opcji włączenia wsparcia dla rozszerzonych atrybutów (xattr) i list kontroli dostępu (ACL), które są kluczowe dla prawidłowego działania Samby z klientami Windows. Rozszerzone atrybuty pozwalają przechowywać dodatkowe informacje o plikach, a ACL definiują szczegółowe prawa dostępu użytkowników i grup, co jest podstawą uprawnień NTFS w Windows. Bez tych funkcji pełna integracja Samby i ZFS byłaby niemożliwa.

Konfiguracja VirtioFS dla wsparcia ACL i XATTR

Głównym zadaniem było uruchomienie demona virtiofsd, działającego na hoście, z niezbędnymi parametrami --xattr i --posix-acl. Bezpośrednia edycja konfiguracji XML maszyny wirtualnej za pośrednictwem libvirt lub Qemu okazała się nieskuteczna, ponieważ nie udało się prawidłowo przekazać wszystkich wymaganych parametrów do uruchomienia virtiofsd.

Rozwiązaniem było użycie opakowania – prostego skryptu, który uruchamia virtiofsd z odpowiednimi flagami. To podejście pozwoliło ominąć ograniczenia libvirt i zagwarantować aktywację pełnego wsparcia ACL i xattr dla przekazywanego katalogu. Proces tworzenia i stosowania opakowania obejmuje następujące kroki:

Google AdInline article slot
  • Tworzenie skryptu opakowania:

Tworzymy plik /usr/libexec/virtiofsdfix z następującą zawartością:

```bash

#!/bin/bash

Google AdInline article slot

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

```

Parametr --sandbox none został dodany w trakcie eksperymentów i ma na celu wyłączenie izolacji, co w niektórych przypadkach może być ważne.

  • Ustawienie praw dostępu:

Skryptowi nadajemy prawa do wykonania, a także kopiujemy konteksty bezpieczeństwa z oryginalnego demona virtiofsd:

```bash

sudo chmod +x /usr/libexec/virtiofsdfix

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

```

  • Zmiana konfiguracji VM:

W konfiguracji XML maszyny wirtualnej (za pośrednictwem virt-manager lub virsh edit) należy wskazać ścieżkę do utworzonego skryptu opakowania jako głównego modułu VirtioFS.

Po tych krokach VirtioFS będzie prawidłowo przekazywać system plików hosta do maszyny wirtualnej z aktywnym wsparciem xattr i POSIX ACL. Tworzy to podstawowy fundament dla dalszej integracji z ZFS i Sambą.

Konfiguracja ZFS dla prawidłowej pracy z ACL

Nawet przy prawidłowej konfiguracji VirtioFS do przekazywania rozszerzonych atrybutów i POSIX ACL, system plików ZFS wymaga specyficznej konfiguracji dla pełnego wsparcia tych funkcji. Aby zestaw danych ZFS mógł prawidłowo przetwarzać ACL, podobne do tych używanych w Windows (NTFS ACL), należy ustawić kilka kluczowych właściwości:

  • zfs set acltype=posixacl pool/smbfs:

Ta właściwość włącza wsparcie dla standardowych Linux POSIX ACL dla wskazanego zestawu danych. Pozwala to takim poleceniom, jak getfacl i setfacl, działać prawidłowo, co jest niezbędnym warunkiem dla Samby.

  • zfs set aclinherit=passthrough pool/smbfs:

Ta właściwość określa zachowanie dziedziczenia ACL. Wartość passthrough gwarantuje, że podczas tworzenia nowych plików lub katalogów w zestawie danych, automatycznie odziedziczą one prawa dostępu od katalogu nadrzędnego. Jest to krytyczne dla utrzymania spójności uprawnień w strukturze plików, zwłaszcza w kontekście udostępnień Windows.

  • zfs set aclmode=passthrough pool/smbfs:

Ta właściwość ustawia tryb nieingerencji ZFS w ACL. W trybie passthrough ZFS nie próbuje interpretować ani zmieniać ACL, lecz po prostu przekazuje je w niezmienionej formie. Zapewnia to maksymalną kompatybilność z zewnętrznymi systemami, takimi jak Samba, które zarządzają własnymi ACL.

Po skonfigurowaniu ZFS i VirtioFS, pozostaje jedynie zamontować przekazany katalog wewnątrz gościnnej VM. Można to zrobić, dodając odpowiednią linię do /etc/fstab:

fs   /fs   virtiofs   rw,noatime,_netdev,nofail

Po wykonaniu mount -a katalog ZFS będzie dostępny w VM pod ścieżką /fs, gotowy do użycia przez Sambę.

Problemy Samby z acl_xattr i security.NTACL

Przy podstawowej konfiguracji VirtioFS i ZFS, następnym krokiem jest konfiguracja Samby. Typowe ustawienie dla lokalnego katalogu, obejmujące vfs objects = acl_xattr, działa doskonale, pozwalając Sambie zapisywać rozszerzone atrybuty, w tym te używane dla Windows ACL. Jednak przy próbie zastosowania tej konfiguracji do katalogu przekazanego przez VirtioFS, pojawia się problem: Samba odmawia zapisu atrybutów XATTR, w szczególności security.NTACL.

Problem objawia się tym, że standardowe polecenia setfacl dla POSIX ACL działają prawidłowo zarówno na lokalnym dysku, jak i na VirtioFS, ale zapis specyficznych atrybutów Samby, takich jak security.NTACL, kończy się niepowodzeniem. Prowadzi to do niemożności pełnej pracy z uprawnieniami Windows, ponieważ Samba nie może zapisać niezbędnych informacji o deskryptorach bezpieczeństwa. Nawet wyłączenie SELinux na hoście nie przyniosło pożądanego rezultatu.

Przeprowadzone testy z setfattr w celu symulacji zapisu atrybutów Samby ujawniły kluczowy problem. Przy próbie zapisu atrybutu security.NTACL w imieniu użytkownika domenowego, operacja kończyła się błędem zarówno dla pliku lokalnego, jak i dla pliku na VirtioFS. Jednakże, przy wykonaniu tej samej operacji w imieniu użytkownika root (root), zapis security.NTACL na dysku lokalnym przebiegał pomyślnie, podczas gdy na VirtioFS nadal kończył się niepowodzeniem.

Wskazuje to na fundamentalną różnicę w mechanizmach pracy z rozszerzonymi atrybutami:

  • security.NTACL: Ten atrybut znajduje się w przestrzeni nazw security i jest używany przez Sambę do przechowywania uprawnień Windows (NTFS ACL). Zapis do tej przestrzeni nazw jest ściśle ograniczony i wymaga uprawnień CAP_SYS_ADMIN, co jest równoważne z prawami root. Zwykli użytkownicy, nawet właściciele plików, nie mogą bezpośrednio zmieniać ani usuwać tego atrybutu.
  • user.NTACL: Ten atrybut znajduje się w użytkowej przestrzeni nazw user. Każdy użytkownik, który ma prawa do zapisu w pliku, może zmieniać atrybuty w tej przestrzeni.

Główną przyczyną niepowodzenia z VirtioFS jest to, że nawet z parametrem --sandbox none i próbą zapisu przez root (za pośrednictwem sudo), VirtioFS na poziomie jądra lub własnej implementacji, najwyraźniej blokuje zapis do przestrzeni security.NTACL. Zapobiega to prawidłowemu zapisywaniu uprawnień Windows przez Sambę.

Rozwiązanie: Przekierowanie security.NTACL do user.NTACL i integracja migawek ZFS

Ponieważ Samba nie może prawidłowo zapisywać atrybutów w przestrzeni security.NTACL przez VirtioFS, jedynym działającym rozwiązaniem staje się przekierowanie tych atrybutów do użytkowej przestrzeni user.NTACL. Chociaż jest to obejście, a nie pełne rozwiązanie pierwotnego problemu z VirtioFS, pozwala Sambie przechowywać wszystkie niezbędne informacje o uprawnieniach Windows. Ważne jest, aby pamiętać, że to podejście jest akceptowalne w warunkach, gdy użytkownicy komunikują się z serwerem wyłącznie poprzez SMB i nie mają bezpośredniego dostępu do systemu plików hosta lub gościnnej VM.

Aby zrealizować to rozwiązanie, do pliku konfiguracyjnego Samby (smb.conf) należy dodać następujące parametry:

[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

Kluczowe są tutaj linie:

  • acl_xattr:security_acl_name = user.NTACL: Nakazuje Sambie użycie user.NTACL zamiast security.NTACL do przechowywania deskryptorów bezpieczeństwa.
  • acl_xattr:ignore system acls = yes: Ten parametr instruuje Sambę, aby ignorowała systemowe ACL, polegając na własnych mechanizmach przechowywania uprawnień.

Integracja migawek ZFS z Sambą

Aby zapewnić funkcjonalność kopii w tle (Shadow Copies) dla klientów Windows, co pozwala użytkownikom przywracać poprzednie wersje plików, używany jest moduł shadow_copy2. Integruje się on z możliwościami ZFS w zakresie tworzenia migawek (snapshots). W przedstawionej konfiguracji:

  • vfs objects = acl_xattr shadow_copy2: Aktywuje moduł shadow_copy2.
  • shadow:basedir = /fs: Wskazuje bazowy katalog dla kopii w tle.
  • shadow:snapdir = .zfs/snapshot: Określa podkatalog, w którym ZFS przechowuje swoje migawki. Dla prawidłowego działania konieczne jest, aby pula ZFS miała właściwość listsnapshots=on (np. zpool set listsnapshots=on pool_name), co pozwala Sambie wykrywać i wyświetlać dostępne migawki.
  • shadow:format, shadow:sort, shadow:localtime: Konfigurują format wyświetlania migawek i ich sortowanie.

W ten sposób, niniejsza konfiguracja pozwala stworzyć w pełni funkcjonalny serwer plików Samba na ZFS przez VirtioFS, zapewniając prawidłową pracę z Windows ACL i kopiami w tle, pomimo początkowych trudności z security.NTACL.

Kluczowe wnioski

  • VirtioFS i ACL/xattr: Dla pełnej pracy Samby z Windows ACL przez VirtioFS, demon virtiofsd musi być uruchomiony z parametrami --xattr i --posix-acl, co często wymaga użycia skryptu opakowania.
  • Konfiguracja ZFS: Zestawy danych ZFS, używane dla udostępnień Samby, muszą być skonfigurowane z właściwościami acltype=posixacl, aclinherit=passthrough i aclmode=passthrough dla prawidłowej obsługi ACL.
  • Problem security.NTACL: Samba domyślnie próbuje zapisywać deskryptory bezpieczeństwa Windows w security.NTACL, co wymaga uprawnień root i może być blokowane przez VirtioFS.
  • Rozwiązanie przez user.NTACL: Skutecznym obejściem jest przekierowanie Samby do używania user.NTACL do przechowywania atrybutów bezpieczeństwa za pośrednictwem parametru acl_xattr:security_acl_name = user.NTACL.
  • Migawki ZFS i Samba: Integracja migawek ZFS dla kopii w tle Windows odbywa się za pośrednictwem modułu shadow_copy2 w Sambie, wymagającego odpowiedniej konfiguracji właściwości puli ZFS.

— Editorial Team

Advertisement 728x90

Czytaj dalej