215 lines
6.3 KiB
Bash
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"
|
|
}
|