#!/bin/sh . /lib/partman/lib/base.sh swap_partition () { local swaps dev num id size type fs path name method local startdir="$(pwd)" swaps='' for dev in $DEVICES/*; do [ -d $dev ] || continue cd $dev open_dialog PARTITIONS while { read_line num id size type fs path name; [ "$id" ]; }; do [ $fs != free ] || continue [ -f "$id/method" ] || continue method=$(cat $id/method) if [ "$method" = swap ]; then swaps="$swaps $path" fi done close_dialog done if [ -n "$swaps" ]; then return 0 else return 1 fi } enable_swap () { # do swapon only when we will be able to swapoff afterwards [ -f /proc/swaps ] || return 0 if ! grep -q "^$(readlink -f /target/swapfile) " /proc/swaps; then swapon /target/swapfile 2>/dev/null || true fi } # Check target filesystem, might not support swapfiles... # Also check if fallocate can be used rootfstype=$(df -T /target | grep /target | awk '{print $2}') fallocatesupport=false case $rootfstype in ext4|btrfs) fallocatesupport=true ;; zfs) # No support for swapfiles return 0 ;; esac # No need for swapfile, if a swap partition is created/available if swap_partition; then return 0 fi # No new swapfile... if there is one already, e.g. reuse/reinstall recipes if [ -f /target/swapfile ]; then enable_swap return 0 fi db_get partman-swapfile/size max_size=$RET db_get partman-swapfile/percentage max_percent=$RET # Get available space available=$(busybox df -P /target/ | sed 1d | while read fs size used available usep mounted on; do echo $available done) # 5% or cap limit size=$((available/100)) size=$((size*$max_percent)) limit=$((1024*$max_size)) if [ $size -gt $limit ] then size=$limit fi # No swapfile if limits are 0MB or 0% if [ $size = 0 ] then return 0 fi if type fallocate >/dev/null 2>&1 && $fallocatesupport; then case $rootfstype in btrfs) log-output -t partman-swapfile --pass-stdout truncate -s 0 /target/swap/swapfile log-output -t partman-swapfile --pass-stdout fallocate -l ${size}KiB /target/swap/swapfile chmod 600 /target/swap/swapfile log-output -t partman-swapfile --pass-stdout mkswap /target/swap/swapfile >/dev/null sync enable_swap ;; ext4) log-output -t partman-swapfile --pass-stdout fallocate -l ${size}KiB /target/swapfile chmod 600 /target/swapfile log-output -t partman-swapfile --pass-stdout mkswap /target/swapfile >/dev/null sync enable_swap ;; *) log-output -t partman-swapfile --pass-stdout dd if=/dev/zero of=/target/swapfile bs=1024 count=$size chmod 600 /target/swapfile log-output -t partman-swapfile --pass-stdout mkswap /target/swapfile >/dev/null sync enable_swap ;; esac fi return 0