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

94 lines
3.3 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.
# If a previous build exists, tears it down and starts fresh.
# 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 ""
# --- Tear down any existing build --------------------------------------------
if mountpoint -q "${LFS}" 2>/dev/null; then
warn "Existing build found at ${LFS} — tearing down..."
umount -l "${LFS}" 2>/dev/null || true
ok "Unmounted ${LFS}"
fi
if [ -f "${LFS_IMAGE}" ]; then
warn "Removing old image: ${LFS_IMAGE}"
rm -f "${LFS_IMAGE}"
ok "Old image removed"
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 -----------------------------------------------
echo ">>> Creating ${LFS_SIZE} image file..."
# 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"
# --- 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 (fresh start)."
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"