Wstęp
Moje spojrzenie na system plików i dane w nim zawarte może być przez wielu postrzegane, jako nietypowe. Nie zależy mi na wydajności tj. prędkości zapisu i odczytu danych z dysku. Lubię natomiast, gdy moje dane są chronione przed wzrokiem niepowołanych osób (transparentne szyfrowanie), a przy okazji są w miarę odporne na uszkodzenia. Oczywiście, trudno mówić o tym, aby 111 GiB przenośny dysk 2.5″ był najlepszym rozwiązaniem, szczególnie jeżeli mowa o bezpieczeństwie. Pomińmy jednak tę kwestię i skupmy się na czymś innym.
Ostatnio opisywałem ZFS-a, który nie tylko dba o bezpieczeństwo danych (sumy kontrolne, transakcje itp.), ale również zapewnia coś, co przydaje się podczas składowania dużej ilości danych. Mowa o transparentnej kompresji danych.
Pojawiło się zatem w mojej głowie proste pytanie - jak najmniejszym kosztem uzyskać zarówno transparentne szyfrowanie, jak i kompresję danych na wspomnianym dysku? Czy da się to zrobić nieinwazyjnie, czy też czekają mnie większe zmiany w systemie operacyjnym i samym systemie plików?
Rozwiązanie
Rozwiązanie nie jest takie proste, jakby się to mogło wydawać. Czy istnieje uniwersalne rozwiązanie pasujące do każdego systemu plików? Odpowiedzią mógłby być compFUSEd oparty o FUSE. Należy mieć jednak na uwadze to, iż obecnie nie grzeszy on stabilnością i może się przyczynić do utraty danych. A może coś mniej uniwersalnego? Istnieją projekty e2compr (stabilne) oraz e3compr (niestabilne) dodające obsługę transparentnej kompresji do Ext2 oraz Ext3. To już coś. Natomiast o FuseCompress nie warto nawet wspominać.
Jak widać, o ile transparentne szyfrowanie danych przechowywanych w różnego rodzaju systemach plików nie stanowi większego problemu, tak kompresja w locie jest już kłopotliwa. Najbezpieczniej byłoby zatem wykorzystać system plików, który wspiera ten tryb pracy. Oto lista systemów plików lepiej, lub gorzej wspieranych przez Linuksa, które to umożliwiają:
- ZFS,
- Fossil,
- Reiser4,
- NTFS,
- Btrfs.
Spory wybór? Nie do końca. Btrfs jest dostępny obecnie jedynie w wersji rozwojowej i nieco czasu upłynie nim ukaże się jego wersja stabilna. NTFS jest obsługiwany w Linuksie poprzez NTFS-3g (FUSE), który nie obsługuje zapisu na skompresowanych/szyfrowanych partycjach NTFS. ZFS również jest obsługiwany przez Linuksa poprzez FUSE, a ZFS-on-FUSE od jakiegoś czasu nie jest już rozwijane. Reiser4 nigdy nie wszedł do jądra Linuksa i wymaga nałożenia łat na jądro. A Fossil? Egzotyczny system plików stosowany w systemie Plan 9 from Bell Labs, a dostępny pod Linuksem dzięki wykorzystaniu plan9port.
Wybór? Trudny. Do tej pory korzystałem z ZFS-on-FUSE, gdzie kompresja nie jest problemem, ale praca na dysku przenośnym może nie należeć do przyjemnych. Pozostaje Reiser4, Btrfs oraz Ext2 z e2compr. Zarówno Reiser4, jak i e2compr wymagają nałożenia łat na jądro. Btrfs jest już natomiast wspierane (eksperymentalnie) przez jądro 2.6.29. Wykorzystamy zatem Btrfs. Warto jednak pamiętać, że zarówno Btrfs, jak i ZFS-on-FUSE to obecnie rozwiązania eksperymentalne i nijak się mają do bezpieczeństwa, o którym pisałem na początku.
Czym jest Btrfs?
Btrfs to innowacyjny system plików przeznaczony dla Linuksa. Rozwijany przez Oracle, a dystrybuowany na licencji GPL, stanowi odpowiedź na system ZFS wydany na licencji CDDL przez Sun Microsystems. Oto główne cechy Btrfs:
- obsługa plików o rozmiarach do 16EB,
- transakcyjne operacje,
- rozszerzenie idei LVM podobne do ZFS-owych pul,
- łatwe tworzenie przyrostowych kopii bezpieczeństwa,
- przechowywanie sum kontrolnych (obecnie CRC-32C) zarówno dla danych, jak i metadanych celem wykrywania błędów,
- wsparcie dla transparentnej kompresji danych,
- wykorzystanie techniki kopiowania przy zapisie,
- tryb przeznaczony do minimalizacji zużycia dysków SSD,
- i wiele innych.
Należy mieć na uwadze, iż obecnie system ten trafił już do jądra systemu Linux (od wersji 2.6.29-rc), ale znajduje się jeszcze w fazie eksperymentalnej. Minie jeszcze sporo czasu, nim światło dzienne ujrzy jego stabilna wersja. Do tego czasu należy zachować szczególną ostrożność i nie wykorzystywać Btrfs do przechowywania danych, które stanowią dla nas jakąkolwiek wartość.
Instalacja obsługi Btrfs pod Ubuntu 9.04
Na początku należy pobrać źródła jądra Linuksa w wersji 2.6.30 dla 32-bitowego procesora (dla 64-bitowego systemu należy samodzielnie zmodyfikować instrukcję) oraz paczki niezbędne do skompilowania źródeł i narzędzi do zarządzania systemem Btrfs.
sudo aptitude install build-essential kernel-package \
checkinstall uuid-dev zlib1g-dev e2fslibs-dev libacl1-dev bzip2 libncurses5-dev
mkdir ~/linux-2.6.30_i386
cd ~/linux-2.6.30_i386
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v2.6.30/\
linux-source-2.6.30_2.6.30-020630_all.deb
sudo dpkg -i *
Teraz możemy przejść do konfiguracji, kompilacji i instalacji paczek z nowym jądrem.
cd /usr/src/
sudo tar -xvjf linux-source-2.6.30.tar.bz2
cd linux-source-2.6.30
# Kopia aktualnie używanej konfiguracji do nowego jądra.
sudo make oldconfig
# Tutaj następuje konfiguracja - należy w niej odznaczyć gwiazdką opcję:
# File systems -> Btrfs filesystem (EXPERIMENTAL) Unstable disk format
sudo make menuconfig
# Kompilowanie, tworzenie paczek i ich instalacja w systemie.
# Należy uzbroić się w cierpliwość.
sudo make-kpkg linux-image linux-headers --initrd
cd ..
sudo dpkg -i linux-headers-2.6.30_2.6.30-10.00.Custom_i386.deb
sudo dpkg -i linux-image-2.6.30_2.6.30-10.00.Custom_i386.deb
Po udanej instalacji nowego jądra przystępujemy do kompilacji i instalacji narzędzi do zarządzania Btrfs-em. Oczywiście, wykorzystane do tej pory źródła można bezpiecznie usunąć z dysku.
cd ~
wget http://www.kernel.org/pub/linux/kernel/people/mason/btrfs/\
btrfs-progs-0.18.tar.gz
tar -xvvzf btrfs-progs-0.18.tar.gz
cd btrfs-progs-0.18/
make
make convert
sudo checkinstall
Jeżeli wszystko poszło po naszej myśli - ponowne uruchomienie systemu odbędzie się już z naszym nowym jądrem i obsługą Btrfs.
Jeszcze jedna ważna uwaga. Btrfs-progs od wersji 0.19 obsługują nowy format Btrfs i w takim też formacie tworzą system plików na danej partycji. Do ich czytania potrzebne jest zmodyfikowane jądro Linuksa obsługujące ten format, które jest obecne dostępne jedynie w repozytorium Gita projektu Btrfs. Próba zamontowania nowego systemu plików z wykorzystaniem jądra bez obsługi tego formatu kończy się poniższym komunikatem w dmesg:
BTRFS: couldn't mount because of unsupported optional features (1).
Próba zamontowania systemu plików w starszej wersji w systemie, który obsługuje nowszą wersję kończy się... automatyczną konwersją systemu plików do nowszego formatu. Linus Torvalds miał z tym już spore problemy nie dalej, jak tydzień temu. Trzeba jednak przyznać, iż zastosowanie nowego formatu oraz narzędzi w wersji 0.19 i wyższej owocuje znacznym (niekiedy 3-krotnym) przyrostem prędkości.
Wykorzystanie
Nim stworzymy na naszym dysku system plików Btrfs warto się najpierw zastanowić, czy oczekujemy tego, aby był on zaszyfrowany. Jeżeli tak to najpierw należy zapoznać się z instrukcją tworzenia zaszyfrowanych partycji (DM-Crypt + LUKS) stworzoną przeze mnie. Dopiero na tak utworzonej i zamontowanej partycji możemy utworzyć docelowy system plików. A wymaga to tylko i wyłącznie jednej komendy:
sudo mkfs.btrfs /dev/urządzenie_blokowe
Proste, prawda? Aby się przekonać, czy wszystko poszło zgodnie z planem możemy wykorzystać poniższe polecenie, które powinno wyświetlić informacje o dostępnych partycjach z Btrfs-em.
sudo btrfs-show
A jak włączyć kompresję danych w tak utworzonym systemie plików? Wszystko zależy od tego, jak zamontowana zostanie taka partycja. Przykładowo:
sudo mount -t btrfs -o compress -o ssd /dev/partycja_btrfs /media/dysk
W ten sposób nie tylko włączymy kompresję (obecnie zlib) na zamontowanej partycji, ale również uaktywnimy tryb pracy dostosowany do pracy z dyskami SSD (uwzględniający ich zużycie).
Zakończenie
Mam nadzieję, iż przedstawione powyżej rozwiązanie okaże się pomocne i zachęci do zapoznania się nie tylko z Btrfs-sem, ale również z ZFS-em, czy innymi systemami plików, które są obecnie bardziej innowacyjne, niż popularny Ext2, Ext3, czy też nawet Ext4.
Na samo zakończenie chciałbym jeszcze raz zaznaczyć, iż zarówno projekt ZFS-on-FUSE, jak i Btrfs znajdują się obecnie w fazie rozwoju, a korzystanie z nich może stanowić realne zagrożenie dla przechowywanych z ich wykorzystaniem danych.