#!/bin/bash set -euo pipefail # Simple script to build a bootable Debian qcow2 image # This creates a working Debian system that can be used as a base for bootc QCOW2_IMAGE="./output/debian-bootc.qcow2" ROOTFS_DIR="./output/rootfs" SIZE="20G" echo "Building bootable Debian qcow2 image..." # Clean up any existing work sudo umount "$ROOTFS_DIR" 2>/dev/null || true sudo losetup -d /dev/loop0 2>/dev/null || true rm -rf "$ROOTFS_DIR" # Create rootfs directory mkdir -p "$ROOTFS_DIR" # Create qcow2 image echo "Creating qcow2 image ($SIZE)..." qemu-img create -f qcow2 "$QCOW2_IMAGE" "$SIZE" # Create a raw disk image first, then convert to qcow2 RAW_IMAGE="./output/debian-bootc.raw" echo "Creating raw disk image..." qemu-img create -f raw "$RAW_IMAGE" "$SIZE" # Set up loop device for raw image echo "Setting up loop device..." sudo losetup -fP "$RAW_IMAGE" LOOP_DEVICE=$(sudo losetup -j "$RAW_IMAGE" | cut -d: -f1) echo "Using loop device: $LOOP_DEVICE" # Wait a moment for the loop device to be ready sleep 2 # Create partition table and partition echo "Creating partition table..." sudo parted "$LOOP_DEVICE" mklabel gpt sudo parted "$LOOP_DEVICE" mkpart primary ext4 1MiB 100% sudo parted "$LOOP_DEVICE" set 1 esp on # Refresh partition table sudo partprobe "$LOOP_DEVICE" sleep 2 # Format the partition echo "Formatting partition..." sudo mkfs.ext4 -F "${LOOP_DEVICE}p1" # Mount the partition echo "Mounting partition..." sudo mount "${LOOP_DEVICE}p1" "$ROOTFS_DIR" # Install Debian base system echo "Installing Debian base system (this may take a while)..." sudo debootstrap --arch=amd64 trixie "$ROOTFS_DIR" http://deb.debian.org/debian # Configure apt sources echo "Configuring apt sources..." sudo tee "$ROOTFS_DIR/etc/apt/sources.list" > /dev/null << 'EOF' deb http://deb.debian.org/debian trixie main deb http://deb.debian.org/debian trixie-updates main deb http://security.debian.org/debian-security trixie-security main EOF # Install essential packages echo "Installing essential packages..." sudo chroot "$ROOTFS_DIR" apt-get update sudo chroot "$ROOTFS_DIR" apt-get install -y \ linux-image-amd64 \ grub-efi-amd64 \ grub-pc-bin \ systemd \ openssh-server \ curl \ wget \ vim \ nano \ sudo \ network-manager \ cloud-init \ qemu-guest-agent # Configure the system echo "Configuring system..." # Set root password echo "Setting root password..." echo "root:debian" | sudo chroot "$ROOTFS_DIR" chpasswd # Create a user echo "Creating user 'debian'..." sudo chroot "$ROOTFS_DIR" useradd -m -s /bin/bash debian echo "debian:debian" | sudo chroot "$ROOTFS_DIR" chpasswd sudo chroot "$ROOTFS_DIR" usermod -aG sudo debian # Enable services echo "Enabling services..." sudo chroot "$ROOTFS_DIR" systemctl enable ssh sudo chroot "$ROOTFS_DIR" systemctl enable NetworkManager sudo chroot "$ROOTFS_DIR" systemctl enable qemu-guest-agent # Configure network echo "Configuring network..." sudo tee "$ROOTFS_DIR/etc/netplan/01-netcfg.yaml" > /dev/null << 'EOF' network: version: 2 renderer: NetworkManager ethernets: eth0: dhcp4: true EOF # Configure SSH echo "Configuring SSH..." sudo tee "$ROOTFS_DIR/etc/ssh/sshd_config.d/99-custom.conf" > /dev/null << 'EOF' PasswordAuthentication yes PermitRootLogin yes EOF # Install GRUB echo "Installing GRUB..." sudo chroot "$ROOTFS_DIR" grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian sudo chroot "$ROOTFS_DIR" grub-install --target=i386-pc "$LOOP_DEVICE" sudo chroot "$ROOTFS_DIR" update-grub # Create fstab echo "Creating fstab..." ROOT_UUID=$(sudo blkid -s UUID -o value "${LOOP_DEVICE}p1") sudo tee "$ROOTFS_DIR/etc/fstab" > /dev/null << EOF # /etc/fstab: static file system information. UUID=$ROOT_UUID / ext4 defaults 0 1 EOF # Set hostname echo "Setting hostname..." echo "debian-bootc" | sudo tee "$ROOTFS_DIR/etc/hostname" > /dev/null # Configure timezone echo "Configuring timezone..." sudo chroot "$ROOTFS_DIR" timedatectl set-timezone UTC # Clean up echo "Cleaning up..." sudo chroot "$ROOTFS_DIR" apt-get clean sudo chroot "$ROOTFS_DIR" apt-get autoremove -y # Unmount and cleanup echo "Unmounting and cleaning up..." sudo umount "$ROOTFS_DIR" sudo losetup -d "$LOOP_DEVICE" # Convert raw to qcow2 echo "Converting to qcow2..." qemu-img convert -f raw -O qcow2 "$RAW_IMAGE" "$QCOW2_IMAGE" rm -f "$RAW_IMAGE" echo "" echo "✅ Debian qcow2 image created successfully!" echo "📁 Image: $QCOW2_IMAGE" echo "🔑 Login: root/debian or debian/debian" echo "🌐 SSH: ssh root@ or ssh debian@" echo "" echo "To boot the image:" echo "qemu-system-x86_64 -m 2G -drive file=$QCOW2_IMAGE,format=qcow2 -netdev user,id=net0 -device e1000,netdev=net0"