some disk types do not contain proper partition tables like on time4vps the type is simfs. On those fdisk fails to access the partition table, thus being unable to determine the size of the volume. df does only return the real usable disk space by the user, thus we lower the 20GB threshold to 18 Fixes #275
51 lines
2.5 KiB
Bash
Executable File
51 lines
2.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -eu -o pipefail
|
|
|
|
readonly USER_HOME="/home/yellowtent"
|
|
readonly APPS_SWAP_FILE="/apps.swap"
|
|
readonly USER_DATA_FILE="/root/user_data.img"
|
|
readonly USER_DATA_DIR="/home/yellowtent/data"
|
|
|
|
# detect device of rootfs (http://forums.fedoraforum.org/showthread.php?t=270316)
|
|
disk_device="$(for d in $(find /dev -type b); do [ "$(mountpoint -d /)" = "$(mountpoint -x $d)" ] && echo $d && break; done)"
|
|
|
|
existing_swap=$(cat /proc/meminfo | grep SwapTotal | awk '{ printf "%.0f", $2/1024 }')
|
|
|
|
# all sizes are in mb
|
|
readonly physical_memory=$(LC_ALL=C free -m | awk '/Mem:/ { print $2 }')
|
|
readonly swap_size=$((${physical_memory} - ${existing_swap})) # if you change this, fix enoughResourcesAvailable() in client.js
|
|
readonly app_count=$((${physical_memory} / 200)) # estimated app count
|
|
readonly disk_size_bytes=$(LC_ALL=C df | grep "${disk_device}" | awk '{ printf $2 }')
|
|
readonly disk_size=$((${disk_size_bytes}/1024))
|
|
readonly system_size=10240 # 10 gigs for system libs, apps images, installer, box code, data and tmp
|
|
readonly ext4_reserved=$((disk_size * 5 / 100)) # this can be changes using tune2fs -m percent /dev/vda1
|
|
|
|
echo "Disk device: ${disk_device}"
|
|
echo "Physical memory: ${physical_memory}"
|
|
echo "Estimated app count: ${app_count}"
|
|
echo "Disk size: ${disk_size}M"
|
|
|
|
# Allocate swap for general app usage
|
|
if [[ ! -f "${APPS_SWAP_FILE}" && ${swap_size} -gt 0 ]]; then
|
|
echo "Creating Apps swap file of size ${swap_size}M"
|
|
fallocate -l "${swap_size}m" "${APPS_SWAP_FILE}"
|
|
chmod 600 "${APPS_SWAP_FILE}"
|
|
mkswap "${APPS_SWAP_FILE}"
|
|
swapon "${APPS_SWAP_FILE}"
|
|
echo "${APPS_SWAP_FILE} none swap sw 0 0" >> /etc/fstab
|
|
else
|
|
echo "Apps Swap file already exists"
|
|
fi
|
|
|
|
# see start.sh for the initial default size of 8gb. On small disks the calculation might be lower than 8gb resulting in a failure to resize here.
|
|
echo "Resizing data volume"
|
|
home_data_size=$((disk_size - system_size - swap_size - ext4_reserved))
|
|
echo "Resizing up btrfs user data to size ${home_data_size}M"
|
|
umount "${USER_DATA_DIR}" || true
|
|
# Do not preallocate (non-sparse). Doing so overallocates for data too much in advance and causes problems when using many apps with smaller data
|
|
# fallocate -l "${home_data_size}m" "${USER_DATA_FILE}" # does not overwrite existing data
|
|
truncate -s "${home_data_size}m" "${USER_DATA_FILE}" # this will shrink it if the file had existed. this is useful when running this script on a live system
|
|
mount -t btrfs -o loop,nosuid "${USER_DATA_FILE}" ${USER_DATA_DIR}
|
|
btrfs filesystem resize max "${USER_DATA_DIR}"
|