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