ubuntu-22.04.3-desktop-amd64/casper/filesystem/usr/lib/partman/finish.d/25create_swapfile

106 lines
2.4 KiB
Bash
Executable File

#!/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=$(cat /proc/self/mountinfo | grep '/target' | cut -d\ -f8)
fallocatesupport=false
case $rootfstype in
ext4)
fallocatesupport=true
;;
btrfs|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
# Allow partman-auto to override
db_get partman-auto/desired-swap
if [ -n "$RET" ]; then
size=$(($RET * 1024))
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
log-output -t partman-swapfile --pass-stdout fallocate -l ${size}KiB /target/swapfile
else
log-output -t partman-swapfile --pass-stdout dd if=/dev/zero of=/target/swapfile bs=1024 count=$size
fi
chmod 600 /target/swapfile
log-output -t partman-swapfile --pass-stdout mkswap /target/swapfile >/dev/null
sync
enable_swap
return 0