Persistence, czyli zachowanie zmian w systemie live

Spis treści

Systemy live mają jedną ale za to dość dającą się odczuć wadę, mianowicie chodzi o to, że po wypaleniu takiego obrazu, nie mamy możliwości zachowania zmian. Nawet jeśli doinstalujemy nowy pakiet czy wyedytujemy jakiś plik, to zmiany wprowadzone przez nas są jedynie tymczasowe, bo dokonywane w pamięci operacyjnej RAM. W efekcie jeśli uruchomimy taki system ponownie, będziemy zmuszeni przeprowadzać raz jeszcze wszystkie poprzednie czynności pod kątem jego dostosowania. W przypadku cd/dvd nie mamy praktycznie żadnego pola manewru. Inaczej jednak ma się sprawa jeśli chodzi o pendrive, bo tutaj możemy utworzyć osobną partycję, gdzie będą przechowywane wszystkie zmiany jakich dokonamy.

Nakładka na system live

Mowa oczywiście o mechanizmie zwanym persistence i jak wspomniałem na wstępie, polega on na utworzeniu osobnej partycji, która po starcie systemu zostanie zamontowana jako nakładka na system plików obrazu live, tzw. overlay. Mamy tu do czynienia z rozwiązaniem znanym choćby z routerów i ich alternatywnego oprogramowania OpenWRT, z tym, że tam jest ono stosowane z powodu zbyt małego flash'a routera, który jest rzędu paru MiB i miłośnicy oprogramowania nie są w stanie się zmieścić na tak małej przestrzeni, wobec czego zaciągają do pracy pendrive i tam lokują m.in. nowo instalowane pakiety.

Jeśli korzystamy z alternatywnego przygotowania nośnika pod system live, możemy bez wahania utworzyć kolejną partycję. W przypadku gdy wypalamy obraz przy pomocy dd , za każdym razem gdy to robimy, będziemy tracić również i dane zgromadzone na tej drugiej partycji w wyniku nadpisania MBR. Ja się posłużę tym samym pendrive, który wykorzystywałem w przytoczonym linku.

Nie będę opisywał tutaj jak stworzyć nową partycję przy pomocy gparted, bo to raczej każdy z nas powinien umieć zrobić, nawet jeśli wymaga to skurczenia którejś z istniejących. Poniżej mamy już przygotowany odpowiedni układ partycji:

gparted-persistence-live

W tym przypadku system live rezyduje na partycji drugiej. Na trzeciej zaś będzie persistence. Montujemy zatem tę trzecią partycję i tworzymy na niej plik persistence.conf :

# mount /dev/sdb3 /mnt
# touch /mnt/persistence.conf

Plik persistence.conf zawierać będzie konfigurację folderów, które życzymy sobie nadpisać, tj. których zmiany będą zapisywane na tej partycji. Możemy zdefiniować pojedyncze foldery, np /home/ albo /etc/ , możemy także wziąć pod uwagę monitoring wszelkich zmian przez podanie / . Wpisy definiujemy jeden pod drugim w poniższej postaci:

/home/    union

W przypadku gdy definiujemy katalog / , trzeba brać pod uwagę, że przy wgrywaniu nowych obrazów live będą występować problemy uniemożliwiające start systemu, co jest zrozumiałe, bo macierzysty system uległ zmianie i wprowadzone zmiany nie dotyczą już niego. Konfiguracja użytkownika jest relatywnie bezpieczna, podobnie jak i katalog /etc/. Oczywiście to nie znaczy, że wprowadzanie zmian do całego systemu plików jest złe. Zawsze można przecież wyczyścić tę partycję.

Zapisujemy plik i przechodzimy do konfiguracji systemu live. Interesują nas pliki zlokalizowane w katalogu /media/morfik/good/extlinux/ (nazwa tego katalogu może się różnić w zależności od wgranego bootloader'a), a konkretnie live.cfg . To tam dopisujemy parametry dla kernela. Tworzymy zatem dodatkowy wpis uwzględniając opcję persistence , przykładowo:

label live-amd64-persistence
      menu label ^Live-persistence (amd64)
      menu default
      linux /live/vmlinuz
      initrd /live/initrd.img
      append boot=live components persistence quiet splash

By cały mechanizm zadziałał, trzeba dostosować odpowiednio etykietę partycji. Choć jeśli przyjrzymy się obrazkowi powyżej, to już ten krok powinniśmy mieć za sobą.

Domyślnie system live poszukuje partycji, których etykietą jest persistence . Jeśli z jakichś powodów chcemy mieć inną nazwę, to istnieje także parametr dla kernela, który może skonfigurować system live by uwzględnił ją przy przeszukiwaniu partycji. W konfiguracji powyżej, w linijce z append boot trzeba dopisać persistence-label=dane , gdzie dane , to etykieta partycji.

Szyfrowany persistence

Na partycji persistence, jako że zawiera system plików w trybie do zapisu, mogą znajdować się poufne dane konfiguracyjne, np. hasła do aplikacji czy kont online. Z tego powodu istnieje też możliwość jej zaszyfrowania. W tym celu będzie nam potrzebny kontener LUKS.

Nie będę tutaj opisywał tworzenia takiego kontenera na dane, bo to zagadnienie na osobny artykuł. Poniższe kroki zostaną przeprowadzone przy założeniu, że już taki zaszyfrowany volumin posiadamy i wiemy jak z niego korzystać.

Po otwarciu kontenera, nadajemy etykietę voluminowi przy pomocy narzędzia tune2fs :

# cryptsetup luksOpen /dev/sdb3 sdb3
# tune2fs -L persistence /dev/mapper/sdb3

Oczywiście dalszy schemat z tworzeniem i edycją pliku persistence.conf jest taki sam, co w przypadku zwykłego persistence. Jedyna różnica, jaką da się zauważyć, to dodatkowy parametr persistence-encryption=luks, który musimy dopisać do linijki kernela w konfiguracji bootloader'a. Dla przypomnienia, u mnie to jest plik /media/morfik/good/extlinux/live.cfg :

label live-amd64-persistence
      menu label ^Live-persistence (amd64)
      menu default
      linux /live/vmlinuz
      initrd /live/initrd.img
      append boot=live components persistence persistence-encryption=luks quiet splash

Po tym zabiegu jeśli spróbujemy odpalić system live z tej pozycji, zostaniemy poproszeni o wpisanie hasła w celu odblokowania kontenera.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.