Skryptowa nakładka na kernelowski moduł ZRAM

Spis treści

ZRAM to moduł kernela, który tworzy wirtualne urządzenia w pamięci operacyjnej komputera, a te z kolei można wykorzystać pod system plików lub też i pod przestrzeń wymiany SWAP. Dane w takim urządzeniu są kompresowane, dzięki czemu mamy do dyspozycji więcej miejsca w pamięci. Jeśli mamy niepierwszej jakości dysk twardy, lub też wykorzystujemy szyfrowanie i nie mamy przy tym procka ze wsparciem dla AES, to operacje zapisu/odczytu mogą zająć wieki. Możemy w dość znacznym stopniu odciążyć dysk przenosząc pliki do pamięci RAM, który jest o wiele szybszy, no i dane w nim nie podlegają szyfrowaniu. Jeśli mamy dużo pamięci operacyjnej, to ZRAM raczej będzie zbędny i tylko podniesie nam rachunek za prąd. Natomiast jeśli nasz komputer nie szasta zbytnio pamięcią, możemy rozszerzyć ją 2-3 krotnie.

Obsługa modułu ZRAM w kernelu

By móc skorzystać z modułu ZRAM, musimy mieć go wkompilowanego w kernel. Ważne jest, by w kernelu było także wsparcie dla kompresji lz4 :

$ egrep -i zram /boot/config-4.7.0-1-amd64
CONFIG_ZRAM=m
CONFIG_ZRAM_LZ4_COMPRESS=y

Projekt zram-init

Na githubie znalazłem projekt co się zwie zram-init . Jest to skrypt, zajmujący się tworzeniem odpowiednich urządzeń i całość działa OOTB, przynajmniej, gdy kernel ma ustawiony LZ4_COMPRESS . W przeciwnym razie, algorytm kompresji trzeba będzie sobie zmienić przy tworzeniu urządzeń.

W paczce znajdziemy kilka innych plików, w tym też konfigurację dla modułu ZRAM. Chodzi o ilość urządzeń, które system będzie tworzył na starcie. Domyślnie są 3: jeden dla SWAP, jeden dla /tmp/ i jeden dla /var/tmp/ . Jeśli nie odpowiada nam taka konfiguracja, to zawsze możemy zmienić ilość tych urządzeń w pliku /etc/modprobe.d/zram.conf . Jeśli chodzi zaś o sam skrypt zram-init , to wgrywamy go do /usr/sbin/ .

Ja używam systemd, zatem potrzebne mi są również pliki .service , które są także dostarczone w paczce. W przypadku, gdy nasz kernel nie wspiera algorytmu lz4 , trzeba przepisać sobie linijkę wywołującą tworzenie urządzeń, tak by ustawić algorytm na lzo :

ExecStart=/usr/sbin/zram-init -s2 -alzo -Lzram_swap 2048

W przypadku, gdy nie odpowiada nam rozmiar urządzenia (tutaj 2 GiB), to również i tę kwestię możemy sobie dostosować zmieniając ostatnią wartość w powyższej linijce.

Pliki po edycji wrzucamy do /etc/systemd/system/ , po czym włączamy wszystkie 3 usługi:

# systemctl enable zram_swap.service
# systemctl enable zram_tmp.service
# systemctl enable zram_var_tmp.service
# systemctl enable zram_btrfs.service

Jako, że wyżej włączyliśmy usługi, to przyszła pora na ich wystartowanie, z tym, że akurat tę czynność system musi wykonać po zresetowaniu maszyny. Tylko w takim przypadku urządzenia ZRAM zostaną odpowiednio utworzone, sformatowane i zamontowane.

Partycja /tmp/

W przypadku korzystania ze zram_tmp.service , trzeba zamaskować punkt montowania tmp.mount . W przeciwnym razie mogą wystąpić problemy podczas startu systemu. Maskowanie przeprowadzamy w poniższy sposób:

# systemctl mask tmp.mount

Dodatkowo, jeśli mamy jakieś wpisy w pliku /etc/fstab dotyczące katalogu /tmp/ , to trzeba je wykomentować.

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.