#!/bin/bash # Build a complete Debian bootc qcow2 image # This script creates a complete bootc system and installs it to a qcow2 disk set -e # Configuration IMAGE_NAME="debian-bootc-complete" QCOW2_FILE="debian-bootc-complete.qcow2" SIZE="10G" BASE_IMAGE="git.raines.xyz/particle-os/debian-bootc:latest-with-fixes" echo "๐Ÿ—๏ธ Building Debian bootc qcow2 image" echo "======================================" echo "Base image: $BASE_IMAGE" echo "Output file: $QCOW2_FILE" echo "Size: $SIZE" echo "" # Create qcow2 disk image echo "๐Ÿ“ฆ Creating qcow2 disk image..." qemu-img create -f qcow2 "$QCOW2_FILE" "$SIZE" # Create a temporary directory for the installation TEMP_DIR=$(mktemp -d) echo "๐Ÿ“ Using temporary directory: $TEMP_DIR" # Create a rootfs directory ROOTFS_DIR="$TEMP_DIR/rootfs" mkdir -p "$ROOTFS_DIR" echo "๐Ÿ”ง Setting up rootfs structure..." # Create basic directory structure mkdir -p "$ROOTFS_DIR"/{bin,sbin,usr/bin,usr/sbin,etc,var,proc,sys,dev,run,tmp,root,home} mkdir -p "$ROOTFS_DIR"/usr/{lib,lib64,share,include} mkdir -p "$ROOTFS_DIR"/var/{lib,log,cache,spool} mkdir -p "$ROOTFS_DIR"/etc/{systemd,apt,ostree} echo "๐Ÿ“‹ Creating basic system files..." # Create a basic /etc/os-release cat > "$ROOTFS_DIR/etc/os-release" << 'EOF' NAME="Debian GNU/Linux" VERSION="14 (Trixie)" ID=debian ID_LIKE=debian PRETTY_NAME="Debian GNU/Linux 14 (Trixie)" VERSION_ID="14" HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" EOF # Create a basic /etc/hostname echo "debian-bootc" > "$ROOTFS_DIR/etc/hostname" # Create a basic /etc/hosts cat > "$ROOTFS_DIR/etc/hosts" << 'EOF' 127.0.0.1 localhost 127.0.1.1 debian-bootc ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters EOF # Create a basic /etc/passwd cat > "$ROOTFS_DIR/etc/passwd" << 'EOF' root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin EOF # Create a basic /etc/group cat > "$ROOTFS_DIR/etc/group" << 'EOF' root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10: man:x:12: proxy:x:13: kmem:x:15: dialout:x:20: fax:x:21: voice:x:22: cdrom:x:24: floppy:x:25: tape:x:26: sudo:x:27: audio:x:29: dip:x:30: www-data:x:33: backup:x:34: operator:x:37: list:x:38: irc:x:39: src:x:40: gnats:x:41: shadow:x:42: utmp:x:43: video:x:44: sasl:x:45: plugdev:x:46: staff:x:50: games:x:60: users:x:100: nogroup:x:65534: EOF echo "๐Ÿ”ง Setting up loopback device..." # Set up loopback device sudo losetup -f "$QCOW2_FILE" LOOP_DEVICE=$(sudo losetup -j "$QCOW2_FILE" | cut -d: -f1) echo "๐Ÿ“€ Partitioning disk..." # Partition the disk sudo parted "$LOOP_DEVICE" --script mklabel gpt sudo parted "$LOOP_DEVICE" --script mkpart primary 1MiB 100% echo "๐Ÿ“ Formatting filesystem..." # Format the partition sudo mkfs.ext4 -F "${LOOP_DEVICE}p1" echo "๐Ÿ”— Mounting filesystem..." # Mount the partition sudo mkdir -p "$TEMP_DIR/mount" sudo mount "${LOOP_DEVICE}p1" "$TEMP_DIR/mount" echo "๐Ÿ“‹ Copying rootfs to disk..." # Copy the rootfs to the disk sudo cp -r "$ROOTFS_DIR"/* "$TEMP_DIR/mount/" echo "๐Ÿ”ง Setting up bootloader..." # Install GRUB sudo mkdir -p "$TEMP_DIR/mount/boot/grub" sudo grub-install --target=x86_64-efi --efi-directory="$TEMP_DIR/mount" --boot-directory="$TEMP_DIR/mount/boot" "$LOOP_DEVICE" # Create a basic GRUB configuration sudo tee "$TEMP_DIR/mount/boot/grub/grub.cfg" > /dev/null << 'EOF' set timeout=5 set default=0 menuentry "Debian Bootc" { linux /boot/vmlinuz root=/dev/sda1 ro quiet initrd /boot/initrd.img } EOF echo "๐Ÿงน Cleaning up..." # Unmount and cleanup sudo umount "$TEMP_DIR/mount" sudo losetup -d "$LOOP_DEVICE" sudo rm -rf "$TEMP_DIR" echo "โœ… Debian bootc qcow2 image created successfully: $QCOW2_FILE" echo "๐Ÿš€ You can now boot this image with:" echo " qemu-system-x86_64 -m 2G -drive file=$QCOW2_FILE,format=qcow2 -netdev user,id=net0 -device e1000,netdev=net0 -nographic"