#!/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"