Raspberry PI OS - Gnome-Mate tworzenie swap'a

Mate bez swapu :o

Szukając odpowiedniego systemu (architektura arm64) dla Raspberry Pi zwróciłem uwagę na Ubuntu-Mate (64b).

Używałem Ubuntu w przeszłości i byłem przekonany, że ta dystrybucja okrzepła, niczym mnie nie zaskoczy.

I używa swapa :D Ściągnąłem obraz, start z SSD. Instalacja przebiegła (w zasadzie) bez problemów.

Po zalogowaniu i zamknięciu ekranu powitalnego od razu wszedłem do terminala (Ctrl+Alt+T). By sprawdzić wielkość swapu "poleciłem": free -hm.

Nie tego się spodziewałem... Trzy zera (0B,0B,0B) w pozycjach: razem, użyte, wolne!

Zaskoczył mnie Raspbian (32b) tworząc swap zaledwie 100MB. :/ Okazało się jednak, że Ubuntu-Mate, mając do dyspozycji dysk (SSD, NVMe, 256GB) nie utworzył go w ogóle!

Czy i jak go stworzyć? Co wybrać: fallocate czy dd z /dev/zero ? :x

Trochę teorii...

W MATE swapu nie ma!

Mógłbym uznać, że skoro twórcy Ubuntu-Mate zrezygnowali ze swap'a to wszystko jest ok.

W artykule poświęconemu swap'owi pod Raspberry PI OS (32b) - plik wymiany zarządzany przez dphys-swapfile omówiem podstawowe pojęcia dotyczące swap'a. Nie będę tego ponownie powtarzał.

Byłbym gotów "przyjąc na wiarę" i "odpuścić" swap, gdybym nie zajrzał stronę Wsparcia Ubuntu, szeroko omawiającemu zagadnienia swap'a (SwapFAQ). Jego twórcy (z Canonical.com) nie pozostawili wątpliwości: swap jest potrzebny!

Na wstępie zaznaczają, że artykuł przeznaczony jest dla początkujących użytkowników Ubuntu. Uważam, że warto go jednak przeczytać. Szeroko omawia zagadnienia związane ze swap'em.

Wskazano na sytuacje, gdy swap bywa nie tylko wykorzystywany. Ale staje się wręcz niezbędny. Powodem tego mogą być:

  • pamięciożerne aplikacje (wskazywane są edytory tekstu czy obrazu),
  • przejście systemu w stan "hibernacji",
  • sytuacje nadzwyczajne (awarie sprzętu, błędy zawarte w kodzie aplikacji i/lub błędy użytkownika),
  • optymalizacjia wykorzystania pamięci RAM.

Prezentują jaka (ich zdaniem) wielkość pliku swap jest optymalna dla 3 wariantów działania systemu: bez i z hibernacją oraz wielkość maksymalna swap'u (uzależniona od wielkości RAM'u).

Nie jest moim celem dokładne omawianie tej publikacji, gdyż uważam ją za godną przeczytania. Potwierdzeniem tej opinii niech będzie fakt, że opisywane w niej metody stworzenia "od zera" swap'u można znaleźć na wielu stronach.

Do polecenia mkswap na stronie manuali Ubuntu, akapit Uwagi: (18.04, 20.04 LTS) można znależć następującą uwagę:
"...Plik wymiany nie może zawierać dziur. Nie można skorzystać z cp(1) do utworzenia tego pliku.
Nie można również użyć fallocate(1) w systemach plików obsługujących wstępną alokację plików, takich jak XFS lub ext4, ...
W takich przypadkach zaleca się skorzystanie z dd(1) i /dev/zero." Czyli powszechnie znane:

~$ sudo dd if=/dev/zero of=swapfile bs=1MiB count=$((4*1024)) # utworzenie 4GB pliku swapfile 

Dla wersji Ubuntu 20.10 nie ma jeszcze pełnego polskiego tłumaczenia, ale w opisie polecenia swapon (En, akapit: Uwagi) można znaleźć następujące ostrzeżenie:
"...Wstępnie przydzielone pliki utworzone przez fallocate (1) mogą być również interpretowane jako pliki z dziurami w zależności od systemu plików". 

Dysponowałem dyskiem (SSD, NVMe, 256GB) ze "swieżo" posadzonym Ubuntu-Mate (64b) postanowiłem sprawdzić, czy fallocate "da radę'. I jak mkswap oraz swapon "ustosunkują" się do tak utworzonego swap'a? :D

Nie rozstrzygnę tu jednak dylematu: co lesze plik wymiany (swap) jako fizyczny plik czy jako wyodrębniona partycja? Materiałów, opinii i prezentowanych metod działania udostępnionych w sieci jest wiele.

Kończąc "wywód teoretyczny" dowiedziałem się, że dla takiego układu jak mój (8GB RAM, w rzeczywistości trochę mniej bo odchodzi trochę na GPU) to swap winien mieć ok. 3-4GB.

Tyle teorii. Mój Raspberry Pi 4B/8GB z Ubuntu-Mate otrzyma swap 4GB, w postaci pliku (nie partycji). Do jego utworzenia wykorzystam procedury, opisane we wskazanej publikacji Conical.com.

Utworzenie pliku swap

Tworzenie i aktywacja swapfileDo utworzenia pliku (nie partycji) wymiany czyli swap'a wykorzystam polecenie: fallocate. W celach testowych. Ale test trwa do dzisiaj. Od kilku tygodni. :)

Przyznaję, że do czasu lektury artykułu o swap'ie nie miałem pojęcia o jej istnieniu. :/ Polecenie to w różnych dystrybucjach Linuksa (tak jest zaimplementowane w Ubuntu-Mate) wykorzystywane jest do utworzenia plików. Szczególnie tych dużych.

Polecenie fallocate działa w pewien specyficzny sposób. Następuje szybkie przyporządkowanie bloków do plików. Zostają one oznaczone jako "przynależne" do pliku (lecz nie zainicjowane, np. wypełnianie zerami). Toteż proces nie wymagając żadnych operacji I/O odbywa się błyskawicznie. Niemal natychmiast.

Tu fallocate wymaga uprawnień superusera i zostało poprzedzone poleceniem: sudo:

~$ sudo fallocate -l długość <scieżka><nazwa_pliku>

Po argumencie "l" (długości) mogą występować wartości: binarne - 2^N sufiksy KiB, MiB, GiB, itd. (gdzie iB to opcjonalne, np. K jest tożsame z KiB) lub dziesiętne: 10^N przyrostki KB, MB, GB, itd.

W przypadku podania ścieżki plik zostanie utworzony we wskazanym  katalogu. Bez ścieżki zostanie utworzony w "bieżącym" katalogu. Nie zawsze jest to korzystne (np. utworzenie swapa we własnym katalogu domowym ;)

Polecenie to może zostać wywołane również z innymi argumentami, ale dla utworzenia pliku swap wystarczy ten jeden, wskazany.

Poniżej przedstawiłem ciąg poleceń związanych z utworzeniem w katalogu głównym (/) pliku swapfile o wymiarze 4GB. Proszę zwrócić uwagę na po utworzeniu pliku swapfile trzeba:Modyfikacja pliku /etc/fstab

  • nadać mu odpowiednie uprawnienia,
  • nadanie mu struktury odpowiedniej dla pliku swap,
  • aktywowanie pliku swap oraz
  • zmodyfikowanie pliku fstab, skutkujące automatycznym uaktywnieniem swapu po inicjacji systemu:

$ sudo fallocate -l 4G /swapfile # przypisanie alokacji do pliku swapfile
$ sudo chmod 600 /swapfile # tylko superuser czyta i pisze do swapfile
$ sudo mkswap /swapfile # nic się nie posypało !!! :D

Tworzenie obszaru wymiany w wersji 1 obszaru wymiany; rozmiar = 4GiB (bajtów: 4294963200)
brak etykiety, UUID=....................................

$ sudo swapon /swapfile # też OK! protestów nie było. Error code - też nie! ;)
$ sudo nano /etc/fstab

# (na obrazku po prawej pokazano zmiany wprowadzone w pliku fstab)

$ sudo swapon --show

NAME TYPE SIZE USED PRIO
/swapfile file 4GiB 0B -2

sudo free -hm
  razem użyte wolne dzielone buff/cache dostępne
Pamięć: 7,2Gi 1,3Gi 4,4Gi 218Mi 1,5Gi 5,6Gi
Wymiana: 4,0Gi 0B 4,0Gi      

$ sudo reboot

Swapfile - jest i działa! :D

Nie wdając się w szczegóły użyłem polecenia fallocate (tego dostępnego w Ubuntu-Mate (64b). I działa.  System plików ext4.

Ciekawych możliwości jakie posiada polecenie fallocate zachęcam do przeczytania mana.

Na koniec - bo "ostrożności nigdy za wiele" - w oknie terminala sprawdziłem. Działa (tzn. jest ;) od kilku tygodni.

Usuwanie pliku swapfile

W myśl starego powiedzenia: "łatwo przyszło, łatwo poszło" może będziesz chciał... usunąć plik swapfile.

Nie mówię, że od razu, ale... powodów może być wiele. Jednym z najczęściej wskazywanych jest: "bo chcę"! ;) To też wystarczy.

Tym razem lista poleceń nie jest długa:

~$ sudo swapoff -v /swapfile # deaktywacja swap'a
~$ sudo nano /etc/fstab # usuń wpis dotyczący swap'a
~$ sudo rm /swapfile # fizyczne usunięcie pliku

Jak już wspominałem podczas instalacji swapa pod Ubuntu-Mate (64b) nie napotkałem większych problemów. 

Po pewnym czasie - dla porównania - stworzyłem swap'a korzystając z polecenia dd. OS "nie zauważył" różnic. Ja też nie. :) Nadal wykorzystanie swap'a minimalne. Ale jakby co? Dobrze, że jest...

Zagadnienia opisane w niniejszym artykule są pokłosiem doświadczeń związanych z realizacją projektu "Mikroskop do lutowania (RPi 4B+HQC+M42)".

Jeśli jesteś zainteresowany tym na co "marnotrawię swój czas" zapraszam do Warsztatu krótkofalowca.