particleos-installer/build-iso.sh

301 lines
No EOL
8.9 KiB
Bash

#!/bin/bash
# ParticleOS Simple ISO Builder
# Builds a bootable ISO using traditional methods + apt-ostree integration
set -e
# Colors
GREEN='\033[0;32m'
BLUE='\033[0;34m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
print_status() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
print_header() {
echo ""
echo -e "${BLUE}================================${NC}"
echo -e "${BLUE}$1${NC}"
echo -e "${BLUE}================================${NC}"
}
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_NAME="particleos"
VERSION="1.0.0"
BUILD_DIR="$SCRIPT_DIR/build"
CHROOT_DIR="$BUILD_DIR/chroot"
ISO_DIR="$BUILD_DIR/iso"
OUTPUT_DIR="$SCRIPT_DIR/output"
# Check prerequisites
check_prerequisites() {
print_header "Phase 1: Check Prerequisites"
local missing_packages=()
for package in debootstrap squashfs-tools xorriso grub-pc-bin grub-efi-amd64-bin; do
if ! dpkg -l | grep -q "^ii $package "; then
missing_packages+=("$package")
fi
done
if [ ${#missing_packages[@]} -gt 0 ]; then
print_status "Installing missing packages: ${missing_packages[*]}"
sudo apt update
sudo apt install -y "${missing_packages[@]}"
fi
print_success "All prerequisites satisfied"
}
# Clean build environment
clean_build() {
print_header "Phase 2: Clean Build Environment"
if [ -d "$BUILD_DIR" ]; then
print_status "Removing previous build directory..."
sudo rm -rf "$BUILD_DIR"
fi
mkdir -p "$BUILD_DIR" "$CHROOT_DIR" "$ISO_DIR" "$OUTPUT_DIR"
print_success "Build environment cleaned"
}
# Create base system using debootstrap
create_base_system() {
print_header "Phase 3: Create Base System"
print_status "Creating base Ubuntu system using debootstrap..."
# Create base system
sudo debootstrap --arch=amd64 --variant=minbase noble "$CHROOT_DIR" http://archive.ubuntu.com/ubuntu/
if [ $? -eq 0 ]; then
print_success "Base system created"
else
print_error "Failed to create base system"
exit 1
fi
}
# Configure base system
configure_base_system() {
print_header "Phase 4: Configure Base System"
print_status "Configuring base system..."
# Mount necessary filesystems
sudo mount --bind /dev "$CHROOT_DIR/dev"
sudo mount --bind /run "$CHROOT_DIR/run"
sudo mount -t proc none "$CHROOT_DIR/proc"
sudo mount -t sysfs none "$CHROOT_DIR/sys"
# Configure package sources
sudo chroot "$CHROOT_DIR" bash -c "echo 'deb http://archive.ubuntu.com/ubuntu noble main restricted universe multiverse' > /etc/apt/sources.list"
sudo chroot "$CHROOT_DIR" bash -c "echo 'deb http://archive.ubuntu.com/ubuntu noble-updates main restricted universe multiverse' >> /etc/apt/sources.list"
sudo chroot "$CHROOT_DIR" bash -c "echo 'deb http://security.ubuntu.com/ubuntu noble-security main restricted universe multiverse' >> /etc/apt/sources.list"
# Update package lists
sudo chroot "$CHROOT_DIR" apt update
# Install essential packages
sudo chroot "$CHROOT_DIR" apt install -y \
systemd systemd-sysv dbus \
ubuntu-minimal \
kubuntu-desktop \
plasma-desktop plasma-workspace kde-plasma-desktop sddm \
ostree bootc \
flatpak \
network-manager plasma-nm \
openssh-server \
curl wget vim nano \
htop neofetch tree \
firefox \
pulseaudio pulseaudio-utils \
fonts-ubuntu fonts-noto
# Download and install apt-ostree from custom repository
print_status "Installing apt-ostree from custom repository..."
sudo chroot "$CHROOT_DIR" wget -O /tmp/apt-ostree.deb "https://git.raines.xyz/robojerk/apt-ostree/raw/branch/main/apt-ostree_0.1.0-1_amd64.deb"
sudo chroot "$CHROOT_DIR" dpkg -i /tmp/apt-ostree.deb
sudo chroot "$CHROOT_DIR" rm /tmp/apt-ostree.deb
# Remove unwanted packages
sudo chroot "$CHROOT_DIR" apt remove -y snapd ubuntu-advantage-tools update-notifier update-manager unattended-upgrades
# Configure system
sudo chroot "$CHROOT_DIR" bash -c "echo 'particleos' > /etc/hostname"
sudo chroot "$CHROOT_DIR" bash -c "echo '127.0.1.1 particleos' >> /etc/hosts"
# Create user
sudo chroot "$CHROOT_DIR" useradd -m -s /bin/bash -G sudo particle
sudo chroot "$CHROOT_DIR" bash -c "echo 'particle:particle' | chpasswd"
# Enable services
sudo chroot "$CHROOT_DIR" systemctl enable sddm
sudo chroot "$CHROOT_DIR" systemctl enable NetworkManager
sudo chroot "$CHROOT_DIR" systemctl enable ssh
# Unmount filesystems
sudo umount "$CHROOT_DIR/dev"
sudo umount "$CHROOT_DIR/run"
sudo umount "$CHROOT_DIR/proc"
sudo umount "$CHROOT_DIR/sys"
print_success "Base system configured"
}
# Create live filesystem
create_live_fs() {
print_header "Phase 5: Create Live Filesystem"
print_status "Creating live filesystem..."
# Create ISO directory structure
mkdir -p "$ISO_DIR/casper"
mkdir -p "$ISO_DIR/boot/grub"
mkdir -p "$ISO_DIR/isolinux"
# Create squashfs from the chroot
sudo mksquashfs "$CHROOT_DIR" "$ISO_DIR/casper/filesystem.squashfs" -comp xz -e boot
# Create filesystem.manifest
sudo chroot "$CHROOT_DIR" dpkg-query -W --showformat='${Package} ${Version}\n' > "$ISO_DIR/casper/filesystem.manifest"
# Create filesystem.size
sudo du -sx --block-size=1 "$CHROOT_DIR" | cut -f1 > "$ISO_DIR/casper/filesystem.size"
# Copy kernel and initramfs
sudo cp "$CHROOT_DIR/boot/vmlinuz-"* "$ISO_DIR/casper/vmlinuz"
sudo cp "$CHROOT_DIR/boot/initrd.img-"* "$ISO_DIR/casper/initrd"
print_success "Live filesystem created"
}
# Setup boot configuration
setup_boot() {
print_header "Phase 6: Setup Boot Configuration"
print_status "Setting up boot configuration..."
# Create GRUB configuration
cat > "$ISO_DIR/boot/grub/grub.cfg" << 'EOF'
set timeout=10
set default=0
menuentry "Try ParticleOS without installing" {
linux /casper/vmlinuz boot=casper quiet splash --
initrd /casper/initrd
}
menuentry "Install ParticleOS" {
linux /casper/vmlinuz boot=casper quiet splash --
initrd /casper/initrd
}
menuentry "Check disc for defects" {
linux /casper/vmlinuz boot=casper integrity-check quiet splash --
initrd /casper/initrd
}
EOF
# Create ISOLINUX configuration
cat > "$ISO_DIR/isolinux/isolinux.cfg" << 'EOF'
DEFAULT live
TIMEOUT 300
PROMPT 1
LABEL live
MENU LABEL Try ParticleOS without installing
KERNEL /casper/vmlinuz
APPEND boot=casper initrd=/casper/initrd quiet splash --
LABEL live-install
MENU LABEL Install ParticleOS
KERNEL /casper/vmlinuz
APPEND boot=casper initrd=/casper/initrd quiet splash --
LABEL check
MENU LABEL Check disc for defects
KERNEL /casper/vmlinuz
APPEND boot=casper integrity-check initrd=/casper/initrd quiet splash --
EOF
print_success "Boot configuration setup complete"
}
# Create ISO
create_iso() {
print_header "Phase 7: Create ISO"
print_status "Creating bootable ISO..."
# Create ISO using xorriso
xorriso -as mkisofs \
-o "$OUTPUT_DIR/${PROJECT_NAME}-${VERSION}.iso" \
-b isolinux/isolinux.bin \
-c isolinux/boot.cat \
-boot-load-size 4 -boot-info-table \
-no-emul-boot -eltorito-alt-boot \
-e boot/grub/efi.img -no-emul-boot \
-isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
-r -V "ParticleOS ${VERSION}" \
"$ISO_DIR"
if [ $? -eq 0 ]; then
print_success "ISO created successfully: $OUTPUT_DIR/${PROJECT_NAME}-${VERSION}.iso"
else
print_error "Failed to create ISO"
exit 1
fi
}
# Main build process
main() {
echo "🚀 ParticleOS Simple ISO Builder"
echo "================================="
echo "Project: $PROJECT_NAME"
echo "Version: $VERSION"
echo "Build Directory: $BUILD_DIR"
echo ""
# Run build phases
check_prerequisites
clean_build
create_base_system
configure_base_system
create_live_fs
setup_boot
create_iso
print_header "Build Complete!"
echo ""
echo "🎉 ParticleOS ISO built successfully!"
echo "📁 Location: $OUTPUT_DIR/${PROJECT_NAME}-${VERSION}.iso"
echo ""
echo "🧪 Test the ISO:"
echo " qemu-system-x86_64 -m 4G -enable-kvm \\"
echo " -cdrom $OUTPUT_DIR/${PROJECT_NAME}-${VERSION}.iso \\"
echo " -boot d"
echo ""
}
# Run main function
main "$@"