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

136 lines
4.3 KiB
Bash

#!/bin/bash
# Disk management module for bootc image creation
# This module handles disk image creation, partitioning, and filesystem setup
# Common functions are sourced by the main script
# Create and partition disk image
create_disk_image_work() {
log_info "Creating disk image..."
# Check disk space first (temporarily disabled for debugging)
# check_disk_space
# Create raw image first to ensure proper sizing
log_info "Creating raw image with size: ${IMAGE_SIZE_GB}GB"
dd if=/dev/zero of="$OUTPUT_DIR/debian-bootc.raw" bs=1M count=$((IMAGE_SIZE_GB * 1024))
# Create loop device
loop_dev=$(sudo losetup --find --show "$OUTPUT_DIR/debian-bootc.raw")
log_info "Using loop device: $loop_dev"
# Export the loop device variable so other modules can use it
export loop_dev
# Partition the disk with proper GPT layout including BIOS Boot Partition
log_info "Partitioning disk..."
sudo parted "$loop_dev" mklabel gpt
# Create 1MB BIOS Boot Partition for GRUB
sudo parted "$loop_dev" mkpart primary 1MiB 2MiB
sudo parted "$loop_dev" set 1 bios_grub on
# Create main system partition
sudo parted "$loop_dev" mkpart primary ext4 2MiB 100%
sudo parted "$loop_dev" set 2 boot on
# Verify partitions were created correctly
log_info "Verifying partition layout..."
sudo parted "$loop_dev" print
# Create filesystem on the main partition (partition 2)
log_info "Creating filesystem..."
sudo mkfs.ext4 "${loop_dev}p2"
# Mount the main partition (partition 2)
log_info "Mounting partition..."
mkdir -p "$WORK_DIR/mnt"
sudo mount "${loop_dev}p2" "$WORK_DIR/mnt"
log_info "Device size: $(sudo blockdev --getsize64 $loop_dev) bytes"
}
# Create essential directories
create_essential_directories() {
log_info "Creating essential directories..."
# Create essential directories individually
sudo mkdir -p "$WORK_DIR/mnt/usr"
sudo mkdir -p "$WORK_DIR/mnt/etc"
sudo mkdir -p "$WORK_DIR/mnt/var"
sudo mkdir -p "$WORK_DIR/mnt/home"
sudo mkdir -p "$WORK_DIR/mnt/root"
sudo mkdir -p "$WORK_DIR/mnt/boot"
sudo mkdir -p "$WORK_DIR/mnt/proc"
sudo mkdir -p "$WORK_DIR/mnt/sys"
sudo mkdir -p "$WORK_DIR/mnt/dev"
sudo mkdir -p "$WORK_DIR/mnt/tmp"
sudo mkdir -p "$WORK_DIR/mnt/run"
sudo mkdir -p "$WORK_DIR/mnt/media"
sudo mkdir -p "$WORK_DIR/mnt/mnt"
log_info "Essential directories created"
}
# Unmount and cleanup disk
cleanup_disk() {
log_info "Cleaning up disk operations..."
if [ -n "$WORK_DIR" ] && [ -d "$WORK_DIR/mnt" ]; then
sudo umount "$WORK_DIR/mnt" 2>/dev/null || true
fi
if [ -n "$loop_dev" ]; then
sudo losetup -d "$loop_dev" 2>/dev/null || true
fi
}
# Get disk information
get_disk_info() {
if [ -n "$loop_dev" ]; then
log_info "Disk information:"
sudo parted "$loop_dev" print
echo ""
sudo fdisk -l "$loop_dev"
else
log_warn "No loop device available for disk info"
fi
}
# Verify disk integrity
verify_disk_integrity() {
log_info "Verifying disk integrity..."
if [ ! -f "$OUTPUT_DIR/debian-bootc.raw" ]; then
log_error "Raw disk image not found"
return 1
fi
local image_size=$(stat -c%s "$OUTPUT_DIR/debian-bootc.raw")
local expected_size=$((IMAGE_SIZE_GB * 1024 * 1024 * 1024))
if [ "$image_size" -ne "$expected_size" ]; then
log_error "Disk image size mismatch. Expected: $expected_size, Got: $image_size"
return 1
fi
log_info "Disk integrity verified successfully"
return 0
}
# Print module usage
print_module_usage() {
echo "Usage: source modules/disk.sh"
echo "This module handles disk image creation and management."
echo ""
echo "Available functions:"
echo " create_disk_image - Create and partition disk image"
echo " create_essential_directories - Create required directory structure"
echo " cleanup_disk - Unmount and cleanup disk operations"
echo " get_disk_info - Display disk partition information"
echo " verify_disk_integrity - Verify disk image integrity"
echo ""
echo "Required variables:"
echo " OUTPUT_DIR - Output directory for images"
echo " IMAGE_SIZE_GB - Image size in gigabytes"
echo " WORK_DIR - Working directory for operations"
}