zram

Fr, 5. November 2021, tastytea

zram ist ein Feature des Linux-Kernels, welches es erlaubt, beliebige Partitionen komprimiert im Arbeitsspeicher zu erstellen; auch Swap-Partitionen. Mit ihm ist es möglich, den RAM effektiv zu verdoppeln, erkauft durch eine etwas höhere CPU-Belastung. Unter bestimmten Umständen können höhere Verhältnisse erreicht werden, doch die Kernel-Entwickler·innen gehen von einem Kompressionsverhältnis von 2:1 aus.

Die meisten Linux-Distributionen haben Werkzeuge an Bord, um zram einzurichten. Leider kochen fast alle ihr eigenes Süppchen.

Arch Linux / Fedora

Arch Linux und Fedora paketieren zram-generator vom systemd-Projekt.

Im folgenden Beispiel werden 2 Partitionen erstellt, eine als Swap formatiert, die maximal 2 GiB gross wird und eine mit ext4, die höchstens 1 GiB gross werden kann.

Die Konfiguration für zram-generator in /etc/systemd/zram-generator.conf sähe wie folgt aus:

[zram0]
compression-algorithm = zstd
zram-size = 2048

[zram1]
compression-algorithm = zstd
zram-size = 1024
fs-type = ext4
mount-point = /ramdisk

Aktiviert wird sie mit systemctl daemon-reload gefolgt von systemctl start /dev/zram0 und systemctl start /dev/zram1 

Von nun an wird der Service bei jedem Systemstart automatisch gestartet.

Debian / Ubuntu

Unter Debian (Ubuntu unterstützt diese Methode, zusätzlich zu ihrer eigenen, auch) muss zram-tools installieren werden und die Konfigurationsdatei /etc/default/zramswap wie folgt bearbeitet werden:

CORES=1
ALGO=zstd
ALLOCATION=2048
PRIORITY=32767

Die neue Konfiguration wird mit systemctl restart zramswap.service angewendet. Partitionen, die kein Swap sind, anzulegen ist in Debian offenbar nicht vorgesehen.

Die universale Methode

Natürlich kann zram auch manuell ohne besondere Werkzeuge eingerichtet werden. Alle Befehle müssen als root ausgeführt werden.

modprobe zram num_devices=2
echo zstd > /sys/block/zram0/comp_algorithm
echo 2G > /sys/block/zram0/disksize
echo 1G > /sys/block/zram0/mem_limit

In der ersten Zeile wird das Modul geladen und angegeben, wie viele Partitionen erstellt werden wollen. Diese Zahl kann nachträglich nicht mehr geändert werden. In der zweiten wird der Komprimierungsalgorithmus festgelegt. Mit cat
/sys/block/zram0/comp_algorithm können die verfügbaren Komprimierungsalgorithmen abgefragt werden. Dabei ist zu beachten, dass nur die Algorithmen angezeigt werden, dessen Modul geladen ist. In der dritten und vierten Zeile wird angegeben, wie gross die Partition sein soll und wie viel Platz sie im Arbeitsspeicher maximal belegen darf (letzteres ist optional).

Schlussendlich wird die Partition als Swap formatiert, aktiviert und ihr dabei die höchste Priorität zugewiesen, damit sie zuerst benutzt wird, falls es noch andere Swap-Partitionen gibt.

mkswap /dev/zram0
swapon --priority 32767 /dev/zram0

Das Anlegen einer ext4-Partition läuft fast identisch ab:

echo zstd > /sys/block/zram1/comp_algorithm
echo 1G > /sys/block/zram1/disksize
echo 500M > /sys/block/zram1/mem_limit
mkfs.ext4 -L ramdisk -m 0 /dev/zram1
mount /dev/zram1 /ramdisk

Die Einrichtung muss bei jedem Systemstart wiederholt werden, zum Beispiel, indem ein Skript vom Init-System gestartet wird.

Um zu überprüfen, ob alles geklappt hat, kann zramctl oder swapon ausgeführt werden. In der Ausgabe müssten /dev/zram0 und /dev/zram1 mit den richtigen Grössen auftauchen.