zram: properly implement systemd service

The systemd service points ot a script which is not installed by
zram or any of its dependencies. It seems that the service got
migrated without the necessary script.

The sysvinit script seems rather dated and initializes multiple
zram instances to support multiprocessor systems. This is no
longer necessary with modern implementations as newer kernel
version support multiple streams by default.

Create a modern implementation based on Fedoras zram package.
Make use of systemd swap unit files instead of enabling swap
directly.

This removes the need for util-linux-swaponoff (since swap is
now handled by systemd, which presumably depends on swaponoff).
However, it adds the dependency to util-linux for zramctl.

Signed-off-by: Stefan Agner <stefan.agner@toradex.com>
Signed-off-by: Khem Raj <raj.khem@gmail.com>
This commit is contained in:
Stefan Agner
2019-10-06 23:00:32 +02:00
committed by Khem Raj
parent 2582668a34
commit 501df47c33
8 changed files with 120 additions and 45 deletions
@@ -0,0 +1,10 @@
[Unit]
Description=Enable compressed swap in memory using zram
Requires=zram-swap.service
After=zram-swap.service
[Swap]
What=/dev/zram0
[Install]
WantedBy=swap.target
+19
View File
@@ -0,0 +1,19 @@
#!/bin/sh
set -e
device=$1
if [ "$device" = "" ]; then
echo "Usage: zram-swap-deinit <device>"
exit 1
fi
sysblockdev=/sys/block/$(basename $device)
if [ ! -d $sysblockdev ]; then
echo "Block device not found in sysfs"
exit 1
fi
# zramctl -r is not suitable as it also removes the actual device. Recreating
# it is non-trivial, especially if not /dev/zram0 is used...
echo 1 > ${sysblockdev}/reset
+26
View File
@@ -0,0 +1,26 @@
#!/bin/sh
set -e
device=$1
if [ "$device" = "" ]; then
echo "Usage: zram-swap-init <device>"
exit 1
fi
# Allocate zram to be size of actual system memory
# Note: zram is only allocated when used. When swapped pages compress with a
# a 2:1 ratio zram will require 50% of system memory (while allowing to use
# 150% memory).
ZRAM_SIZE_PERCENT=100
ZRAM_ALGORITHM=lz4
[ -f /etc/default/zram ] && ./etc/default/zram || true
memtotal=$(grep MemTotal /proc/meminfo | awk ' { print $2 } ')
memzram=$(($memtotal*${ZRAM_SIZE_PERCENT}/100))
# Try loading zram module
modprobe -q zram || true
zramctl -a ${ZRAM_ALGORITHM} -s ${memzram}KB $device
mkswap -L "zram-swap" $device
@@ -0,0 +1,10 @@
[Unit]
Description=Create compressed swap in memory using zram
DefaultDependencies=no
[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=30sec
ExecStart=@LIBEXECDIR@/zram-swap-init /dev/zram0
ExecStop=@LIBEXECDIR@/zram-swap-deinit /dev/zram0
@@ -1,12 +0,0 @@
[Unit]
Description=Enable zram compressed in-memory swap.
After=multi-user.target
[Service]
RemainAfterExit=yes
ExecStart=/usr/bin/zram-load.sh --load
ExecStop=/usr/bin/zram-load.sh --unload
Type=oneshot
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,5 @@
#!/bin/sh
for i in $(grep '^/dev/zram' /proc/swaps | awk '{ print $1 }'); do
swapoff "$i" && zramctl --reset "$i"
done
-33
View File
@@ -1,33 +0,0 @@
SUMMARY = "Linux zram compressed in-memory swap"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
inherit update-rc.d systemd
RDEPENDS_${PN} = "util-linux-swaponoff kmod"
RRECOMMENDS_${PN} = "kernel-module-zram"
PR = "r3"
SRC_URI = " \
file://init \
file://zram.service \
"
do_install () {
# Sysvinit
install -d ${D}${sysconfdir}/init.d
install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/zram
install -d ${D}${systemd_unitdir}/system
install -m 0644 ${WORKDIR}/zram.service ${D}${systemd_unitdir}/system
}
FILES_${PN} = "${sysconfdir}"
INITSCRIPT_NAME = "zram"
INITSCRIPT_PARAMS = "start 05 2 3 4 5 . stop 22 0 1 6 ."
RPROVIDES_${PN} += "${PN}-systemd"
RREPLACES_${PN} += "${PN}-systemd"
RCONFLICTS_${PN} += "${PN}-systemd"
SYSTEMD_SERVICE_${PN} = "zram.service"
+50
View File
@@ -0,0 +1,50 @@
SUMMARY = "Linux zram compressed in-memory swap"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
inherit update-rc.d systemd
RDEPENDS_${PN} = "kmod \
${@bb.utils.contains('DISTRO_FEATURES','systemd','util-linux','util-linux-swaponoff',d)}"
RRECOMMENDS_${PN} = "kernel-module-zram"
PR = "r3"
SRC_URI = " \
file://init \
file://zram-swap-init \
file://zram-swap-deinit \
file://zram-swap.service \
file://dev-zram0.swap \
"
do_install () {
# Install systemd related configuration file
if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'true', 'false', d)}; then
install -d ${D}${sysconfdir}/init.d
install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/zram
fi
if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
install -d ${D}${libexecdir}
install -m 0755 ${WORKDIR}/zram-swap-init ${D}${libexecdir}
install -m 0755 ${WORKDIR}/zram-swap-deinit ${D}${libexecdir}
install -d ${D}${systemd_unitdir}/system
install -m 0644 ${WORKDIR}/zram-swap.service ${D}${systemd_unitdir}/system/zram-swap.service
sed -i -e "s,@LIBEXECDIR@,${libexecdir},g" ${D}${systemd_unitdir}/system/zram-swap.service
install -m 0644 ${WORKDIR}/dev-zram0.swap ${D}${systemd_unitdir}/system/dev-zram0.swap
fi
}
FILES_${PN} = " \
${sysconfdir} \
${systemd_unitdir} \
${libexecdir} \
"
INITSCRIPT_NAME = "zram"
INITSCRIPT_PARAMS = "start 05 2 3 4 5 . stop 22 0 1 6 ."
RPROVIDES_${PN} += "${PN}-systemd"
RREPLACES_${PN} += "${PN}-systemd"
RCONFLICTS_${PN} += "${PN}-systemd"
SYSTEMD_SERVICE_${PN} = "dev-zram0.swap"