zRAM je vlastnost linuxového jádra poskytující formu virtuální komprese paměťového prostoru. Díky této technologii lze vytvářet komprimovaná bloková zařízení, která jsou umístěna v operační paměti počítače. Tato zařízení můžeme také, i když velmi zjednodušeně, označovat i jako virtuální „diskové“ prostory. V současné době můžeme vybírat ze dvou kompresních algoritmů. Tím prvním, a výchozím, je LZO, druhým pak LZ4.
Následující článek je jednoduchý návod, jak vytvořit swap, adresáře /tmp a /var/log za použití technologie zRAM.V mém případě je technologie zRAM nasazena zatím pouze na embedded zařízení Alix 3D3. Jedná se o zařízení s i586 CPU AMD Geode LX800 pracujícím na 500 MHz, 256 MB DDR DRAM a diskovým prostorem na CompactFlash. Nasazeným operačním systémem je Arch Linux i686 se systemd. Operační paměti není nazbyt a využití CompactFlash pro některé funkce nepřichází, vzhledem k omezenému počtu zápisů, v úvahu. Z toho důvodu jsem se rozhodl využít právě technologie zRAM. Pro příslušné souborové systémy lze využít tmpfs, tedy opět oblast v operační paměti, nicméně není komprimována. Velikost ukládaných dat aplikací = velikosti uložených dat v paměti. V případě zRAM se udává tento poměr cca 3:1.
Co nás čeká? Plánování > zavádění modulu jádra > vytvoření souborového systému > připojení souborového systému > vytvoření dalších potřebných adresářů.
Konfigurace
V distribuci Arch Linux není potřeba pro zprovoznění zRAM kompilovat jádro, moduly ani instalovat dodatečný software. Vše je obsaženo v základním systému.
Plánování
Před vlastní konfigurací je důležité si rozmyslet, které adresáře budou umístěny v souborovém systému vytvořeném v zRAM. To z toho důvodu, že po vypnutí/restartu nebudou data uložená v těchto adresářích k dispozici – jsou uloženy v operační paměti RAM. Tyto adresáře se vytvoří při startu systému znovu.
Pro mé účely bude dostačující umístit do zRAM adresáře /tmp a /var/log. Adresář /tmp bývá obvykle po startu vymazán a logy ve /var/log zachovat nepotřebuji. Ty nejdůležitější informace jsou přeposílány službou syslog-ng na vzdálený server.
Pro některé služby je však potřeba po startu systému, a vytvoření /var/log v zRAM, vytvořit adresáře pro ukládání vlastních logů. Jsou to např. minidlna, named, nginx a squid. Bez těchto adresářů nelze příslušné služby spustit.
Potřebujeme tedy následující informace: které adresáře umístíme do zRAM, co bude dále potřeba vytvořit, kopírovat – s jakými vlastníky a oprávněními.
Příklad:
adresáře:
/tmp/ o velikosti 30 MB, /var/log/ o velikosti 20 MB
vytvořit:
/var/log/minidlna 0755 minidlna:minidlna
/var/log/named 0755 named:named
/var/log/nginx 0755 http:log
/var/log/squid 0755 proxy:proxy
Zavedení modulu jádra po startu systému
Modul jádra operačního systému má název zram. Prvním předpokladem pro úspěšnou konfiguraci je jeho zavedení při startu systému. Pro tento účel vytvoříme v adresáři /etc/modules-load.d/ soubor zram.conf. Ten bude obsahovat název modulu, tedy zram.
| 1 2 | [root@alix ~]# cat /etc/modules-load.d/zram.conf zram | 
Nyní nastevíme parametry modulu. V adresáři /etc/modprobe.d/ vytvoříme soubor zram.conf, ale s jiným obsahem.
| 1 2 | [root@alix ~]# cat /etc/modprobe.d/zram.conf  options zram num_devices=3 | 
Parametr num_devices modulu zram říká, kolik blokových zařízení má vytvořit v adresáři /dev/. V tomto případě to budou /dev/zram0, /dev/zram1 a /dev/zram2. Každý z našich vybraných adresářů bude vytvořen na jednom specifickém zařízení. Např. /var/log na /dev/zram0, /tmp na /dev/zram1, swap na /dev/zram2. Musíme nechat vytvořit správný počet. Pokud jich bude více, nevadí. Zůstanou nevyužita.
Informace o modulu a jeho parametrech získáme pomocí příkazu modinfo:
| 1 2 3 4 5 6 7 8 9 | [root@alix ~]# modinfo zram filename:       /lib/modules/4.0.4-2-ARCH/kernel/drivers/block/zram/zram.ko.gz description:    Compressed RAM Block Device author:         Nitin Gupta <ngupta@vflare.org> license:        Dual BSD/GPL depends:        lz4_compress intree:         Y vermagic:       4.0.4-2-ARCH SMP preempt mod_unload modversions 686 parm:           num_devices:Number of zram devices (uint) | 
Výše uvedené soubory zajistí zavedení jaderného modulu s těmi správnými parametry.
Nastavení zařízení zRAM a vytváření souborových systémů
Modul máme zaveden. Pro jeho využití musíme nadefinovat velikost příslušných blokových zařízení a vytvořit souborové systémy.
Tyto operace můžeme provést skriptem, anebo využijeme udev. Vytvoříme soubor /etc/udev/rules.d/10-zram.rules s následujícím obsahem:
| 1 2 3 | KERNEL=="zram0", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{disksize}="20M", RUN+="/usr/bin/mkfs.ext4 -O ^has_journal -L LOG $env{DEVNAME}" KERNEL=="zram1", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{disksize}="30M", RUN+="/usr/bin/mkfs.ext4 -O ^has_journal -L TMP $env{DEVNAME}" #KERNEL=="zram2", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{disksize}="128M", RUN+="/usr/bin/mkswap $env{DEVNAME}" | 
Parametr ATTR{disksize}= definuje velikost zařízení, RUN+="/usr/bin/mkfs.ext4 -O ^has_journal -L TMP $env{DEVNAME}" obsahuje příkaz pro vytvoření souborového systému EXT4, bez žurnálu. Lze vytvořit EXT2, nicméně EXT4 je o něco výkonnější a systém nebude zavádět další modul – EXT4 využívám také pro root a datový disk. Souborový systém bez žurnálu proto, že při výpadku napájení přijdeme o data (to nám nevadí), žurnál zabýrá cenný paměťový prostor a částečně zatěžuje procesor.
Třetí zakomentovaný řádek vytváří v blokovém zařízení swap. Jelikož je ale zakomentovaný, neprovede se.
Pokud bychom chtěli využít kompresní algoritmus LZ4, přidáme na příslušný řádek mezi parametry ATTR{comp_algorithm}="lz4".
Připojování souborových systémů
Jedním z posledních kroků je nastavení připojování souborových systémů na správná místa. Do souboru /etc/fstab přidáme následující:
| 1 2 3 | /dev/zram0    /var/log    ext4    defaults    0    0 /dev/zram1    /tmp        ext4    defaults    0    0 #/dev/zram2   none        swap    nofail      0    0 | 
Pokud ale již nějaké zařízení na příslušné adresáře připojujeme (druhý sloupec), vše si ještě jednou promyslíme a případně změníme. Třetí, zakomentovaný, řádek opět definuje připojení swap.
Vytváření dalších adresářů na novém souborovém systému
Jak bylo uvedeno v části plánování, některé služby potřebují existenci vlastních adresářů. Konkrétně služby minidlna, named, nginx a squid.
V adresáři /etc/tmpfiles.d/ vytvoříme následující:
| 1 2 3 4 5 6 7 8 9 10 11 | [root@alix ~]# cat /etc/tmpfiles.d/minidlna.conf  d /var/log/minidlna 0755 minidlna minidlna - - [root@alix ~]# cat /etc/tmpfiles.d/named.conf  d /var/log/named 0755 named named - - [root@alix ~]# cat /etc/tmpfiles.d/nginx.conf  d /var/log/nginx 0755 http log - - [root@alix ~]# cat /etc/tmpfiles.d/squid.conf  d /var/log/squid 0755 proxy proxy - - | 
Pokud tyto služby nevyužíváme, nebo využíváme jiné, konfiguraci upravíme. V případě, že po startu systému některé služby neběží, můžeme se pomocí příkazu journalctl podívat na příčinu a donastavením uvést systém do funkčního stavu.
Kontrola stavu
Po restartu operačního systému si můžeme ověřit, zda je vše tak jak má být.
Připojené souborové systémy:
| 1 2 3 | [root@alix ~]# mount /dev/zram0 on /var/log type ext4 (rw,relatime) /dev/zram1 on /tmp type ext4 (rw,relatime) | 
Volné místo na souborových systémech:
| 1 2 3 4 | [root@alix ~]# df -h Souborový systém Velikost Užito Volno Uži% Připojeno do /dev/zram0            20M  560K   18M   4% /var/log /dev/zram1            30M   68K   27M   1% /tmp | 
Využití blokového zařízení zram0:
| 1 2 3 | [root@alix ~]# zramctl zram0 NAME       ALGORITHM DISKSIZE  DATA  COMPR TOTAL STREAMS MOUNTPOINT /dev/zram0 lzo            20M  716K 148,6K  492K       1 /var/log | 
Velikost blokového zařízení zram0:
| 1 2 | [root@alix ~]# cat /sys/block/zram0/disksize 20971520 | 
Přidáno 12. 07. 2015
Stejným způsobem nově připojuji adresáře/tmpa/var/logu Rasberry Pi.
