mirror of
https://github.com/agresdominik/download-ram.git
synced 2026-07-21 16:10:55 +00:00
Download more RAM script
This commit is contained in:
Executable
+149
@@ -0,0 +1,149 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
download_ram() {
|
||||
|
||||
local requested_size="$1"
|
||||
|
||||
echo "Downloading $requested_size GiB of RAM"
|
||||
|
||||
local total_needed=$(( requested_size + 4 ))
|
||||
|
||||
if check_root_space "$total_needed"; then
|
||||
echo ""
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if actually_download_the_ram "$requested_size"; then
|
||||
echo "Done, run (sudo) swapon --show to see your new RAM"
|
||||
else
|
||||
echo "Failed"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
actually_download_the_ram() {
|
||||
|
||||
local size_gb="$1"
|
||||
local dir="/var/swap"
|
||||
|
||||
# Create directory to save swapfiles
|
||||
mkdir -p "$dir" || {
|
||||
echo "Failed to create $dir" >&2; return 1;
|
||||
}
|
||||
|
||||
# Find the next available swapfile name
|
||||
local i=0
|
||||
local swapfile
|
||||
while :; do
|
||||
swapfile="$dir/swapfile$i"
|
||||
[ -e "$swapfile" ] || break
|
||||
i=$((i + 1))
|
||||
done
|
||||
|
||||
echo "Downloading $swapfile (${size_gb}G) of RAM"
|
||||
|
||||
# Use fallocate (or dd in case no fallocate is installed) to create swapfile
|
||||
if ! fallocate -l "${size_gb}G" "$swapfile" 2>/dev/null; then
|
||||
echo "fallocate failed, falling back to dd (this may take a while)..."
|
||||
if ! dd if=/dev/zero of="$swapfile" bs=1G count="$size_gb" status=progress; then
|
||||
echo "fallocate/dd failed in creating swapfile" >&2
|
||||
rm -f "$swapfile"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Set file to read and write
|
||||
chmod 600 "$swapfile" || {
|
||||
echo "chmod failed" >&2;
|
||||
rm -f "$swapfile"; return 1;
|
||||
}
|
||||
|
||||
# Turn the file to swap type
|
||||
if ! mkswap "$swapfile"; then
|
||||
echo "mkswap failed" >&2
|
||||
rm -f "$swapfile"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Run swapon to enable swap
|
||||
if ! swapon "$swapfile"; then
|
||||
echo "swapon failed" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Check if swap is running and write into fstab file
|
||||
if swapon --show | awk 'NR>1 {print $1}' | grep -qx "$swapfile"; then
|
||||
echo "Successfully 'downloaded' ${size_gb}G of RAM into: $swapfile"
|
||||
if ! grep -q -E "^[[:space:]]*${swapfile}[[:space:]]" /etc/fstab; then
|
||||
printf "%s\n" "${swapfile} none swap defaults 0 0" >> /etc/fstab
|
||||
else
|
||||
echo "Entry for $swapfile already exists in /etc/fstab, not adding duplicate"
|
||||
fi
|
||||
return 0
|
||||
else
|
||||
echo "Swapfile created but not active. Check 'swapon --show'" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
check_root_space() {
|
||||
|
||||
local need_gib=$1
|
||||
local free_gib
|
||||
|
||||
free_gib=$(df -B1G --output=avail / | tail -n1 | tr -d ' ')
|
||||
|
||||
if (( free_gib >= need_gib )); then
|
||||
return 0
|
||||
else
|
||||
echo "Your system does not have enough space to download the RAM"
|
||||
echo "Need at least ${need_gib}GiB free, but only ${free_gib}GiB is available." >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
# -- Start of Script --
|
||||
|
||||
# Check if ran as sudo
|
||||
if [[ "$EUID" -ne 0 ]]; then
|
||||
echo "This script must be run as root (try: sudo $0)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if system is mounted on a ext4 filesystem
|
||||
fs_type=$(findmnt -no FSTYPE / 2>/dev/null)
|
||||
if [[ "$fs_type" != "ext4" ]]; then
|
||||
echo "Error: /var is on '$fs_type'. This script only supports systems mounted on ext4." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Message + handle input
|
||||
echo "Please select how much RAM you want to download:"
|
||||
echo "1) 4GiB of RAM"
|
||||
echo "2) 8GiB of RAM"
|
||||
echo "3) 16GiB of RAM"
|
||||
echo "Plese note you need at least the chosen amount of space on your drive + 4GiB"
|
||||
echo ""
|
||||
|
||||
read -r -p "Enter your choice (1-3): " choice
|
||||
|
||||
case "$choice" in
|
||||
1)
|
||||
value=4
|
||||
;;
|
||||
2)
|
||||
value=8
|
||||
;;
|
||||
3)
|
||||
value=16
|
||||
;;
|
||||
*)
|
||||
echo "Invalid choice."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
download_ram "$value"
|
||||
Reference in New Issue
Block a user