particle-os/02-installer-bootc-tui/scripts/install.sh
2025-08-07 01:04:22 -07:00

276 lines
No EOL
6.7 KiB
Bash
Executable file

#!/bin/bash
# Debian Atomic Terminal Installer
# Automated installation script for Debian Atomic
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuration
TARGET_DEVICE="/dev/sda"
ROOT_PARTITION="/dev/sda1"
BOOT_PARTITION="/dev/sda2"
SWAP_PARTITION="/dev/sda3"
USERNAME="debian"
HOSTNAME="debian-atomic"
TIMEZONE="UTC"
# Logging
LOG_FILE="/tmp/install.log"
exec > >(tee -a "$LOG_FILE") 2>&1
log() {
echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1"
}
warn() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
error() {
echo -e "${RED}[ERROR]${NC} $1"
exit 1
}
# Check if running as root
check_root() {
if [[ $EUID -ne 0 ]]; then
error "This script must be run as root"
fi
}
# Check if we're in a live environment
check_live_environment() {
if ! mountpoint -q /run/archiso/bootmnt 2>/dev/null && ! grep -q "boot=live" /proc/cmdline; then
warn "This doesn't appear to be a live environment. Proceed anyway? (y/N)"
read -r response
if [[ ! "$response" =~ ^[Yy]$ ]]; then
error "Installation aborted"
fi
fi
}
# Detect target device
detect_target_device() {
log "Detecting target device..."
# List available block devices
echo "Available block devices:"
lsblk -d -o NAME,SIZE,TYPE
# Try to auto-detect the target device
if [[ "$TARGET_DEVICE" == "/dev/sda" ]]; then
# Look for the largest non-removable disk
local largest_disk=""
local largest_size=0
for disk in /dev/sd* /dev/vd* /dev/nvme*; do
if [[ -b "$disk" ]]; then
local size=$(lsblk -d -n -o SIZE "$disk" | sed 's/[^0-9]//g')
if [[ "$size" -gt "$largest_size" ]]; then
largest_size="$size"
largest_disk="$disk"
fi
fi
done
if [[ -n "$largest_disk" ]]; then
TARGET_DEVICE="$largest_disk"
log "Auto-detected target device: $TARGET_DEVICE"
fi
fi
echo "Target device: $TARGET_DEVICE"
echo "Proceed with installation? (y/N)"
read -r response
if [[ ! "$response" =~ ^[Yy]$ ]]; then
error "Installation aborted"
fi
}
# Partition the target device
partition_device() {
log "Partitioning target device: $TARGET_DEVICE"
# Create partition table
parted "$TARGET_DEVICE" mklabel gpt
# Create partitions
# Boot partition (512MB)
parted "$TARGET_DEVICE" mkpart primary fat32 1MiB 513MiB
parted "$TARGET_DEVICE" set 1 boot on
# Root partition (rest of disk minus 8GB for swap)
local total_size=$(parted "$TARGET_DEVICE" unit MiB print | grep "Disk $TARGET_DEVICE" | awk '{print $3}' | sed 's/MiB//')
local root_end=$((total_size - 8192))
parted "$TARGET_DEVICE" mkpart primary ext4 513MiB ${root_end}MiB
# Swap partition (8GB)
parted "$TARGET_DEVICE" mkpart primary linux-swap ${root_end}MiB 100%
# Update partition variables
ROOT_PARTITION="${TARGET_DEVICE}2"
BOOT_PARTITION="${TARGET_DEVICE}1"
SWAP_PARTITION="${TARGET_DEVICE}3"
log "Partitioning complete"
}
# Format partitions
format_partitions() {
log "Formatting partitions..."
# Format boot partition
mkfs.fat -F32 "$BOOT_PARTITION"
# Format root partition
mkfs.ext4 "$ROOT_PARTITION"
# Format swap partition
mkswap "$SWAP_PARTITION"
log "Partition formatting complete"
}
# Mount target filesystem
mount_target() {
log "Mounting target filesystem..."
# Create mount point
mkdir -p /mnt/target
# Mount root partition
mount "$ROOT_PARTITION" /mnt/target
# Create and mount boot directory
mkdir -p /mnt/target/boot
mount "$BOOT_PARTITION" /mnt/target/boot
# Mount necessary filesystems
mount --bind /dev /mnt/target/dev
mount --bind /proc /mnt/target/proc
mount --bind /sys /mnt/target/sys
mount --bind /run /mnt/target/run
log "Target filesystem mounted"
}
# Install base system
install_base_system() {
log "Installing base system..."
# Use debootstrap to install base system
debootstrap --arch=amd64 --variant=minbase bookworm /mnt/target http://deb.debian.org/debian/
# Configure apt sources
cat > /mnt/target/etc/apt/sources.list << EOF
deb http://deb.debian.org/debian bookworm main
deb http://deb.debian.org/debian bookworm-updates main
deb http://security.debian.org/debian-security bookworm-security main
EOF
# Configure hostname
echo "$HOSTNAME" > /mnt/target/etc/hostname
# Configure timezone
ln -sf /usr/share/zoneinfo/$TIMEZONE /mnt/target/etc/localtime
log "Base system installation complete"
}
# Install bootc and configure boot
install_bootc() {
log "Installing bootc..."
# Chroot into target and install bootc
chroot /mnt/target bash -c "
apt-get update
apt-get install -y bootc
bootc install-to-disk --target /dev/sda
"
log "Bootc installation complete"
}
# Create user account
create_user() {
log "Creating user account: $USERNAME"
chroot /mnt/target bash -c "
useradd -m -s /bin/bash $USERNAME
echo '$USERNAME ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/$USERNAME
chmod 0440 /etc/sudoers.d/$USERNAME
"
log "User account created"
}
# Configure network
configure_network() {
log "Configuring network..."
# Enable systemd-networkd
chroot /mnt/target bash -c "
systemctl enable systemd-networkd
systemctl enable systemd-resolved
"
# Create basic network configuration
cat > /mnt/target/etc/systemd/network/20-wired.network << EOF
[Match]
Name=en*
[Network]
DHCP=yes
EOF
log "Network configuration complete"
}
# Finalize installation
finalize_installation() {
log "Finalizing installation..."
# Generate initramfs
chroot /mnt/target bash -c "
update-initramfs -u -k all
"
# Unmount filesystems
umount /mnt/target/run
umount /mnt/target/sys
umount /mnt/target/proc
umount /mnt/target/dev
umount /mnt/target/boot
umount /mnt/target
log "Installation complete!"
log "You can now reboot to boot into your new Debian Atomic system."
}
# Main installation function
main() {
log "Starting Debian Atomic Terminal Installer"
check_root
check_live_environment
detect_target_device
partition_device
format_partitions
mount_target
install_base_system
install_bootc
create_user
configure_network
finalize_installation
log "Installation completed successfully!"
}
# Run main function
main "$@"