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ą.
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:
- Tworzenie skryptu opakowania:
Tworzymy plik /usr/libexec/virtiofsdfix z następującą zawartością:
```bash
#!/bin/bash
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 nazwsecurityi 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 prawamiroot. 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 nazwuser. 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życieuser.NTACLzamiastsecurity.NTACLdo 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
virtiofsdmusi być uruchomiony z parametrami--xattri--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=passthroughiaclmode=passthroughdla prawidłowej obsługi ACL. - Problem
security.NTACL: Samba domyślnie próbuje zapisywać deskryptory bezpieczeństwa Windows wsecurity.NTACL, co wymaga uprawnieńrooti może być blokowane przez VirtioFS. - Rozwiązanie przez
user.NTACL: Skutecznym obejściem jest przekierowanie Samby do używaniauser.NTACLdo przechowywania atrybutów bezpieczeństwa za pośrednictwem parametruacl_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_copy2w Sambie, wymagającego odpowiedniej konfiguracji właściwości puli ZFS.
— Editorial Team
Brak komentarzy.