#!/bin/bash # # Archipelago Disk Installer # Installs Archipelago Bitcoin Node OS to a disk # set -e echo "" echo "╔═══════════════════════════════════════════════════════════╗" echo "║ 🏝️ ARCHIPELAGO DISK INSTALLER ║" echo "╚═══════════════════════════════════════════════════════════╝" echo "" # Check if running as root if [ "$EUID" -ne 0 ]; then echo "❌ Please run as root: sudo $0" exit 1 fi # Install required tools if missing echo "📦 Checking required tools..." NEED_INSTALL="" for tool in parted debootstrap; do if ! command -v $tool >/dev/null 2>&1; then NEED_INSTALL="$NEED_INSTALL $tool" fi done if [ -n "$NEED_INSTALL" ]; then echo "📥 Installing required tools:$NEED_INSTALL" apt-get update apt-get install -y $NEED_INSTALL dosfstools e2fsprogs echo "" fi # List available disks echo "📋 Available disks:" echo "" lsblk -d -o NAME,SIZE,MODEL | grep -v loop | grep -v sr echo "" # Get target disk read -p "Enter target disk (e.g., sda, nvme0n1): " TARGET_DISK TARGET_DEVICE="/dev/$TARGET_DISK" if [ ! -b "$TARGET_DEVICE" ]; then echo "❌ Device $TARGET_DEVICE not found" exit 1 fi # Confirm echo "" echo "⚠️ WARNING: This will ERASE ALL DATA on $TARGET_DEVICE" echo "" read -p "Type 'yes' to continue: " CONFIRM if [ "$CONFIRM" != "yes" ]; then echo "Aborted." exit 1 fi echo "" echo "🔧 Partitioning $TARGET_DEVICE..." # Unmount any existing partitions umount ${TARGET_DEVICE}* 2>/dev/null || true # Create GPT partition table parted -s "$TARGET_DEVICE" mklabel gpt # Create partitions: # 1. EFI System Partition (512MB) # 2. Root partition (remaining space) parted -s "$TARGET_DEVICE" mkpart primary fat32 1MiB 513MiB parted -s "$TARGET_DEVICE" set 1 esp on parted -s "$TARGET_DEVICE" mkpart primary ext4 513MiB 100% # Wait for partitions to appear sleep 2 # Determine partition names (handle both /dev/sdX and /dev/nvmeXnYpZ naming) if [[ "$TARGET_DISK" == nvme* ]]; then EFI_PART="${TARGET_DEVICE}p1" ROOT_PART="${TARGET_DEVICE}p2" else EFI_PART="${TARGET_DEVICE}1" ROOT_PART="${TARGET_DEVICE}2" fi echo "🗂️ Formatting partitions..." # Format EFI partition mkfs.vfat -F32 -n ARCHIPELAGO "$EFI_PART" # Format root partition mkfs.ext4 -L archipelago-root "$ROOT_PART" echo "📦 Mounting partitions..." # Create mount points mkdir -p /mnt/archipelago mount "$ROOT_PART" /mnt/archipelago mkdir -p /mnt/archipelago/boot/efi mount "$EFI_PART" /mnt/archipelago/boot/efi echo "📋 Installing base system..." # Install base system using debootstrap if command -v debootstrap >/dev/null 2>&1; then debootstrap --arch=amd64 bookworm /mnt/archipelago http://deb.debian.org/debian else echo "❌ debootstrap not found. Installing..." apt-get update && apt-get install -y debootstrap debootstrap --arch=amd64 bookworm /mnt/archipelago http://deb.debian.org/debian fi echo "⚙️ Configuring system..." # Mount virtual filesystems mount --bind /dev /mnt/archipelago/dev mount --bind /proc /mnt/archipelago/proc mount --bind /sys /mnt/archipelago/sys # Create fstab cat > /mnt/archipelago/etc/fstab < /mnt/archipelago/etc/hostname # Configure hosts cat > /mnt/archipelago/etc/hosts < /etc/apt/sources.list </dev/null || true # Install binaries if [ -d "$BOOT_MEDIA/archipelago/bin" ]; then cp "$BOOT_MEDIA/archipelago/bin/"* /mnt/archipelago/usr/local/bin/ 2>/dev/null || true chmod +x /mnt/archipelago/usr/local/bin/* 2>/dev/null || true fi # Install scripts if [ -d "$BOOT_MEDIA/archipelago/scripts" ]; then mkdir -p /mnt/archipelago/opt/archipelago/scripts cp "$BOOT_MEDIA/archipelago/scripts/"* /mnt/archipelago/opt/archipelago/scripts/ 2>/dev/null || true chmod +x /mnt/archipelago/opt/archipelago/scripts/*.sh 2>/dev/null || true fi # Install app manifests if [ -d "$BOOT_MEDIA/archipelago/apps" ]; then mkdir -p /mnt/archipelago/etc/archipelago cp -r "$BOOT_MEDIA/archipelago/apps" /mnt/archipelago/etc/archipelago/ fi # Create profile.d script for auto-menu on login mkdir -p /mnt/archipelago/etc/profile.d cat > /mnt/archipelago/etc/profile.d/archipelago.sh <<'PROFILE_EOF' #!/bin/bash # Archipelago welcome message if [ -t 0 ] && [ -z "$ARCHIPELAGO_WELCOMED" ]; then export ARCHIPELAGO_WELCOMED=1 IP=$(hostname -I 2>/dev/null | awk '{print $1}') echo "" echo " 🏝️ Welcome to Archipelago Bitcoin Node OS" echo "" if [ -n "$IP" ]; then echo " Web UI: http://$IP" fi echo " Menu: Type 'archipelago' to open setup menu" echo "" fi PROFILE_EOF chmod +x /mnt/archipelago/etc/profile.d/archipelago.sh fi echo "🧹 Cleaning up..." # Unmount umount /mnt/archipelago/dev umount /mnt/archipelago/proc umount /mnt/archipelago/sys umount /mnt/archipelago/boot/efi umount /mnt/archipelago echo "" echo "╔═══════════════════════════════════════════════════════════╗" echo "║ ✅ INSTALLATION COMPLETE! ║" echo "╚═══════════════════════════════════════════════════════════╝" echo "" echo "Remove the USB drive and reboot to start Archipelago." echo "" echo "Default login:" echo " Username: archipelago" echo " Password: archipelago" echo "" echo "⚠️ Please change the password after first login!" echo ""