eliphas

Script autoconfig zram swap

Aug 20th, 2025 (edited)
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 2.19 KB | Software | 0 0
  1. #!/bin/bash
  2. # vim:ts=4:sw=4:et
  3. NRDEVICES=$(grep -w ^processor /proc/cpuinfo | wc -l) # Creates a zram swap for each processor
  4. MEMSIZE_KB=$(sed -n '/^MemTotal:/s/.*\<\([[:digit:]]\+\)\>.*/\1/p' /proc/meminfo) # Detect total RAM
  5. SWAPSIZE_B=$(((MEMSIZE_KB / ${NRDEVICES}) * 1024 / 2)) # Max memory to use for zram is half of real RAM
  6. ALGO=zstd # lzo lzo-rle lz4 lz4hc 842 [zstd] # Default compression algorithm
  7.  
  8. set -o errexit -o nounset -o pipefail
  9. trap -- 'errno=$? ; echo "error ${errno} on line ${LINENO}" >&2 ; exit ${errno}' ERR
  10. [ "$(id -u)" == "0" ] || exec sudo /bin/bash -e "${BASH_SOURCE[0]}" "$@" # Use sudo superpowers
  11.  
  12. if test "${1:-}" = "start" ; then
  13.     if grep -qw 'zram[0-9]\+' /proc/swaps; then
  14.         echo "ERROR: There is already zRAM swaps configured. Exiting." >&2
  15.         exit 1
  16.     fi
  17.  
  18.     if ! test -f /etc/sysctl.d/99-vm-zram-parameters.conf ; then
  19.         echo "INFO: Adding sysctl parameters for tuning swappiness" >&2
  20.         echo "vm.swappiness = 180
  21.              vm.watermark_boost_factor = 0
  22.              vm.watermark_scale_factor = 125
  23.              vm.page-cluster = 0" | \
  24.                 sed 's/^[[:blank:]]*//' > /etc/sysctl.d/99-vm-zram-parameters.conf
  25.         sysctl -p /etc/sysctl.d/99-vm-zram-parameters.conf
  26.     fi
  27.  
  28.     echo "INFO: Total mem: $((MEMSIZE_KB/1024)) MiB - Adding ${NRDEVICES} zRAM swap devices with $((SWAPSIZE_B/1024/1024)) MiB each." >&2
  29.     if ! modprobe zram num_devices=${NRDEVICES} ; then
  30.         echo "You do not appear to have the zram kernel module installed. Maybe: apt install linux-modules-extra-\$(uname -r)" >&2
  31.         exit 2
  32.     fi
  33.     for DEVNUMBER in $(grep -w ^processor /proc/cpuinfo | awk '{print $3}'); do
  34.         echo "${ALGO}" >"/sys/block/zram${DEVNUMBER}/comp_algorithm"
  35.         echo "${SWAPSIZE_B}" >"/sys/block/zram${DEVNUMBER}/disksize"
  36.         mkswap -L "zram${DEVNUMBER}" "/dev/zram${DEVNUMBER}"
  37.         swapon -p 5 "/dev/zram${DEVNUMBER}"
  38.     done
  39.  
  40. elif test "${1:-}" = "stop" ; then
  41.     DEVNAMES=$(grep -w --only-matching '^/dev/zram[0-9]\+' /proc/swaps || true)
  42.     for DEVNAME in ${DEVNAMES} ; do swapoff "${DEVNAME}" ; done
  43.     rmmod zram
  44.  
  45. else
  46.     echo "Usage: $0 [start|stop]" >&2
  47.     exit 1
  48. fi
  49. # EOF
Tags: swap zram
Advertisement
Add Comment
Please, Sign In to add comment