136 lines
4.3 KiB
Bash
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"
|
|
}
|