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/tmp
a/var/log
u Rasberry Pi.