OpenSolaris CIFS Server z funkcjonalnością VSS

Fri 14 August 2009 by admin

Często zdarza nam się rozpaczliwie poszukiwać skasowanego nieopatrznie pliku, który znajdował się na współdzielonym zasobie. Na backup wykonywany co noc ciężko będzie liczyć, gdyż plik ten mocno edytowany był w ciągu dnia. Z pomocą przyjść nam może Volume Shadow Copy (VSS), oczywiście pod warunkiem, że korzystamy z rozwiązań firmy Microsoft. Wspomniany VSS wykonuje w tle o ustalonych godzinach tzw. snapshoty-zrzuty, które pozwalają nam odzyskać dostęp do poprzednich wersji plików. W systemie MS Windows 2003 Server(jako pierwszy system z zaimplementowaną usługą VSS) możemy wykonać maksymalnie 64 snapshoty, więc musimy dość rozsądnie wypośrodkować czas kiedy je wykonujemy i historię plików jaką chcemy przechowywać. Jednak nie będę się rozwodził nad implementację VSS w rozwiązaniach Microsoft'u, spróbuję przedstawić alternatywne rozwiązanie o podobnej funkcjonalności, choć o większych możliwościach. Chodzi o rozwiązanie współdzielonego zasobu wyeksportowanego z systemu OpenSolaris z obsługą snapshotów ZFS...

Firma Sun Microsystems założyła, że obecna implementacja protokółu CIFS/SMB w rozwiązaniu takim jak Samba nie dość dobrze integruję sie z systemem OpenSolaris. Postarali się więc o własną implementację protokołu CIFS/SMB dostarczając użytkownikom funkcjonalność klienta, serwera CIFS/SMB oraz rozwiązanie integrujące się z Active Directory  projekt Winchester. Po tym krótkim wstępie przejdźmy do dzieła.

Protokół CIFS/SMB jest dostępny po zainstalowaniu pakietu:

    # pkg install SUNWsmbs

następnie warto stworzyć grupę w sharemgr, tworząc grupę dodajemy do niej współdzielone zasoby, dzięki czemu łatwo możemy zarządzać wszystkimi zasobami:

    # sharemgr create -P smb smbshares

stworzonej grupie wolno jedynie udostępniać zasoby po protokole CIFS/SMB co zawarte jest na liście grup:

    # sharemgr list -v
    default enabled nfs
    zfs     enabled
    smbshares   enabled smb

następnie dodajemy współdzielony katalog /shared:

    # sharemgr add-share -r nazwazasobu -d "opis" -s /rpool/shared smbshares

dodatkowo możemy stać się członkiem grupy roboczej GRUPAROBOCZA:

    # smbadm join -w GRUPAROBOCZA

aby uzyskać dostęp do zasobu współdzielonego musimy wygenerować hasło dla protokołu CIFS/SMB. Zatem w pliku konfiguracyjnym PAM /etc/pam.conf na końcu należy dołożyć linijkę:

other   password    required    pam_smb_passwd.so.1 nowarn

na sam koniec wygenerować wspomiane hasło CIFS/SMB:

    # passwd witalis

po tej operacji  możemy sprawdzić czy faktycznie widoczny jest nasz zasób:

    # smbutil view //witalis@localhost/
    Password:
    Share        Type       Comment
    -------------------------------
    ipc        IPC        Remote IPC
    nazwazasobu  disk       opis
    2 shares listed from 2 available

Teraz możemy przejść do kwestii wspominanych snapshotów, w przypadku systemu plików ZFS możemy wykonać dowolną ilość takich snapshotów. Co więcej w łatwy sposob możemy je replikować na inne maszyny oraz szybko wykonać klon istniejącego zasobu. Pisanie ręczne skryptów do automatycznego wykonywania snapshotów nie jest zadaniem trudnym, ale możemy go uniknąć. Z pomocą przychodzi nam pakiet SUNWzfs-auto-snapshot, który o określonych porach wykonuje snapshoty oraz utrzymuje ich stała liczbę.
Dostarcza on zestaw nowych usług:

    # svcs -a | grep auto-snap
    disabled       17:26:57 svc:/system/filesystem/zfs/auto-snapshot:hourly
    disabled       17:26:57 svc:/system/filesystem/zfs/auto-snapshot:weekly
    disabled       17:26:57 svc:/system/filesystem/zfs/auto-snapshot:daily
    disabled       17:26:57 svc:/system/filesystem/zfs/auto-snapshot:monthly
    disabled       19:07:54 svc:/system/filesystem/zfs/auto-snapshot:frequent

uruchamiając np. wybraną usługę *weekly system będzie wykonywał snapshot raz na tydzień i przechowywał maksymalnie 4 najświeższe snapshoty
charakterystyka czasowa poszczególnych usług:

frequent     snapshots every 15 mins, keeping 4 snapshots  
hourly         snapshots every hour, keeping 24 snapshots  
daily         snapshots every day, keeping 31 snapshots  
weekly         snapshots every week, keeping 4 snapshots  
monthly         snapshots every month, keeping 12 snapshots

załóżmy, że chcemy przechowywać  6 snapshotów wykonywanych co 20min co daje nam historię 2h aktywności użytkowników. Usługa najbliższa naszym zamierzeniom to *frequent.
Najpierw określamy, które systemy plików będą przetwarzane przez zfs-auto-snapshot'a. W naszym przypadku chodzi o  wspóldzielony zasób. Wyłączamy więc zfs-auto-snapshota na wszystkich systemach plików z wyjątkiem wybranego zasobu sieciowego:

    # zfs set com.sun:auto-snapshot=false rpool
    # zfs set com.sun:auto-snapshot:frequent=true rpool/shared

usługę *frequent warto włączyć w tym momencie tj. po ustaleniu, które katalogi mają mieć generowane snapshoty:

    # svcadm enable system/filesystem/zfs/auto-snapshot:frequent

po tej operacji dodany zostanie automatycznie wpis w crontab'ie  z odpowiednim interwałem czasowym.
Jednak założone wymaganie co do ilości i interwału czasowego snapshotów są różne od std. dla *frequent, aby je zmienić musimy ustawić zmienne w pliku manifest dla zfs-auto-snapshot i przeładować te ustawienia:

    # svccfg -s svc:/system/filesystem/zfs/auto-snapshot:frequent setprop

zfs/period = 20 # svccfg -s svc:/system/filesystem/zfs/auto-snapshot:frequent setprop
zfs/keep = 6 # svccfg -s svc:/system/filesystem/zfs/auto-snapshot:frequent refresh # svcadm restart svc:/system/filesystem/zfs/auto-snapshot:frequent

aby podejrzeć zmienione wartości  (opis parametrów w pliku  /var/svc/manifest/system/filesystem/auto-snapshot.xml):

#  svccfg -s auto-snapshot:frequent listprop
zfs                                application
zfs/avoidscrub                     boolean  false
zfs/backup                         astring  none
zfs/backup-lock                    astring  unlocked
zfs/backup-save-cmd                astring  "not set"
zfs/fs-name                        astring  //
zfs/interval                       astring  minutes
zfs/keep                           astring  6
zfs/label                          astring  frequent
zfs/offset                         astring  0
zfs/snapshot-children              boolean  true
zfs/verbose                        boolean  false
zfs/period                         astring  20
...

tworzone są teraz automatycznie snapshoty:

    # zfs list -t snapshot
    rpool/shared@zfs-auto-snap:frequent-2009-08-14-18:00      0      -  5.02M  -
    rpool/shared@zfs-auto-snap:frequent-2009-08-14-18:20      0      -  5.02M  -
    ...

jednak przeglądając zasób współdzielony w szczególności pod kątem snapshotów to są one dla nas niewidoczne dopóki, dopóty nie ustawimy parametru snapdir:

    # zfs set snapdir=visible rpool/shared

od tego momentu będą już one widoczne w katalogu .zfs/snapshot. Niestety niektóre implementacje CIFS/SMB nie radzą sobie z dwukropkami w nazwie katalogu aby go zmienić np. na "_" należy wyedytować plik /lib/svc/method/zfs-auto-snapshot i ustawić w nim zmienną SEP="_". Dodatkowo korzystając z opcji zfs-auto-snapshot możemy ustawić polecenia służące do automatycznej replikacji określonego zasobu przy pomocy poleceń zfs send.

Podsumowując okazuje się, że przy niewielkim nakładzie pracy otrzymujemy podobną funkcjonalność co wspomniany na początku VSS, dodatkowo bez limitu snapshotów, a z możliwościami replikacji oraz klonowania zasobu.


Comments