From 70fa66f6152d790aefb3af8f88ddbb197511bafa Mon Sep 17 00:00:00 2001 From: j1nx Date: Mon, 1 Mar 2021 21:58:30 +0100 Subject: [PATCH] Add and configure 20% of memory as zram swap with a low agressive swappiness --- .../board/raspberrypi/kernel.config | 3 + .../configs/rpi4_64-gui_defconfig | 1 + .../rootfs-overlay/etc/sysctl.conf | 1 + .../usr/lib/systemd/system/dev-zram0.swap | 10 +++ .../usr/lib/systemd/system/ovos-zram.target | 6 ++ .../usr/lib/systemd/system/zram-swap.service | 15 +++++ .../rootfs-overlay/usr/libexec/ovos-zram | 66 +++++++++++++++++++ 7 files changed, 102 insertions(+) create mode 100644 buildroot-external/rootfs-overlay/etc/sysctl.conf create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/dev-zram0.swap create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-zram.target create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/zram-swap.service create mode 100755 buildroot-external/rootfs-overlay/usr/libexec/ovos-zram diff --git a/buildroot-external/board/raspberrypi/kernel.config b/buildroot-external/board/raspberrypi/kernel.config index ec70df16..2aaf5bd4 100644 --- a/buildroot-external/board/raspberrypi/kernel.config +++ b/buildroot-external/board/raspberrypi/kernel.config @@ -1,3 +1,6 @@ CONFIG_SND_SOC_WM8960=m # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y + +CONFIG_ZRAM=y +CONFIG_ZSMALLOC=y diff --git a/buildroot-external/configs/rpi4_64-gui_defconfig b/buildroot-external/configs/rpi4_64-gui_defconfig index 9b7fe978..6c52e03a 100644 --- a/buildroot-external/configs/rpi4_64-gui_defconfig +++ b/buildroot-external/configs/rpi4_64-gui_defconfig @@ -465,6 +465,7 @@ BR2_PACKAGE_UTIL_LINUX_BINARIES=y BR2_PACKAGE_UTIL_LINUX_HWCLOCK=y BR2_PACKAGE_UTIL_LINUX_KILL=y BR2_PACKAGE_UTIL_LINUX_MORE=y +BR2_PACKAGE_UTIL_LINUX_ZRAMCTL=y BR2_PACKAGE_NANO=y BR2_PACKAGE_VIM=y # BR2_PACKAGE_VIM_RUNTIME is not set diff --git a/buildroot-external/rootfs-overlay/etc/sysctl.conf b/buildroot-external/rootfs-overlay/etc/sysctl.conf new file mode 100644 index 00000000..e0b01f0d --- /dev/null +++ b/buildroot-external/rootfs-overlay/etc/sysctl.conf @@ -0,0 +1 @@ +vm.swappiness = 20 diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/dev-zram0.swap b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/dev-zram0.swap new file mode 100644 index 00000000..a37c9248 --- /dev/null +++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/dev-zram0.swap @@ -0,0 +1,10 @@ +[Unit] +Description=OVOS ZRAM swap +Requires=zram-swap.service +After=zram-swap.service + +[Swap] +What=/dev/zram0 + +[Install] +WantedBy=swap.target diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-zram.target b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-zram.target new file mode 100644 index 00000000..10e8e323 --- /dev/null +++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-zram.target @@ -0,0 +1,6 @@ +[Unit] +Description=OVOS zram targets +Documentation=man:systemd.target(5) + +[Install] +WantedBy=multi-user.target diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/zram-swap.service b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/zram-swap.service new file mode 100644 index 00000000..81532d1c --- /dev/null +++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/zram-swap.service @@ -0,0 +1,15 @@ +[Unit] +Description=OVOS ZRAM swap +DefaultDependencies=no +Before=dev-zram0.swap +RefuseManualStart=true +RefuseManualStop=true + +[Service] +Type=oneshot +ExecStart=/usr/libexec/ovos-zram -t swap +RemainAfterExit=true +StandardOutput=null + +[Install] +WantedBy=ovos-zram.target diff --git a/buildroot-external/rootfs-overlay/usr/libexec/ovos-zram b/buildroot-external/rootfs-overlay/usr/libexec/ovos-zram new file mode 100755 index 00000000..e6d065be --- /dev/null +++ b/buildroot-external/rootfs-overlay/usr/libexec/ovos-zram @@ -0,0 +1,66 @@ +#!/bin/sh +# Credits go to: https://github.com/home-assistant/operating-system/ +set -e + +#### Options #### + +TYPE="" +MOUNT="" +DEVICE="" +SIZE=0 + +#### Parse arguments #### + +while [ "$1" != "" ]; do + key=$1 + case $key in + -t|--type) + TYPE=$2 + shift + ;; + -s|--size) + SIZE=$2 + shift + ;; + -m|--mount) + MOUNT=$2 + shift + ;; + *) + echo "[Error] $0 : Argument '$1' unknown" + exit 1 + ;; + esac + shift +done + +# Valide Type +if [ "$TYPE" != "swap" ]; then + echo "[Error] Type unknown!" + exit 1 +fi + +# Lookup device +if [ "$TYPE" = "swap" ]; then + DEVICE="/dev/zram0" +#elif [ "$MOUNT" = "var" ]; then +# DEVICE="/dev/zram1" +#elif [ "$MOUNT" = "tmp" ]; then +# DEVICE="/dev/zram2" +else + echo "[Error] No device for lookup!" + exit 1 +fi + +# Calc 20% of memory for ZRAM swap partition +if [ "$TYPE" = "swap" ] && [ "$SIZE" -eq "0" ]; then + SIZE="$(awk '/MemTotal/{ print $2 * 0.20 }' /proc/meminfo)K" +fi + +# Init device +zramctl "$DEVICE" -s "$SIZE" -a lz4 + +# Swap +if [ "$TYPE" = "swap" ]; then + mkswap -L "ovos-zramswap" "$DEVICE" +fi