debian-bootc-simple/modules/chroot.sh
2025-08-21 07:31:52 -07:00

215 lines
6.3 KiB
Bash

#!/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"
}