#!/bin/bash # Chroot-based OSTree creation module for bootc image creation # This module implements the debian-ostree-builder approach using chroot # Common functions are sourced by the main script # Create chroot environment create_chroot_environment() { log_info "Creating chroot environment..." # Create chroot directory local chroot_dir="$WORK_DIR/chroot" mkdir -p "$chroot_dir" # Install debootstrap if not available if ! command -v debootstrap >/dev/null 2>&1; then log_info "Installing debootstrap..." sudo apt update sudo apt install -y debootstrap fi # Create base Debian system log_info "Creating base Debian system with debootstrap..." sudo debootstrap --arch=amd64 --variant=minbase "$TARGET_DEBIAN_RELEASE" "$chroot_dir" http://deb.debian.org/debian/ # Mount necessary filesystems log_info "Mounting necessary filesystems..." sudo mount --bind /dev "$chroot_dir/dev" sudo mount --bind /proc "$chroot_dir/proc" sudo mount --bind /sys "$chroot_dir/sys" sudo mount --bind /dev/pts "$chroot_dir/dev/pts" log_info "Chroot environment created at: $chroot_dir" } # Install packages in chroot install_chroot_packages() { log_info "Installing packages in chroot..." local chroot_dir="$WORK_DIR/chroot" # Update package lists sudo chroot "$chroot_dir" apt update # Install essential packages sudo chroot "$chroot_dir" apt install -y \ systemd \ systemd-sysv \ linux-image-amd64 \ linux-headers-amd64 \ grub-pc \ ostree \ ostree-boot \ network-manager \ openssh-server \ sudo \ curl \ wget \ vim \ less \ man-db # Clean up package cache sudo chroot "$chroot_dir" apt clean log_info "Package installation completed" } # Initialize OSTree repository in chroot init_ostree_repository() { log_info "Initializing OSTree repository in chroot..." local chroot_dir="$WORK_DIR/chroot" # Initialize OSTree repository sudo chroot "$chroot_dir" ostree init --repo=/ostree/repo --mode=bare-user # Create stateroot for Debian sudo chroot "$chroot_dir" ostree admin init-fs / sudo chroot "$chroot_dir" ostree admin stateroot-init debian log_info "OSTree repository initialized" } # Create OSTree commit from chroot create_ostree_commit() { log_info "Creating OSTree commit from chroot..." local chroot_dir="$WORK_DIR/chroot" # Commit the current system state sudo chroot "$chroot_dir" ostree commit \ --repo=/ostree/repo \ --branch=debian/$TARGET_DEBIAN_RELEASE/x86_64 \ --subject="Debian $TARGET_DEBIAN_RELEASE system" \ --tree=dir=/ log_info "OSTree commit created" } # Deploy OSTree system deploy_ostree_system() { log_info "Deploying OSTree system..." local chroot_dir="$WORK_DIR/chroot" # Deploy the commit sudo chroot "$chroot_dir" ostree admin deploy \ --os=debian \ --karg=console=tty0 \ --karg=console=ttyS0,115200n8 \ debian/$TARGET_DEBIAN_RELEASE/x86_64 log_info "OSTree system deployed" } # Configure bootloader in chroot configure_chroot_bootloader() { log_info "Configuring bootloader in chroot..." local chroot_dir="$WORK_DIR/chroot" # Install GRUB sudo chroot "$chroot_dir" grub-install --target=i386-pc /dev/sda # Generate GRUB configuration sudo chroot "$chroot_dir" grub-mkconfig -o /boot/grub/grub.cfg log_info "Bootloader configured" } # Copy chroot filesystem to mounted partition copy_chroot_filesystem() { log_info "Copying chroot filesystem to mounted partition..." local chroot_dir="$WORK_DIR/chroot" # Copy the entire chroot filesystem sudo cp -r "$chroot_dir"/* "$WORK_DIR/mnt/" # Create essential symlinks sudo ln -sf usr/bin "$WORK_DIR/mnt/bin" sudo ln -sf usr/lib "$WORK_DIR/mnt/lib" sudo ln -sf usr/sbin "$WORK_DIR/mnt/sbin" sudo ln -sf usr/lib64 "$WORK_DIR/mnt/lib64" log_info "Chroot filesystem copied" } # Cleanup chroot environment cleanup_chroot() { log_info "Cleaning up chroot environment..." local chroot_dir="$WORK_DIR/chroot" # Unmount filesystems sudo umount "$chroot_dir/dev/pts" 2>/dev/null || true sudo umount "$chroot_dir/sys" 2>/dev/null || true sudo umount "$chroot_dir/proc" 2>/dev/null || true sudo umount "$chroot_dir/dev" 2>/dev/null || true # Remove chroot directory sudo rm -rf "$chroot_dir" log_info "Chroot environment cleaned up" } # Show chroot information show_chroot_info() { log_info "Chroot information:" local chroot_dir="$WORK_DIR/chroot" if [ -d "$chroot_dir" ]; then echo "Chroot directory: $chroot_dir" echo "Chroot size: $(du -sh "$chroot_dir" 2>/dev/null || echo 'Unknown')" if [ -d "$chroot_dir/ostree" ]; then echo "OSTree repository: Found" echo "OSTree size: $(du -sh "$chroot_dir/ostree" 2>/dev/null || echo 'Unknown')" else echo "OSTree repository: Not found" fi if [ -d "$chroot_dir/boot" ]; then echo "Boot directory: Found" echo "Kernel: $(ls "$chroot_dir/boot"/vmlinuz* 2>/dev/null || echo 'Not found')" else echo "Boot directory: Not found" fi else echo "Chroot directory: Not found" fi } # Print module usage print_module_usage() { echo "Usage: source modules/chroot.sh" echo "This module implements chroot-based OSTree creation." echo "" echo "Available functions:" echo " create_chroot_environment - Create chroot environment" echo " install_chroot_packages - Install packages in chroot" echo " init_ostree_repository - Initialize OSTree repository" echo " create_ostree_commit - Create OSTree commit" echo " deploy_ostree_system - Deploy OSTree system" echo " configure_chroot_bootloader - Configure bootloader" echo " copy_chroot_filesystem - Copy to mounted partition" echo " cleanup_chroot - Cleanup chroot environment" echo " show_chroot_info - Display chroot information" echo "" echo "Required variables:" echo " WORK_DIR - Working directory for operations" }