Skryptowa nakładka na kernelowski moduł ZRAM
Kategoria: Artykuły, etykiety: kernel, kompresja, moduł, ram, zram
Dodany: 2015-02-17 21:02
(zmodyfikowany: 2015-02-17 21:26)
Przez: morfik
Wyświetleń: 9620
Wiele miesięcy temu opisywałem ciekawy mechanizm, który może nam pomóc w odciążeniu dysku twardego. Z tym, że wiele się od tego czasu zmieniło, świat poszedł ździebko do przodu i postanowiłem napisać lekki update w stosunku do modułu ZRAM. Tego starego tekstu zdecydowałem się nie kasować -- może komuś się przyda, jakby nie patrzeć, są jeszcze ludzie na świecie co używają stabilnych wydań debiana.
Dla przypomnienia, ZRAM to taki 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ądzeni 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 RAMu, który jest o wiele szybszy no i dane w nim nie podlegają szyfrowaniu. Tu jest przykład zastosowania takiego mechanizmu -- pokazane w oparciu o przeprowadzenie kompilacji na w pełni zaszyfrowanym systemie nie posiadającym wsparcia dla AES.
Jeśli mamy dużo pamięci operacyjnej, to raczej ZRAM 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. Trzeba jednak pamiętać, że kompresja dodaje lekki overhead procesorowi.
By móc skorzystać z modułu ZRAM, musimy mieć go wkompilowanego w kernel:
# cat /boot/config-3.16.0-4-amd64 | grep -i zram
CONFIG_ZRAM=m
# CONFIG_ZRAM_LZ4_COMPRESS is not set
# CONFIG_ZRAM_DEBUG is not set
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 prawie OOTB. Prawie, a to z tego względu, że jak się przyjrzymy wyżej, w debianie nie mamy standardowo wkompilowanego LZ4_COMPRESS i trzeba to będzie zmienić ale o tym później.
W paczce też znajdziemy kilka innych plików, w tym też konfigurację dla modułu ZRAM. Chodzi o to ile urządzeń system będzie tworzył na starcie -- domyślnie są 3. Jeden dla SWAP, jeden dla /tmp/ i jeden dla /var/tmp/ . Oczywiście możemy to sobie dowolnie dobrać przez edycję pliku /etc/modprobe.d/zram.conf :
options zram num_devices=3
Skrypt zram-init wgrywamy do /usr/sbin/ .
Ja używam systemd, zatem potrzebne mi są również pliki .service , które są także dostarczone z paczką. Z tym, że trzeba zmienić w nich algorytm kompresji -- trzeba pozmieniać linijki, przykładowo:
ExecStart=/usr/sbin/zram-init -s2 -alz4 2048
na
ExecStart=/usr/sbin/zram-init -s2 -alzo 2048
Jeśli nie odpowiada nam rozmiar urządzenia (w powyższym przykładzie to 2G), możemy również zmienić tę wartość. Sam skrypt ma więcej opcji, patrz --help .
Po edycji pliki wrzucamy do do /etc/systemd/system/ i aktywujemy:
systemctl enable zram_swap.service
systemctl enable zram_tmp.service
systemctl enable zram_var_tmp.service
Takich plików .service możemy tworzyć ile dusza zapragnie. Trzeba jednak pamiętać, by odpowiednio dobrać parametr -b oraz stworzyć odpowiednią ilość urządzeń.
Jeśli mamy zamiar korzystać z kompresji plików w katalogu /tmp/ , musimy także zamaskować systemową usługę tmp.mount :
# systemctl mask tmp.mount
Jeśli mamy jakieś wpisy w pliku /etc/fstab dotyczące /tmp/ , trzeba je wykomentować.
Po zresetowaniu maszyny, urządzenia ZRAM powinny zostać utworzone, odpowiednio sformatowane i zamontowane w systemie.