Files
darkforge/toolchain/scripts/000-setup-disk.sh
2026-03-20 11:21:20 +01:00

98 lines
3.4 KiB
Bash
Executable File

#!/bin/bash
# ============================================================================
# DarkForge Linux — Phase 0: Create LFS Build Partition (Loopback)
# ============================================================================
# Purpose: Create a loopback ext4 filesystem for the LFS build environment.
# This avoids repartitioning and uses free space on your root drive.
# The loopback file acts exactly like a real partition.
# Inputs: None (uses defaults below, override via environment)
# Outputs: 50GB ext4 filesystem mounted at /mnt/darkforge
# Assumes: Running as root, ~50GB free on root filesystem
# ============================================================================
set -euo pipefail
# --- Configuration -----------------------------------------------------------
LFS="${LFS:-/mnt/darkforge}"
LFS_IMAGE="${LFS_IMAGE:-/opt/darkforge.img}"
LFS_SIZE="${LFS_SIZE:-50G}"
# Color output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
ok() { echo -e "${GREEN}>>> $*${NC}"; }
warn() { echo -e "${YELLOW}>>> $*${NC}"; }
fail() { echo -e "${RED}>>> $*${NC}"; exit 1; }
# --- Verify running as root --------------------------------------------------
[ "$(id -u)" -eq 0 ] || fail "This script must be run as root."
echo "============================================================"
echo " DarkForge Linux — LFS Build Partition Setup"
echo "============================================================"
echo ""
echo " Image file: ${LFS_IMAGE}"
echo " Image size: ${LFS_SIZE}"
echo " Mount point: ${LFS}"
echo ""
# --- Check if already mounted ------------------------------------------------
if mountpoint -q "${LFS}" 2>/dev/null; then
ok "${LFS} is already mounted:"
df -h "${LFS}"
echo ""
echo "To start over: umount ${LFS} && rm ${LFS_IMAGE}"
exit 0
fi
# --- Check free space ---------------------------------------------------------
AVAIL_KB=$(df --output=avail / | tail -1 | tr -d ' ')
AVAIL_GB=$((AVAIL_KB / 1024 / 1024))
NEED_GB=$(echo "${LFS_SIZE}" | sed 's/G//')
if [ "${AVAIL_GB}" -lt "${NEED_GB}" ]; then
fail "Not enough free space: ${AVAIL_GB}GB available, need ${NEED_GB}GB"
fi
ok "Free space check: ${AVAIL_GB}GB available, need ${NEED_GB}GB"
# --- Create the loopback image -----------------------------------------------
if [ -f "${LFS_IMAGE}" ]; then
warn "Image file already exists: ${LFS_IMAGE}"
echo " Reusing existing image."
else
echo ">>> Creating ${LFS_SIZE} image file (this takes a moment)..."
# Use fallocate for instant allocation (no slow dd)
fallocate -l "${LFS_SIZE}" "${LFS_IMAGE}" || {
warn "fallocate failed, falling back to truncate..."
truncate -s "${LFS_SIZE}" "${LFS_IMAGE}"
}
ok "Image created: ${LFS_IMAGE}"
echo ">>> Formatting as ext4..."
mkfs.ext4 -q -L darkforge "${LFS_IMAGE}"
ok "Formatted as ext4"
fi
# --- Mount it -----------------------------------------------------------------
mkdir -p "${LFS}"
mount -o loop "${LFS_IMAGE}" "${LFS}"
ok "Mounted ${LFS_IMAGE} at ${LFS}"
echo ""
df -h "${LFS}"
echo ""
ok "LFS build partition is ready."
echo ""
echo "Next steps:"
echo " export LFS=${LFS}"
echo " bash toolchain/scripts/000-env-setup.sh"
echo ""
echo "To remount after reboot:"
echo " sudo mount -o loop ${LFS_IMAGE} ${LFS}"
echo ""
echo "To add to /etc/fstab (auto-mount on boot):"
echo " ${LFS_IMAGE} ${LFS} ext4 loop 0 0"