Z pojęciem wersjonowania plików i ich implementacji w systemach takich jak chociażby svn,cvs,git pewnie wielu z was miało okazję się zetknać. Wszystkie ww. systemy operują w przestrzeni użytkownika. Co by powiedzieć na rozwiązanie działające na poziomie samego kernela, które implementuje funkcję wersjonowania odpowiedzią na nasze wymagania może być system plików NILFS...

System NILFS w wersji 2 (www.nilfs.org) włączony oficjalnie do kernela począwszy od wersji 2.6.30 charakteryzuje się odmiennym podejściem do składowania danych. Dane zmodyfikowane nie są nadpisywane tylko dopisywane, wówczas powstaje coś w rodzaju dziennika, w którym każda zmiana jest odzwierciedlona. Co więcej mamy dostęp do kolejnych wersji (checkpoints) modyfikowanego pliku czyli wykonywane na bieżąco automatyczne migawki. Warto nadmienić, iż jest to jeden z pierwszych systemów plików pod Linux'em, który oferuje snapshoty (nie mylić snapshotów LVM). Automatycznie wykonywane migawki mają status checkpoint'ów tj. wówczas gdy zacznie brakować miejsca garbage collector będzie je usuwał począwszy od najstarszego, aby zachować danego checkpoint'a musimy przekształcić go w snapshot'a. Specyficzny sposób przechowywania danych wpływa pozytywnie na szybkość zapisu, zapisy wykonywane są w sposób sekwencyjny. Również odzyskiwanie danych jest przyśpieszone, z uwagi na dostęp do licznych checkpoint'ów z kopiami plików. Dodatkowo przechowywane dane i metadane są chronione 32bit sumami kontrolnymi. Jednak prezentowany system plików ma status rozwojowy o czym informuje nas komunikat:

mount.nilfs2: WARNING! - The NILFS on-disk format may change at any time.
mount.nilfs2: WARNING! - Do not place critical data on a NILFS filesystem.

dodatkowo nie wspiera on funkcji, do których obecne systemy plików nas już przyzwyczaiły m.in. quota, atime, dynamiczna zmiana wielkości, labele. Mimo to warto się przyjrzeć się temu systemowi plików z uwagi na wspomniane checkpointy oraz łatwość zarządzania.
Do testów użyłem pliku (loop) zamiast fizycznej partycji i tak w celu stworzenia nowego systemu pliku:

# mkfs.nilfs2 /dev/loop0

następnie stworzony systemu plików podmontujmy:

# mount.nilfs2 /dev/loop0 /nilfs

sprawdźmy jak zachowa się system po dodaniu kilku plików:

# touch plik.1 plik.2
# lscp
CNO        DATE     TIME  MODE  FLG   NBLKINC       ICNT
1  2009-11-01 16:31:13   cp    -         11          3
2  2009-11-01 16:34:25   cp    -         11          5

polecenie lscp wylistowało checkpointy, pole MODE informuje, że mamy do czynienia z checkpointem, w celu przekształcenia go w snapshot'a:

# chcp ss 2

po przekształceniu plus ewentualnym zmodyfikowaniu ww. plików sprawdźmy czy snapshot 2 zachował nam starsze wersje:

# mount.nilfs2 -r -o cp=2 /dev/loop0 /nilfs_snap

wybrany snapshot zamontowany został w trybie ro i rzeczywiście zawiera starsze wersje plików. Polecenia mkcp, rmcp służą do ręcznego zarządzania checkpointami odpowiednio utworzenie, skasowanie. Konfiguracja garbage collectora, który uruchamiany jest wraz z montowanym systemem pliku, jego pid możemy poznać:

# mount -t nilfs2
/dev/loop0 on /nilfs type nilfs2 (rw,gcpid=3189)

zawarta jest std. w /etc/nilfs_cleanerd.conf, gdzie możemy ustawić m.in. interwał czasowy pomiędzy usuwanymi checkpoint'ami.
NILFS2 prezentuje się bardzo obiecująco, sami autorzy na stronie projektu wytyczyli sobie ambitne cele, jeśli dotrzymają swoich planów będziemy mieli bardzo nowoczesny system plików.