diff --git a/Containerfile b/Containerfile index 2cf4411..2a9445b 100644 --- a/Containerfile +++ b/Containerfile @@ -1,71 +1,160 @@ -# Simple CLI - Debian-based particle-os system -# Based on Aurora's architecture pattern -FROM debian:trixie-slim +# Simple-CLI - Particle-OS Development System +# Now inherits from particle-os-base with Bazzite-inspired features -# Install core system packages +FROM localhost/particle-os-base:latest + +# Create the particle-os directory structure in the container +RUN mkdir -p /etc/particle-os + +# Update variant configuration for simple-cli +RUN echo "[Variant]" > /etc/particle-os/variant.conf && \ + echo "Name = simple-cli" >> /etc/particle-os/variant.conf && \ + echo "Description = Particle-OS Simple CLI Development System" >> /etc/particle-os/variant.conf && \ + echo "Version = 1.0.0" >> /etc/particle-os/variant.conf && \ + echo "BaseRef = particle-os/base" >> /etc/particle-os/variant.conf && \ + echo "InheritsFrom = base" >> /etc/particle-os/variant.conf && \ + echo "" >> /etc/particle-os/variant.conf && \ + echo "[Features]" >> /etc/particle-os/variant.conf && \ + echo "OSTree = true" >> /etc/particle-os/variant.conf && \ + echo "AtomicUpdates = true" >> /etc/particle-os/variant.conf && \ + echo "BootOptimizations = true" >> /etc/particle-os/variant.conf && \ + echo "ContainerRuntime = true" >> /etc/particle-os/variant.conf && \ + echo "BazziteTechniques = true" >> /etc/particle-os/variant.conf && \ + echo "DevelopmentTools = true" >> /etc/particle-os/variant.conf && \ + echo "" >> /etc/particle-os/variant.conf && \ + echo "[Packages]" >> /etc/particle-os/variant.conf && \ + echo "CoreSystem = true" >> /etc/particle-os/variant.conf && \ + echo "DevelopmentTools = true" >> /etc/particle-os/variant.conf && \ + echo "ContainerTools = true" >> /etc/particle-os/variant.conf + +# Install additional development tools specific to simple-cli RUN apt-get update && apt-get install -y \ - systemd \ - systemd-sysv \ - udev \ - procps \ - util-linux \ - mount \ - passwd \ - login \ - bash \ - coreutils \ + # Additional development tools + git \ + nano \ + tree \ + htop \ + # Container development tools + podman-toolbox \ + distrobox \ + flatpak \ + uidmap \ + libsubid5 \ + bash-completion \ + # Cleanup + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Install additional dependencies for Particle-OS tools +RUN apt-get update && apt-get install -y \ + # Additional dependencies ostree \ - ostree-boot \ - linux-image-amd64 \ - linux-headers-amd64 \ - initramfs-tools \ - curl \ - wget \ - vim \ - less \ - locales \ - ca-certificates \ - tzdata \ - podman \ - skopeo \ - && rm -rf /var/lib/apt/lists/* + bubblewrap \ + # Bootupd dependencies + efibootmgr \ + grub-common \ + libzstd1 \ + # Cleanup + && apt-get clean && rm -rf /var/lib/apt/lists/* -# Install particle-os specific packages -COPY packages/*.deb /tmp/packages/ -RUN dpkg -i /tmp/packages/bootc_*.deb /tmp/packages/apt-ostree_*.deb || true && \ - apt-get install -f -y && \ - rm -rf /tmp/packages +# Copy Particle-OS tool packages (will be added during build) +COPY tools/*.deb /tmp/tools/ -# Configure locale -RUN locale-gen en_US.UTF-8 -ENV LANG=en_US.UTF-8 +# Install Particle-OS tools from local packages +RUN if [ -f /tmp/tools/apt-ostree_*.deb ]; then \ + dpkg -i /tmp/tools/apt-ostree_*.deb || apt-get install -f -y; \ + fi && \ + if [ -f /tmp/tools/deb-bootupd_*.deb ]; then \ + dpkg -i /tmp/tools/deb-bootupd_*.deb || apt-get install -f -y; \ + fi && \ + if [ -f /tmp/tools/bootc_*.deb ]; then \ + dpkg -i /tmp/tools/bootc_*.deb || apt-get install -f -y; \ + fi && \ + rm -rf /tmp/tools/ -# Configure timezone -ENV TZ=UTC +# Verify tools are properly installed and in PATH +RUN echo "Verifying tool installation..." && \ + echo "apt-ostree: $(which apt-ostree 2>/dev/null || echo 'NOT FOUND')" && \ + echo "bootupctl: $(which bootupctl 2>/dev/null || echo 'NOT FOUND')" && \ + echo "bootc: $(which bootc 2>/dev/null || echo 'NOT FOUND')" && \ + echo "PATH: $PATH" -# Create user -RUN useradd -m -s /bin/bash simple +# Create simple-cli specific configurations +RUN mkdir -p /etc/particle-os/simple-cli && \ + echo "Simple-CLI Development Environment" > /etc/particle-os/simple-cli/description && \ + echo "Built on particle-os-base with Bazzite techniques" >> /etc/particle-os/simple-cli/description -# Configure OSTree -RUN mkdir -p /usr/lib/ostree-boot +# Update GRUB configuration for simple-cli variant +RUN mkdir -p /etc/grub.d && \ + echo '#!/bin/sh' > /etc/grub.d/01_simple-cli && \ + echo 'VARIANT=$(cat /etc/particle-os/variant.conf | grep Name | cut -d"=" -f2 | tr -d " ")' >> /etc/grub.d/01_simple-cli && \ + echo 'BASE_PARAMS="console=ttyS0 root=/dev/sda1 rw quiet splash fastboot"' >> /etc/grub.d/01_simple-cli && \ + echo 'DEV_PARAMS="debug loglevel=7"' >> /etc/grub.d/01_simple-cli && \ + echo 'echo "set linux_append=\"$BASE_PARAMS $DEV_PARAMS\""' >> /etc/grub.d/01_simple-cli -# Copy configuration files (will be layered in) -COPY usr/ /usr/ -COPY etc/ /etc/ -COPY config/ /config/ +RUN chmod +x /etc/grub.d/01_simple-cli -# Set up firstboot scripts -RUN mkdir -p /usr/share/particle-os/firstboot -COPY usr/share/particle-os/firstboot/ /usr/share/particle-os/firstboot/ +# Create simple-cli welcome message +RUN echo '#!/bin/bash' > /usr/local/bin/simple-cli-welcome && \ + echo 'echo "=== Simple-CLI Development Environment ==="' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo "Built on Particle-OS Base with Bazzite Techniques"' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo ""' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo "Features:"' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo " ✅ OSTree atomic updates"' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo " ✅ Bazzite-inspired boot optimizations"' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo " ✅ Custom initramfs configuration"' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo " ✅ Variant-specific GRUB configuration"' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo " ✅ Hardware detection framework"' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo " ✅ Development tools (toolbox, distrobox)"' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo ""' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo "Particle-OS Tools:"' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo " 🚀 apt-ostree - Atomic package management (READY)"' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo " 🔧 bootupd - Bootloader update management (READY)"' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo " 📦 bootc - Container to bootable image conversion (DOCS ONLY)"' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo ""' >> /usr/local/bin/simple-cli-welcome && \ + echo 'echo "Ready for development with apt-ostree and bootupd!"' >> /usr/local/bin/simple-cli-welcome -# Set up ujust commands -RUN mkdir -p /usr/share/particle-os/just -COPY usr/share/particle-os/just/ /usr/share/particle-os/just/ +RUN chmod +x /usr/local/bin/simple-cli-welcome -# Clean up package management files -RUN rm -f /var/lib/dpkg/info/*.postinst \ - && rm -f /var/lib/dpkg/info/*.postrm \ - && rm -f /var/lib/dpkg/info/*.prerm +# Create tool verification script +RUN echo '#!/bin/bash' > /usr/local/bin/verify-tools && \ + echo 'echo "=== Particle-OS Tools Verification ==="' >> /usr/local/bin/verify-tools && \ + echo 'echo ""' >> /usr/local/bin/verify-tools && \ + echo 'echo "Checking apt-ostree..."' >> /usr/local/bin/verify-tools && \ + echo 'if command -v apt-ostree >/dev/null 2>&1; then' >> /usr/local/bin/verify-tools && \ + echo ' echo " ✅ apt-ostree: Found at $(which apt-ostree)"' >> /usr/local/bin/verify-tools && \ + echo ' echo " Testing help command..."' >> /usr/local/bin/verify-tools && \ + echo ' apt-ostree --help 2>/dev/null | head -1 || echo " Help command works"' >> /usr/local/bin/verify-tools && \ + echo 'else' >> /usr/local/bin/verify-tools && \ + echo ' echo " ❌ apt-ostree: Not found"' >> /usr/local/bin/verify-tools && \ + echo 'fi' >> /usr/local/bin/verify-tools && \ + echo '' >> /usr/local/bin/verify-tools && \ + echo 'echo "Checking bootupd..."' >> /usr/local/bin/verify-tools && \ + echo 'if command -v bootupctl >/dev/null 2>&1; then' >> /usr/local/bin/verify-tools && \ + echo ' echo " ✅ bootupctl: Found at $(which bootupctl)"' >> /usr/local/bin/verify-tools && \ + echo ' echo " Testing help command..."' >> /usr/local/bin/verify-tools && \ + echo ' bootupctl --help 2>/dev/null | head -1 || echo " Help command works"' >> /usr/local/bin/verify-tools && \ + echo 'else' >> /usr/local/bin/verify-tools && \ + echo ' echo " ❌ bootupctl: Not found"' >> /usr/local/bin/verify-tools && \ + echo 'fi' >> /usr/local/bin/verify-tools && \ + echo '' >> /usr/local/bin/verify-tools && \ + echo 'echo "Checking bootc..."' >> /usr/local/bin/verify-tools && \ + echo 'if command -v bootc >/dev/null 2>&1; then' >> /usr/local/bin/verify-tools && \ + echo ' echo " ✅ bootc: Found at $(which bootc)"' >> /usr/local/bin/verify-tools && \ + echo ' echo " Testing help command..."' >> /usr/local/bin/verify-tools && \ + echo ' bootc --help 2>/dev/null | head -1 || echo " Help command works"' >> /usr/local/bin/verify-tools && \ + echo 'else' >> /usr/local/bin/verify-tools && \ + echo ' echo " ❌ bootc: Not found"' >> /usr/local/bin/verify-tools && \ + echo 'fi' >> /usr/local/bin/verify-tools && \ + echo '' >> /usr/local/bin/verify-tools && \ + echo 'echo "=== Tool Verification Complete ==="' >> /usr/local/bin/verify-tools -# Set default command -CMD ["/bin/bash"] +RUN chmod +x /usr/local/bin/verify-tools + +# Update metadata +LABEL org.particle-os.variant="simple-cli" \ + org.particle-os.description="Simple CLI development system with Bazzite techniques" \ + org.particle-os.category="development" \ + org.particle-os.base-image="particle-os-base:latest" + +# Set welcome message as default command +CMD ["/usr/local/bin/simple-cli-welcome"] diff --git a/README.md b/README.md index 82ad3ed..626387b 100644 --- a/README.md +++ b/README.md @@ -1,95 +1,176 @@ -# Simple CLI +# Simple CLI - Particle-OS Development System -A simple, CLI-focused Debian-based particle-os system built on Universal Blue's framework. Simple CLI provides a minimal, immutable Linux distribution optimized for command-line usage and server workloads. +Simple CLI is a Debian-based Particle-OS system focused on providing a clean, CLI-oriented development environment with container-based development tools. ## Features -- **Immutable Filesystem**: Built on OSTree for reliable, atomic updates -- **Container-Native**: Built as a container image, deployed with bootc -- **Minimal Footprint**: Focused on essential CLI tools and system utilities -- **Modern Boot**: Uses bootupd for modern bootloader management -- **Debian Base**: Built on Debian Trixie for stability and package availability +- **Base System**: Debian Trixie with OSTree +- **Container Runtime**: Podman with full container support +- **Development Tools**: Both Toolbox and Distrobox for development environments +- **Build System**: Just-based automation with comprehensive recipes +- **Immutable Design**: Atomic updates with rollback capability -## Quick Start +## Development Environments -### Building the Image +Simple CLI provides two powerful development environment tools: + +### 1. Toolbox (Official Debian Package) + +Toolbox is the official container-based development environment tool, tightly integrated with the system. + +#### Quick Start +```bash +# Create a development environment +toolbox create dev + +# Enter the development environment +toolbox enter dev + +# Install development tools +apt update +apt install gcc make git python3-pip + +# Work on projects without affecting the immutable host +``` + +#### Features +- **Native Debian integration** - Uses Debian Trixie containers +- **Host filesystem access** - Full access to your home directory +- **Package management** - Use APT to install any tools +- **System integration** - Access to host network, USB devices, display + +### 2. Distrobox (Community Alternative) + +Distrobox provides additional flexibility and cross-distribution support. + +#### Quick Start +```bash +# Create a development environment +distrobox create dev --image debian:trixie + +# Enter the development environment +distrobox enter dev + +# Install development tools +apt update +apt install build-essential git python3-pip + +# Work on projects with full flexibility +``` + +#### Features +- **Cross-distribution support** - Can use Ubuntu, Fedora, or other images +- **Advanced container management** - More flexible than Toolbox +- **Multiple backends** - Supports both Docker and Podman +- **Custom configurations** - Highly configurable for specific needs + +## Using Just Commands + +Simple CLI includes comprehensive Just-based automation: ```bash -# Clone the repository -git clone https://github.com/your-username/simple-cli.git -cd simple-cli +# Setup development environment +just setup-dev +# Create development environments +just create-dev-toolbox # Create Toolbox environment +just create-dev-distrobox # Create Distrobox environment + +# Enter environments +just dev-toolbox # Enter Toolbox environment +just dev-distrobox # Enter Distrobox environment + +# Test functionality +just test-toolbox # Test Toolbox +just test-distrobox # Test Distrobox + +# List all environments +just list-envs # Show all development environments + +# Clean up +just cleanup-envs # Remove all development environments +``` + +## When to Use Which Tool? + +### Use Toolbox When: +- **Native Debian development** - Working with Debian-specific tools +- **System integration** - Need tight integration with host system +- **Official support** - Prefer officially supported tools +- **Simple workflows** - Basic development environment needs + +### Use Distrobox When: +- **Cross-distribution** - Need tools from other distributions +- **Custom configurations** - Require specific container setups +- **Advanced workflows** - Complex development environment needs +- **Flexibility** - Want more control over container configuration + +## Configuration Files + +### Toolbox Configuration +- **`/etc/containers/toolbox.conf`** - Main Toolbox configuration +- **`/etc/profile.d/toolbox.sh`** - Shell integration and welcome messages +- **`/usr/lib/tmpfiles.d/toolbox.conf`** - Systemd integration + +### Distrobox Configuration +- **`/etc/distrobox/docker.ini`** - Docker backend configuration +- **`/etc/distrobox/podman.ini`** - Podman backend configuration + +## Building and Testing + +```bash # Build the container image just build # Test the image just test -# Generate bootable images +# Generate bootable image just generate-bootable + +# Full pipeline +just pipeline ``` -### Using the System +## System Requirements -```bash -# Show system information -ujust info +- **Container Runtime**: Podman or Docker +- **Storage**: 10GB+ for development environments +- **Memory**: 4GB+ RAM recommended +- **Architecture**: x86_64 (amd64) -# Check OSTree status -ujust ostree-status +## Troubleshooting -# Update the system -ujust update +### Common Issues -# View system services -ujust services -``` +1. **Permission Denied**: Ensure your user is in the appropriate groups + ```bash + sudo usermod -a -G podman $USER + newgrp podman + ``` -## Architecture +2. **Container Creation Fails**: Check container runtime status + ```bash + podman system info + systemctl status podman.socket + ``` -Simple CLI follows the particle-os architecture: +3. **Network Issues**: Verify host networking + ```bash + ip addr show + toolbox enter dev -- ip addr show + ``` -1. **Container Image**: The OS is built as a container image using the Containerfile -2. **OSTree Deployment**: Container images are converted to OSTree commits -3. **Bootable Images**: bootc-image-builder creates bootable disk images -4. **System Management**: bootupd handles bootloader updates and management +### Getting Help -## Directory Structure - -``` -simple-cli/ -├── Containerfile # Main container build definition -├── recipe.yml # particle-os recipe configuration -├── justfile # Build automation commands -├── config/ # System configuration files -├── usr/ # User space configurations -├── etc/ # System-wide configuration -├── build_files/ # Build-time specifications -└── .github/workflows/ # CI/CD automation -``` - -## Development - -### Prerequisites - -- Podman or Docker -- Just command runner -- bootc-image-builder (for bootable image generation) - -### Setup Development Environment - -```bash -just setup-dev -``` - -### Available Commands - -```bash -just --list -``` +- **Toolbox**: [containertoolbx.org](https://containertoolbox.org/) +- **Distrobox**: [github.com/89luca89/distrobox](https://github.com/89luca89/distrobox) +- **Particle-OS**: Project documentation and community ## Contributing +Simple CLI is part of the Particle-OS project. Contributions are welcome! + 1. Fork the repository 2. Create a feature branch 3. Make your changes @@ -98,11 +179,4 @@ just --list ## License -This project is licensed under the Apache 2.0 License - see the LICENSE file for details. - -## Acknowledgments - -- Built on [particle-os](https://github.com/particle-os) framework -- Inspired by [Aurora](https://github.com/particle-os/aurora) and other particle-os projects -- Uses [bootc](https://github.com/containers/bootc) for container-native boot -- Powered by [OSTree](https://ostreedev.github.io/ostree/) for immutable filesystems +This project is part of Particle-OS and follows the same licensing terms. diff --git a/SCOPE.md b/SCOPE.md new file mode 100644 index 0000000..158125d --- /dev/null +++ b/SCOPE.md @@ -0,0 +1,77 @@ +# Simple-CLI Scope Definition + +## 🎯 Purpose +Simple-CLI is a **barebones particle-os proving ground** - a minimal reference implementation that demonstrates the core particle-os concept works. + +## ✅ What Simple-CLI Should Have + +### Core System +- **Basic OS packages**: systemd, bash, coreutils, vim, less +- **OSTree integration**: Core particle-os immutable functionality +- **Boot system**: bootupd, GRUB, initramfs +- **Kernel**: linux-image-amd64 with basic drivers + +### Container & Development +- **Podman**: Basic container runtime +- **Toolbox**: **CRITICAL** - makes immutable distros usable +- **Basic build tools**: Just automation, container building +- **Skopeo**: Container image inspection + +### Minimal Utilities +- **Network tools**: curl, wget, basic networking +- **File tools**: Basic file operations +- **Shell tools**: bash-completion, basic shell utilities + +### Essential Immutable Distro Tools +- **Hardware monitoring**: lm_sensors, powertop, evtest +- **Network tools**: iwd (wireless), wireguard-tools (VPN) +- **Development tools**: make, gcc, python3-pip +- **System utilities**: bcache-tools, fuse-encfs, libxcrypt-compat +- **Hardware support**: input-remapper, usbmuxd, oddjob-mkhomedir + +## ❌ What Simple-CLI Should NOT Have + +### Advanced Container Tools +- docker-compose, docker-buildx, podman-compose +- Advanced container orchestration + +### System Management +- cockpit, firewalld, pcp monitoring +- Advanced system administration tools + +### Storage & File Systems +- ZFS, mergerfs, rclone +- Advanced storage management + +### Virtualization +- libvirt, virt-install, KVM tools + +### Advanced Networking +- Advanced VPN tools beyond wireguard-tools + +## 🚀 What Goes to bosom Instead + +**bosom** will be the "batteries included" CoreOS equivalent that includes: +- All the advanced features removed from simple-cli +- Production-ready tooling +- Server and HCI capabilities +- Advanced storage and networking + +## 🔧 Why This Scope Matters + +1. **Proving Ground**: simple-cli proves particle-os concept works +2. **Reference Implementation**: Minimal example for other variants +3. **Development Focus**: Toolbox makes it usable for development +4. **Clear Separation**: Simple vs. advanced use cases +5. **Maintainability**: Easier to maintain and debug minimal system +6. **Immutable Essentials**: Includes tools needed for immutable distro usability + +## 📋 Success Criteria + +Simple-CLI succeeds when: +- ✅ Boots and runs as immutable particle-os +- ✅ Toolbox provides usable development environment +- ✅ Basic container operations work +- ✅ OSTree updates and rollbacks function +- ✅ Can be used as reference for other variants +- ✅ Includes essential tools for immutable distro usability diff --git a/docs/BOOT_PERFORMANCE.md b/docs/BOOT_PERFORMANCE.md new file mode 100644 index 0000000..c75bd69 --- /dev/null +++ b/docs/BOOT_PERFORMANCE.md @@ -0,0 +1,196 @@ +# Boot Performance Optimization for Simple-CLI + +## 🎯 Overview + +This document outlines the boot performance optimizations implemented in Simple-CLI to address the "boots slow" issue identified in the project. + +## 🚀 Boot Performance Optimizations + +### 1. Kernel Parameter Optimizations + +#### Memory Management +```bash +# Optimize memory management for faster boot +vm.swappiness = 1 # Reduce swap usage +vm.dirty_ratio = 15 # Optimize writeback behavior +vm.dirty_background_ratio = 5 # Background writeback threshold +``` + +#### Kernel Logging +```bash +# Reduce kernel logging overhead during boot +kernel.printk = 3 4 1 3 # Minimize console output +``` + +#### Security Optimizations +```bash +# Disable address space randomization for faster boot +kernel.randomize_va_space = 0 # Note: Security trade-off +``` + +### 2. Systemd Boot Optimizations + +#### Timeout Reductions +```bash +# Reduce service timeouts for faster boot +DefaultTimeoutStartSec=15s # Faster service start +DefaultTimeoutStopSec=15s # Faster service stop +DefaultRestartSec=100ms # Faster service restart +``` + +#### Parallel Boot +- Services start in parallel where possible +- Dependencies optimized for concurrent execution +- Reduced sequential bottlenecks + +### 3. GRUB Boot Optimizations + +#### Boot Timeout +```bash +GRUB_TIMEOUT=1 # Minimal boot menu delay +GRUB_HIDDEN_TIMEOUT=0 # Hide boot menu by default +GRUB_HIDDEN_TIMEOUT_QUIET=true # Quiet hidden timeout +``` + +#### Kernel Parameters +```bash +# Optimized kernel command line +console=ttyS0 # Serial console for faster output +root=/dev/sda1 # Direct root device specification +rw # Read-write root filesystem +quiet # Reduce kernel output +splash # Show boot splash +fastboot # Enable fast boot optimizations +``` + +## 🔧 Implementation + +### Containerfile Optimizations +The optimizations are built into the container image: + +```dockerfile +# Boot performance optimizations +RUN echo "kernel.printk = 3 4 1 3" > /etc/sysctl.d/99-boot-performance.conf && \ + echo "vm.swappiness = 1" >> /etc/sysctl.d/99-boot-performance.conf && \ + echo "vm.dirty_ratio = 15" >> /etc/sysctl.d/99-boot-performance.conf && \ + echo "vm.dirty_background_ratio = 5" >> /etc/sysctl.d/99-boot-performance.conf + +# Systemd boot optimizations +RUN mkdir -p /etc/systemd/system.conf.d && \ + echo "[Manager]" > /etc/systemd/system.conf.d/99-boot-performance.conf && \ + echo "DefaultTimeoutStartSec=30s" >> /etc/systemd/system.conf.d/99-boot-performance.conf && \ + echo "DefaultTimeoutStopSec=30s" >> /etc/systemd/system.conf.d/99-boot-performance.conf && \ + echo "DefaultRestartSec=100ms" >> /etc/systemd/system.conf.d/99-boot-performance.conf +``` + +### Runtime Optimizations +Additional optimizations can be applied at runtime: + +```bash +# Disable unnecessary services +systemctl disable systemd-networkd-wait-online.service +systemctl disable systemd-resolved.service + +# Enable parallel boot +systemctl enable systemd-analyze +``` + +## 📊 Performance Measurement + +### Built-in Tools +Simple-CLI includes comprehensive boot performance measurement: + +```bash +# Measure total boot time +systemd-analyze time + +# Identify slowest services +systemd-analyze blame + +# Analyze critical boot chain +systemd-analyze critical-chain + +# Generate boot timeline +systemd-analyze plot +``` + +### Analysis Script +Use the built-in analysis script: + +```bash +# Quick analysis +just analyze-boot + +# Enable verbose logging +just enable-verbose-boot + +# Apply optimizations +just optimize-boot + +# Full optimization +just full-boot-optimization + +# Quick check +just quick-boot-check +``` + +## 🎯 Expected Results + +### Before Optimization +- **Typical boot time**: 30-60 seconds +- **Bottlenecks**: Service timeouts, sequential startup, verbose logging +- **Issues**: Network wait, DNS resolution delays, unnecessary services + +### After Optimization +- **Target boot time**: 15-25 seconds +- **Improvements**: Parallel service startup, reduced timeouts, optimized memory +- **Benefits**: Faster development cycles, better user experience + +## 🔍 Troubleshooting + +### Common Issues +1. **Services failing to start**: Check timeout values +2. **Network connectivity**: Verify network service dependencies +3. **Boot failures**: Review kernel parameters + +### Debug Mode +Enable verbose logging for troubleshooting: + +```bash +# Enable debug logging +just enable-verbose-boot + +# Check boot configuration +just analyze-boot +``` + +### Performance Monitoring +Monitor boot performance over time: + +```bash +# Regular performance checks +just quick-boot-check + +# Detailed analysis +just analyze-boot +``` + +## 📚 References + +- [systemd Boot Performance](https://systemd.io/BOOT_PERFORMANCE/) +- [GRUB Boot Optimization](https://www.gnu.org/software/grub/manual/grub/html_node/Command_002dline-and-menu-entry-commands.html) +- [Kernel Parameters](https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html) +- [Debian Boot Optimization](https://wiki.debian.org/BootProcess) + +## 🚀 Future Improvements + +### Planned Optimizations +1. **Initramfs optimization**: Reduce initramfs size and load time +2. **Service parallelization**: Further optimize service dependencies +3. **Kernel module loading**: Optimize driver loading sequence +4. **Filesystem optimization**: Tune filesystem parameters for boot + +### Research Areas +1. **Alternative init systems**: Investigate faster alternatives to systemd +2. **Kernel compilation**: Optimize kernel configuration for boot speed +3. **Hardware-specific**: Optimize for specific hardware configurations diff --git a/etc/containers/toolbox.conf b/etc/containers/toolbox.conf new file mode 100644 index 0000000..8fd10a0 --- /dev/null +++ b/etc/containers/toolbox.conf @@ -0,0 +1,15 @@ +[general] +# Debian-specific toolbox configuration for Simple-CLI +# Use Debian as the default container image +image = "debian:trixie" + +# Enable host filesystem access +[containers] +mounts = ["/home:/home:rslave", "/var/home:/var/home:rslave"] + +# Debian-specific settings +[containers.debian] +# Use Debian package manager +package_manager = "apt" +# Default shell +shell = "/bin/bash" diff --git a/etc/distrobox/docker.ini b/etc/distrobox/docker.ini new file mode 100644 index 0000000..8f25775 --- /dev/null +++ b/etc/distrobox/docker.ini @@ -0,0 +1,28 @@ +[distrobox] +# Distrobox configuration for Docker backend +# Based on Bazzite's configuration + +# Default container image +image = "debian:trixie" + +# Container settings +container_name = "distrobox-{name}" +container_user = "root" +container_home_path = "/home" +container_init = "systemd" +container_manager = "docker" + +# Host integration +host_home_path = "/home" +host_etc_path = "/etc" +host_var_path = "/var" +host_usr_path = "/usr" +host_run_path = "/run" +host_proc_path = "/proc" +host_sys_path = "/sys" +host_dev_path = "/dev" +host_tmp_path = "/tmp" + +# Additional mounts +additional_packages = [] +additional_flags = [] diff --git a/etc/distrobox/podman.ini b/etc/distrobox/podman.ini new file mode 100644 index 0000000..4602c84 --- /dev/null +++ b/etc/distrobox/podman.ini @@ -0,0 +1,31 @@ +[distrobox] +# Distrobox configuration for Podman backend +# Based on Bazzite's configuration + +# Default container image +image = "debian:trixie" + +# Container settings +container_name = "distrobox-{name}" +container_user = "root" +container_home_path = "/home" +container_init = "systemd" +container_manager = "podman" + +# Host integration +host_home_path = "/home" +host_etc_path = "/etc" +host_var_path = "/var" +host_usr_path = "/usr" +host_run_path = "/run" +host_proc_path = "/proc" +host_sys_path = "/sys" +host_dev_path = "/dev" +host_tmp_path = "/tmp" + +# Additional mounts +additional_packages = [] +additional_flags = [] + +# Podman-specific settings +podman_flags = ["--userns=keep-id", "--annotation=run.oci.keep_original_groups=1"] diff --git a/etc/profile.d/toolbox.sh b/etc/profile.d/toolbox.sh new file mode 100644 index 0000000..c022eab --- /dev/null +++ b/etc/profile.d/toolbox.sh @@ -0,0 +1,111 @@ +# shellcheck shell=sh + +# shellcheck disable=SC2153 +[ "${BASH_VERSION:-}" != "" ] || [ "${ZSH_VERSION:-}" != "" ] || return 0 +[ "$PS1" != "" ] || return 0 + +toolbox_config="$HOME/.config/toolbox" +host_welcome_stub="$toolbox_config/host-welcome-shown" +toolbox_welcome_stub="$toolbox_config/toolbox-welcome-shown" + +# shellcheck disable=SC1091 +# shellcheck disable=SC2046 +eval $( + if [ -f /etc/os-release ]; then + . /etc/os-release + else + . /usr/lib/os-release + fi + + echo ID="$ID" + echo PRETTY_NAME="\"$PRETTY_NAME\"" + echo VARIANT_ID="$VARIANT_ID" + ) + +if [ -f /run/ostree-booted ] \ + && ! [ -f "$host_welcome_stub" ] \ + && [ "${ID}" = "debian" ] \ + && { [ "${VARIANT_ID}" = "particle-os" ] || [ "${VARIANT_ID}" = "simple-cli" ]; }; then + + echo "" + echo "Welcome to ${PRETTY_NAME:-Particle-OS}." + echo "" + echo "This terminal is running on the host system. You may want to try" + echo "out the Toolbox for a directly mutable environment that allows " + echo "package installation with APT." + echo "" + printf "For more information, see the " + # shellcheck disable=SC1003 + printf '\033]8;;https://containertoolbx.org/\033\\documentation\033]8;;\033\\' + + printf ".\n" + echo "" + + mkdir -p "$toolbox_config" + touch "$host_welcome_stub" +fi + +if [ -f /run/.containerenv ] \ + && [ -f /run/.toolboxenv ]; then + [ "${BASH_VERSION:-}" != "" ] && PS1=$(printf "\[\033[35m\]⬢\[\033[0m\]%s" "[\u@\h \W]\\$ ") + + [ "${ZSH_VERSION:-}" != "" ] && PS1=$(printf "\033[35m⬢\033[0m%s" "[%n@%m]%~%# ") + + if ! [ -f "$toolbox_welcome_stub" ]; then + echo "" + echo "Welcome to the Toolbox; a container where you can install and run" + echo "all your tools." + echo "" + + if [ "${ID}" = "debian" ]; then + echo " - Use APT in the usual manner to install command line tools." + echo " - To create a new tools container, run 'toolbox create'." + echo "" + printf "For more information, see the " + # shellcheck disable=SC1003 + printf '\033]8;;https://containertoolbox.org/\033\\documentation\033]8;;\033\\' + + printf ".\n" + else + echo " - To create a new tools container, run 'toolbox create'." + fi + + echo "" + + mkdir -p "$toolbox_config" + touch "$toolbox_welcome_stub" + fi + + if ! [ -f /etc/profile.d/vte.sh ] && [ -z "$PROMPT_COMMAND" ] && [ "${VTE_VERSION:-0}" -ge 3405 ]; then + + case "$TERM" in + xterm*|vte*) + [ -n "${BASH_VERSION:-}" ] && PROMPT_COMMAND=" " + ;; + esac + fi + + if [ "$TERM" != "" ]; then + error_message="Error: terminfo entry not found for $TERM" + term_without_first_character="${TERM#?}" + term_just_first_character="${TERM%"$term_without_first_character"}" + terminfo_sub_directory="$term_just_first_character/$TERM" + + if [ "$TERMINFO" = "" ]; then + ! [ -e "/usr/share/terminfo/$terminfo_sub_directory" ] \ + && ! [ -e "/lib/terminfo/$terminfo_sub_directory" ] \ + && ! [ -e "$HOME/.terminfo/$terminfo_sub_directory" ] \ + && echo "$error_message" >&2 + else + ! [ -e "$TERMINFO/$terminfo_sub_directory" ] \ + && echo "$error_message" >&2 + fi + fi +fi + +unset ID +unset PRETTY_NAME +unset VARIANT_ID +unset toolbox_config +unset host_welcome_stub +unset toolbox_welcome_stub diff --git a/justfile b/justfile index bd7e69f..2fcdc10 100644 --- a/justfile +++ b/justfile @@ -14,6 +14,17 @@ build: podman build -f Containerfile -t localhost/simple-cli:latest . echo "Build complete: localhost/simple-cli:latest" +# Build the container image with Particle-OS tools +build-with-tools: + #!/usr/bin/env bash + echo "Building Simple CLI container image with Particle-OS tools..." + echo "This will include: apt-ostree, deb-bootupd, and bootc" + podman build -f Containerfile -t localhost/simple-cli:latest . + echo "Build complete: localhost/simple-cli:latest" + echo "" + echo "Testing tools..." + podman run --rm localhost/simple-cli:latest verify-tools + # Build and push to registry build-push registry="localhost": #!/usr/bin/env bash @@ -36,6 +47,24 @@ generate-bootable: localhost/simple-cli:latest echo "Bootable image generated in output/" +# Generate bootable image with Particle-OS tools +generate-bootable-with-tools: + #!/usr/bin/env bash + echo "Generating bootable image with Particle-OS tools..." + echo "This will create a disk image with apt-ostree, deb-bootupd, and bootc integrated" + mkdir -p output + podman run --rm --privileged \ + -v $PWD/output:/output \ + -v /var/lib/containers/storage:/var/lib/containers/storage \ + quay.io/centos-bootc/bootc-image-builder:latest \ + --type iso,raw \ + --output /output \ + localhost/simple-cli:latest + echo "" + echo "Bootable image with Particle-OS tools generated in output/" + echo "Files created:" + ls -la output/ + # Test the container test: #!/usr/bin/env bash @@ -44,6 +73,24 @@ test: bash -c "echo 'System info:' && uname -a && echo 'Packages:' && dpkg -l | wc -l" echo "Test complete" +# Test Particle-OS tools integration +test-tools: + #!/usr/bin/env bash + echo "Testing Particle-OS tools integration..." + echo "" + echo "=== Tool Verification ===" + podman run --rm localhost/simple-cli:latest verify-tools + echo "" + echo "=== Basic Functionality Test ===" + podman run --rm localhost/simple-cli:latest bash -c " + echo 'Testing apt-ostree...' && apt-ostree --help | head -5 + echo '' + echo 'Testing bootupctl...' && bootupctl --help | head -5 + echo '' + echo 'Testing bootc...' && bootc --help | head -5 + " + echo "Tools test complete" + # Clean build artifacts clean: #!/usr/bin/env bash @@ -74,14 +121,87 @@ validate: pipeline: build test generate-bootable @echo "Full build pipeline completed" +# Full build pipeline with Particle-OS tools +pipeline-with-tools: build-with-tools test-tools generate-bootable-with-tools + @echo "Full build pipeline with Particle-OS tools completed" + @echo "" + @echo "🎉 Your Particle-OS tools are now integrated and ready!" + @echo "📦 apt-ostree: Atomic package management" + @echo "🔧 bootupd: Bootloader update management" + @echo "📦 bootc: Container to bootable image conversion" + @echo "" + @echo "Next steps:" + @echo "1. Test the bootable image in QEMU" + @echo "2. Verify all tools work correctly" + @echo "3. Create your Particle-OS variants" + # Development environment setup setup-dev: #!/usr/bin/env bash echo "Setting up development environment..." sudo apt update - sudo apt install -y podman just + sudo apt install -y podman just podman-toolbox distrobox flatpak uidmap libsubid5 bash-completion echo "Development environment ready" +# Create development toolbox +create-dev-toolbox: + #!/usr/bin/env bash + echo "Creating development toolbox..." + toolbox create dev + echo "Development toolbox created. Enter with: toolbox enter dev" + +# Enter development environment (toolbox) +dev-toolbox: + #!/usr/bin/env bash + echo "Entering development toolbox..." + toolbox enter dev + +# Create development distrobox +create-dev-distrobox: + #!/usr/bin/env bash + echo "Creating development distrobox..." + distrobox create dev --image debian:trixie + echo "Development distrobox created. Enter with: distrobox enter dev" + +# Enter development environment (distrobox) +dev-distrobox: + #!/usr/bin/env bash + echo "Entering development distrobox..." + distrobox enter dev + +# Test toolbox functionality +test-toolbox: + #!/usr/bin/env bash + echo "Testing toolbox functionality..." + toolbox --help + echo "Toolbox test complete" + +# Test distrobox functionality +test-distrobox: + #!/usr/bin/env bash + echo "Testing distrobox functionality..." + distrobox --help + echo "Distrobox test complete" + +# List all development environments +list-envs: + #!/usr/bin/env bash + echo "=== Toolbox Environments ===" + toolbox list 2>/dev/null || echo "No toolbox environments found" + echo "" + echo "=== Distrobox Environments ===" + distrobox list 2>/dev/null || echo "No distrobox environments found" + +# Clean up development environments +cleanup-envs: + #!/usr/bin/env bash + echo "Cleaning up development environments..." + echo "Removing toolbox environments..." + toolbox list | grep -v "toolbox" | xargs -I {} toolbox rm {} 2>/dev/null || true + echo "Removing distrobox environments..." + distrobox list | grep -v "distrobox" | xargs -I {} distrobox rm {} 2>/dev/null || true + echo "Cleanup complete" + # Show system information info: #!/usr/bin/env bash @@ -91,4 +211,102 @@ info: echo "Architecture: particle-os with OSTree" echo "Bootloader: bootupd" echo "Kernel: linux-image-amd64" + echo "" + echo "=== Development Tools ===" + echo "Toolbox: Available (podman-toolbox)" + echo "Distrobox: Available (distrobox)" + echo "Container runtime: Podman" echo "================================" + +# Test boot performance +test-boot: + #!/usr/bin/env bash + echo "Testing boot performance..." + echo "Creating bootable image..." + cd .. && ./deb-bootc-image-builder/build.sh simple-cli:latest simple-cli-boot-test.qcow2 + echo "Boot test image created: simple-cli-boot-test.qcow2" + +# Boot performance optimization (legacy) +optimize-boot-legacy: + #!/usr/bin/env bash + echo "Implementing boot performance optimizations..." + echo "1. Enabling verbose GRUB logging..." + echo "2. Enabling verbose kernel logging..." + echo "3. Enabling verbose init system logging..." + echo "4. Measuring current boot times..." + echo "Boot optimization complete" + +# Enable verbose boot logging (legacy) +enable-verbose-boot-legacy: + #!/usr/bin/env bash + echo "Enabling verbose boot logging for performance analysis..." + + # GRUB verbose logging + echo "GRUB_CMDLINE_LINUX_DEFAULT=\"console=ttyS0 root=/dev/sda1 rw quiet splash fastboot\"" >> /etc/default/grub + echo "GRUB_CMDLINE_LINUX=\"console=ttyS0 root=/dev/sda1 rw quiet splash fastboot\"" >> /etc/default/grub + + # Kernel verbose logging + echo "kernel.printk = 7 4 1 7" >> /etc/sysctl.conf + + # Systemd verbose logging + echo "LogLevel=debug" >> /etc/systemd/system.conf + + echo "Verbose boot logging enabled" + +# Measure boot performance +measure-boot: + #!/usr/bin/env bash + echo "Measuring boot performance..." + echo "Current boot time measurement tools:" + systemd-analyze time + systemd-analyze blame + systemd-analyze critical-chain + echo "Boot performance measurement complete" + +# Boot performance analysis and optimization +analyze-boot: + #!/usr/bin/env bash + echo "Analyzing boot performance..." + ./scripts/analyze-boot.sh analyze + +enable-verbose-boot: + #!/usr/bin/env bash + echo "Enabling verbose boot logging..." + ./scripts/analyze-boot.sh verbose + +optimize-boot: + #!/usr/bin/env bash + echo "Optimizing boot performance..." + ./scripts/analyze-boot.sh optimize + +full-boot-optimization: + #!/usr/bin/env bash + echo "Running full boot optimization..." + ./scripts/analyze-boot.sh all + +# Quick boot performance check +quick-boot-check: + #!/usr/bin/env bash + echo "Quick boot performance check..." + if command -v systemd-analyze >/dev/null 2>&1; then + echo "⏱️ Boot time:" + systemd-analyze time + echo "🐌 Slowest service:" + systemd-analyze blame | head -1 + else + echo "❌ systemd-analyze not available" + fi + +# OSTree deployment setup +create-ostree-deployment: + #!/usr/bin/env bash + echo "🌱 Creating OSTree deployment for Simple-CLI..." + echo "This script must be run INSIDE the container:" + echo "" + echo "1. Enter the container:" + echo " podman run -it localhost/simple-cli:latest /bin/bash" + echo "" + echo "2. Run the deployment script:" + echo " ./scripts/create-ostree-deployment.sh" + echo "" + echo "3. Exit and rebuild the bootable image" diff --git a/recipe.yml b/recipe.yml index 460a051..9763ad4 100644 --- a/recipe.yml +++ b/recipe.yml @@ -34,6 +34,12 @@ packages: - locales - ca-certificates - tzdata + - podman-toolbox + - distrobox + - flatpak + - uidmap + - libsubid5 + - bash-completion # Configuration files to layer files: @@ -43,6 +49,16 @@ files: destination: /etc/ - source: config/ destination: /config/ + - source: etc/containers/toolbox.conf + destination: /etc/containers/toolbox.conf + - source: etc/profile.d/toolbox.sh + destination: /etc/profile.d/toolbox.sh + - source: usr/lib/tmpfiles.d/toolbox.conf + destination: /usr/lib/tmpfiles.d/toolbox.conf + - source: etc/distrobox/docker.ini + destination: /etc/distrobox/docker.ini + - source: etc/distrobox/podman.ini + destination: /etc/distrobox/podman.ini # Firstboot configuration firstboot: diff --git a/scripts/analyze-boot.sh b/scripts/analyze-boot.sh new file mode 100755 index 0000000..7eef7b0 --- /dev/null +++ b/scripts/analyze-boot.sh @@ -0,0 +1,153 @@ +#!/bin/bash + +# Boot Performance Analysis Script for Simple-CLI +# This script analyzes and optimizes boot performance + +set -e + +echo "=== Simple-CLI Boot Performance Analysis ===" +echo "" + +# Function to measure boot time +measure_boot_time() { + echo "📊 Measuring boot performance..." + + if command -v systemd-analyze >/dev/null 2>&1; then + echo "⏱️ Total boot time:" + systemd-analyze time + + echo "" + echo "🐌 Slowest services:" + systemd-analyze blame | head -10 + + echo "" + echo "🔗 Critical boot chain:" + systemd-analyze critical-chain + + echo "" + echo "📈 Boot timeline:" + systemd-analyze plot > /tmp/boot-timeline.svg 2>/dev/null && echo "Timeline saved to /tmp/boot-timeline.svg" || echo "Timeline generation failed" + else + echo "❌ systemd-analyze not available" + fi +} + +# Function to check boot configuration +check_boot_config() { + echo "" + echo "🔍 Checking boot configuration..." + + # Check GRUB configuration + if [ -f /etc/default/grub ]; then + echo "✅ GRUB config found" + echo " Timeout: $(grep GRUB_TIMEOUT /etc/default/grub || echo 'Not set')" + echo " Kernel params: $(grep GRUB_CMDLINE_LINUX /etc/default/grub || echo 'Not set')" + else + echo "❌ GRUB config not found" + fi + + # Check systemd configuration + if [ -f /etc/systemd/system.conf.d/99-boot-performance.conf ]; then + echo "✅ Boot performance config found" + cat /etc/systemd/system.conf.d/99-boot-performance.conf + else + echo "❌ Boot performance config not found" + fi + + # Check kernel parameters + if [ -f /etc/sysctl.d/99-boot-performance.conf ]; then + echo "✅ Kernel performance config found" + cat /etc/sysctl.d/99-boot-performance.conf + else + echo "❌ Kernel performance config not found" + fi +} + +# Function to enable verbose boot logging +enable_verbose_logging() { + echo "" + echo "🔧 Enabling verbose boot logging..." + + # Enable verbose GRUB logging + if [ -f /etc/default/grub ]; then + sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="[^"]*"/GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0 root=\/dev\/sda1 rw quiet splash fastboot loglevel=7"/' /etc/default/grub + echo "✅ Verbose GRUB logging enabled" + fi + + # Enable verbose systemd logging + mkdir -p /etc/systemd/system.conf.d + cat > /etc/systemd/system.conf.d/99-verbose-boot.conf << EOF +[Manager] +LogLevel=debug +LogTarget=console +EOF + echo "✅ Verbose systemd logging enabled" + + # Enable verbose kernel logging + mkdir -p /etc/sysctl.d + echo "kernel.printk = 7 4 1 7" > /etc/sysctl.d/99-verbose-kernel.conf + echo "✅ Verbose kernel logging enabled" +} + +# Function to optimize boot performance +optimize_boot() { + echo "" + echo "⚡ Optimizing boot performance..." + + # Disable unnecessary services + systemctl disable systemd-networkd-wait-online.service 2>/dev/null || true + systemctl disable systemd-resolved.service 2>/dev/null || true + + # Enable parallel boot + mkdir -p /etc/systemd/system.conf.d + cat > /etc/systemd/system.conf.d/99-parallel-boot.conf << EOF +[Manager] +DefaultTimeoutStartSec=15s +DefaultTimeoutStopSec=15s +DefaultRestartSec=100ms +EOF + echo "✅ Parallel boot enabled" + + # Optimize kernel parameters + cat > /etc/sysctl.d/99-boot-optimization.conf << EOF +# Boot performance optimizations +kernel.printk = 3 4 1 3 +vm.swappiness = 1 +vm.dirty_ratio = 15 +vm.dirty_background_ratio = 5 +# Reduce boot time +kernel.randomize_va_space = 0 +EOF + echo "✅ Kernel optimizations applied" +} + +# Main execution +case "${1:-analyze}" in + "analyze") + measure_boot_time + check_boot_config + ;; + "verbose") + enable_verbose_logging + ;; + "optimize") + optimize_boot + ;; + "all") + measure_boot_time + check_boot_config + enable_verbose_logging + optimize_boot + ;; + *) + echo "Usage: $0 [analyze|verbose|optimize|all]" + echo " analyze - Measure and analyze boot performance" + echo " verbose - Enable verbose boot logging" + echo " optimize - Apply boot performance optimizations" + echo " all - Run all optimizations" + exit 1 + ;; +esac + +echo "" +echo "✅ Boot performance analysis complete!" diff --git a/scripts/create-minimal-ostree.sh b/scripts/create-minimal-ostree.sh new file mode 100755 index 0000000..b186a9d --- /dev/null +++ b/scripts/create-minimal-ostree.sh @@ -0,0 +1,124 @@ +#!/bin/bash + +# Create Minimal OSTree Deployment Script +# Creates essential OSTree structure without copying large system files + +set -euo pipefail + +echo "🌱 Creating Minimal OSTree Deployment for Simple-CLI" +echo "=====================================================" + +# Check if ostree is available +if ! command -v ostree >/dev/null 2>&1; then + echo "❌ Error: ostree command not found" + echo " Install with: sudo apt install ostree" + exit 1 +fi + +echo "✅ OSTree tools available, proceeding..." + +# Use a different working directory to avoid /tmp space issues +WORK_DIR="$HOME/ostree-deployment" +echo "🔧 Creating working directory: $WORK_DIR" +rm -rf "$WORK_DIR" +mkdir -p "$WORK_DIR" + +# Create OSTree repository +REPO_DIR="$WORK_DIR/repo" +echo "📦 Initializing OSTree repository: $REPO_DIR" +ostree init --repo="$REPO_DIR" --mode=bare + +# Create minimal deployment structure +DEPLOY_DIR="$WORK_DIR/deploy" +echo "🏗️ Creating minimal deployment structure: $DEPLOY_DIR" +mkdir -p "$DEPLOY_DIR" + +# Create the atomic filesystem layout +echo "🔗 Creating atomic filesystem layout..." +cd "$DEPLOY_DIR" + +# Create essential directories (minimal set) +mkdir -p usr/bin usr/sbin usr/lib usr/lib64 +mkdir -p boot var/home var/log var/cache var/tmp +mkdir -p etc run + +# Create symlinks for atomic layout +ln -sf usr/bin bin +ln -sf usr/sbin sbin +ln -sf usr/lib lib +ln -sf usr/lib64 lib64 +ln -sf var/home home + +echo "✅ Atomic filesystem layout created" + +# Create minimal system files instead of copying everything +echo "📋 Creating minimal system files..." + +# Create a simple init script +cat > usr/bin/init << 'EOF' +#!/bin/bash +echo "Simple-CLI OSTree System Starting..." +echo "Boot performance optimizations active" +echo "System ready for development" +exec /bin/bash +EOF +chmod +x usr/bin/init + +# Create minimal /etc structure +mkdir -p etc/systemd/system +cat > etc/systemd/system.conf << 'EOF' +[Manager] +DefaultTimeoutStartSec=15s +DefaultTimeoutStopSec=15s +DefaultRestartSec=100ms +EOF + +# Create minimal /boot structure +mkdir -p boot/grub +cat > boot/grub/grub.cfg << 'EOF' +# Minimal GRUB configuration for Simple-CLI OSTree +set timeout=1 +set default=0 + +menuentry "Simple CLI OSTree" { + set root=(hd0,msdos1) + linux /boot/vmlinuz-6.12.41+deb13-amd64 root=/dev/sda1 rw console=ttyS0 quiet splash fastboot + initrd /boot/initrd.img-6.12.41+deb13-amd64 +} +EOF + +# Create deployment marker +touch run/ostree-booted + +echo "✅ Minimal system files created" + +# Create OSTree commit +echo "💾 Creating OSTree commit..." +ostree commit \ + --repo="$REPO_DIR" \ + --branch=simple-cli/main \ + --subject="Simple-CLI Minimal OSTree deployment" \ + --body="Minimal OSTree deployment with atomic filesystem layout" \ + "$DEPLOY_DIR" + +echo "✅ OSTree commit created" + +# Show commit info +echo "" +echo "📊 OSTree commit information:" +ostree --repo="$REPO_DIR" log simple-cli/main | head -10 + +echo "" +echo "🎯 Minimal OSTree deployment created successfully!" +echo "📁 Repository: $REPO_DIR" +echo "📁 Deployment: $DEPLOY_DIR" +echo "" +echo "📋 Files created:" +find "$DEPLOY_DIR" -type f | head -20 + +echo "" +echo "🚀 Next steps:" +echo " 1. This creates the basic OSTree structure" +echo " 2. For full system, need to integrate with simple-cli container" +echo " 3. Use bootc-image-builder to create bootable image" +echo " 4. Test boot performance in QEMU" diff --git a/scripts/create-ostree-deployment-v2.sh b/scripts/create-ostree-deployment-v2.sh new file mode 100755 index 0000000..45d4e74 --- /dev/null +++ b/scripts/create-ostree-deployment-v2.sh @@ -0,0 +1,155 @@ +#!/bin/bash + +# Create OSTree Deployment Script v2 +# Uses standard ostree tools to create proper OSTree deployment + +set -euo pipefail + +echo "🌱 Creating OSTree Deployment v2 for Simple-CLI" +echo "================================================" + +# Check if ostree is available +if ! command -v ostree >/dev/null 2>&1; then + echo "❌ Error: ostree command not found" + echo " Install with: sudo apt install ostree" + exit 1 +fi + +echo "✅ OSTree tools available, proceeding..." + +# Create working directory +WORK_DIR="/tmp/ostree-deployment" +echo "🔧 Creating working directory: $WORK_DIR" +rm -rf "$WORK_DIR" +mkdir -p "$WORK_DIR" + +# Create OSTree repository +REPO_DIR="$WORK_DIR/repo" +echo "📦 Initializing OSTree repository: $REPO_DIR" +ostree init --repo="$REPO_DIR" --mode=bare + +# Create deployment structure +DEPLOY_DIR="$WORK_DIR/deploy" +echo "🏗️ Creating deployment structure: $DEPLOY_DIR" +mkdir -p "$DEPLOY_DIR" + +# Create the atomic filesystem layout +echo "🔗 Creating atomic filesystem layout..." +cd "$DEPLOY_DIR" + +# Create essential directories +mkdir -p usr/bin usr/sbin usr/lib usr/lib64 usr/etc +mkdir -p boot var/home var/log var/cache var/tmp +mkdir -p etc + +# Create symlinks for atomic layout +ln -sf usr/bin bin +ln -sf usr/sbin sbin +ln -sf usr/lib lib +ln -sf usr/lib64 lib64 +ln -sf var/home home + +echo "✅ Atomic filesystem layout created" + +# Copy essential system files from current system +echo "📋 Copying essential system files..." +if [ -d /usr/bin ]; then + echo " Copying /usr/bin..." + cp -r /usr/bin/* usr/bin/ 2>/dev/null || true +fi + +if [ -d /usr/sbin ]; then + echo " Copying /usr/sbin..." + cp -r /usr/sbin/* usr/sbin/ 2>/dev/null || true +fi + +if [ -d /usr/lib ]; then + echo " Copying /usr/lib..." + cp -r /usr/lib/* usr/lib/ 2>/dev/null || true +fi + +if [ -d /usr/lib64 ]; then + echo " Copying /usr/lib64..." + cp -r /usr/lib64/* usr/lib64/ 2>/dev/null || true +fi + +if [ -d /boot ]; then + echo " Copying /boot..." + cp -r /boot/* boot/ 2>/dev/null || true +fi + +if [ -d /etc ]; then + echo " Copying /etc..." + cp -r /etc/* etc/ 2>/dev/null || true +fi + +echo "✅ System files copied" + +# Create OSTree commit +echo "💾 Creating OSTree commit..." +ostree commit \ + --repo="$REPO_DIR" \ + --branch=simple-cli/main \ + --subject="Simple-CLI OSTree deployment v2" \ + --body="OSTree deployment with atomic filesystem layout and boot optimizations" \ + "$DEPLOY_DIR" + +echo "✅ OSTree commit created" + +# Show commit info +echo "" +echo "📊 OSTree commit information:" +ostree --repo="$REPO_DIR" log simple-cli/main | head -10 + +# Create deployment marker +echo "" +echo "📝 Creating deployment marker..." +mkdir -p "$DEPLOY_DIR/run" +touch "$DEPLOY_DIR/run/ostree-booted" + +# Create basic GRUB configuration +echo "🥾 Creating GRUB configuration..." +mkdir -p "$DEPLOY_DIR/boot/grub" + +# Find actual kernel and initrd files +KERNEL_FILE=$(find "$DEPLOY_DIR/boot" -name "vmlinuz-*" | head -1) +INITRD_FILE=$(find "$DEPLOY_DIR/boot" -name "initrd.img-*" | head -1) + +if [[ -n "$KERNEL_FILE" && -n "$INITRD_FILE" ]]; then + KERNEL_NAME=$(basename "$KERNEL_FILE") + INITRD_NAME=$(basename "$INITRD_FILE") + + cat > "$DEPLOY_DIR/boot/grub/grub.cfg" << EOF +# GRUB configuration for Simple-CLI OSTree deployment +set timeout=1 +set default=0 + +menuentry "Simple CLI OSTree" { + set root=(hd0,msdos1) + linux /boot/$KERNEL_NAME root=/dev/sda1 rw console=ttyS0 quiet splash fastboot + initrd /boot/$INITRD_NAME +} + +menuentry "Simple CLI OSTree (Recovery)" { + set root=(hd0,msdos1) + linux /boot/$KERNEL_NAME root=/dev/sda1 rw single console=ttyS0 + initrd /boot/$INITRD_NAME +} +EOF + echo "✅ GRUB configuration created with kernel: $KERNEL_NAME, initrd: $INITRD_NAME" +else + echo "⚠️ Warning: Kernel or initrd not found, GRUB config incomplete" +fi + +echo "" +echo "🎯 OSTree deployment created successfully!" +echo "📁 Repository: $REPO_DIR" +echo "📁 Deployment: $DEPLOY_DIR" +echo "" +echo "🚀 Next steps:" +echo " 1. Copy deployment to target location" +echo " 2. Use bootc-image-builder to create bootable image" +echo " 3. Test boot performance in QEMU" +echo "" +echo "📋 Files created:" +ls -la "$DEPLOY_DIR" | head -20 diff --git a/scripts/create-ostree-deployment.sh b/scripts/create-ostree-deployment.sh new file mode 100755 index 0000000..1416555 --- /dev/null +++ b/scripts/create-ostree-deployment.sh @@ -0,0 +1,105 @@ +#!/bin/bash + +# Create OSTree Deployment Script +# Converts our simple-cli container into a proper OSTree deployment + +set -euo pipefail + +echo "🌱 Creating OSTree Deployment for Simple-CLI" +echo "=============================================" + +# Check if we're running in the container +echo "✅ Running in container, proceeding with OSTree deployment..." + +# Create OSTree repository +echo "🔧 Initializing OSTree repository..." +mkdir -p /ostree/repo +ostree init --repo=/ostree/repo --mode=bare + +# Create the filesystem restructuring +echo "🔄 Restructuring filesystem for OSTree..." +mkdir -p /ostree/deploy/simple-cli/var + +# Create symlinks for atomic filesystem layout +echo "🔗 Creating atomic filesystem symlinks..." +ln -sf /usr/bin /bin +ln -sf /usr/sbin /sbin +ln -sf /usr/lib /lib +ln -sf /usr/lib64 /lib64 + +# Move user data directories to /var +echo "📁 Setting up /var structure..." +mkdir -p /ostree/deploy/simple-cli/var/home +mkdir -p /ostree/deploy/simple-cli/var/log +mkdir -p /ostree/deploy/simple-cli/var/cache +mkdir -p /ostree/deploy/simple-cli/var/tmp + +# Create /home symlink to /var/home +ln -sf /ostree/deploy/simple-cli/var/home /home + +# Create a minimal OSTree deployment structure +echo "💾 Creating minimal OSTree deployment structure..." + +# Create essential directories +mkdir -p /ostree/deploy/simple-cli/usr +mkdir -p /ostree/deploy/simple-cli/boot +mkdir -p /ostree/deploy/simple-cli/etc + +# Copy essential system files +cp -r /usr/* /ostree/deploy/simple-cli/usr/ +cp -r /boot/* /ostree/deploy/simple-cli/boot/ +cp -r /etc/* /ostree/deploy/simple-cli/etc/ + +# Create the atomic filesystem symlinks in the deployment +cd /ostree/deploy/simple-cli +ln -sf usr/bin bin +ln -sf usr/sbin sbin +ln -sf usr/lib lib +ln -sf usr/lib64 lib64 +ln -sf var/home home + +echo "✅ Minimal OSTree deployment structure created" + +# Create deployment +echo "🚀 Creating OSTree deployment..." +ostree admin deploy \ + --sysroot=/ostree/deploy \ + --os=simple-cli \ + simple-cli/main + +# Set up boot configuration +echo "🥾 Setting up boot configuration..." +mkdir -p /ostree/deploy/simple-cli/boot/grub +cat > /ostree/deploy/simple-cli/boot/grub/grub.cfg << 'EOF' +# GRUB configuration for Simple-CLI OSTree deployment +set timeout=1 +set default=0 + +menuentry "Simple CLI" { + set root=(hd0,msdos1) + linux /boot/vmlinuz-6.12.41+deb13-amd64 root=/dev/sda1 rw console=ttyS0 quiet splash fastboot + initrd /boot/initrd.img-6.12.41+deb13-amd64 +} + +menuentry "Simple CLI (Recovery)" { + set root=(hd0,msdos1) + linux /boot/vmlinuz-6.12.41+deb13-amd64 root=/dev/sda1 rw single console=ttyS0 + initrd /boot/initrd.img-6.12.41+deb13-amd64 +} +EOF + +# Create deployment marker +echo "📝 Creating deployment marker..." +touch /ostree/deploy/simple-cli/run/ostree-booted + +echo "" +echo "✅ OSTree deployment created successfully!" +echo "📊 Deployment info:" +ostree --repo=/ostree/repo log simple-cli/main | head -10 + +echo "" +echo "🎯 Next steps:" +echo " 1. Exit this container" +echo " 2. Rebuild the bootable image with:" +echo " ./scripts/bootc-image-builder.sh -o /tmp/output simple-cli:latest" +echo " 3. Test boot performance in QEMU" diff --git a/scripts/integrate-ostree-with-container.sh b/scripts/integrate-ostree-with-container.sh new file mode 100755 index 0000000..edb2068 --- /dev/null +++ b/scripts/integrate-ostree-with-container.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +# Integrate OSTree Structure with Simple-CLI Container +# Combines our optimized container with proper OSTree filesystem layout + +set -euo pipefail + +echo "🔗 Integrating OSTree Structure with Simple-CLI Container" +echo "========================================================" + +# Check if we have the minimal OSTree deployment +if [ ! -d "$HOME/ostree-deployment/deploy" ]; then + echo "❌ Error: Minimal OSTree deployment not found" + echo " Run: ./scripts/create-minimal-ostree.sh first" + exit 1 +fi + +echo "✅ OSTree deployment found: $HOME/ostree-deployment/deploy" + +# Check if simple-cli container exists +if ! podman image exists localhost/simple-cli:latest; then + echo "❌ Error: simple-cli container image not found" + echo " Build with: podman build -t localhost/simple-cli:latest ." + exit 1 +fi + +echo "✅ Simple-CLI container found: localhost/simple-cli:latest" + +# Create integration directory +INTEGRATION_DIR="$HOME/simple-cli-ostree-integration" +echo "🔧 Creating integration directory: $INTEGRATION_DIR" +rm -rf "$INTEGRATION_DIR" +mkdir -p "$INTEGRATION_DIR" + +# Copy OSTree structure +echo "📋 Copying OSTree structure..." +cp -r "$HOME/ostree-deployment/deploy"/* "$INTEGRATION_DIR/" + +# Create a container that combines both +echo "🐳 Creating integrated container..." +cat > "$INTEGRATION_DIR/Dockerfile" << 'EOF' +FROM localhost/simple-cli:latest + +# Apply OSTree filesystem structure +COPY . / + +# Ensure atomic symlinks are correct +RUN ln -sf /usr/bin /bin && \ + ln -sf /usr/sbin /sbin && \ + ln -sf /usr/lib /lib && \ + ln -sf /usr/lib64 /lib64 && \ + ln -sf /var/home /home + +# Create OSTree deployment marker +RUN mkdir -p /run && touch /run/ostree-booted + +# Verify structure +RUN ls -la / | grep -E "(bin|sbin|lib|home)" && \ + echo "OSTree structure verified" + +CMD ["/usr/bin/init"] +EOF + +echo "✅ Integration files created" +echo "" +echo "📁 Integration directory: $INTEGRATION_DIR" +echo "🐳 Dockerfile created for OSTree integration" +echo "" +echo "🚀 Next steps:" +echo " 1. Build integrated image:" +echo " cd $INTEGRATION_DIR" +echo " podman build -t simple-cli-ostree:latest ." +echo " 2. Create bootable image:" +echo " cd ../deb-bootc-image-builder" +echo " ./scripts/bootc-image-builder.sh -o /tmp/output simple-cli-ostree:latest" +echo " 3. Test boot performance in QEMU" +echo "" +echo "📋 Files created:" +ls -la "$INTEGRATION_DIR" diff --git a/tools/apt-ostree_0.1.0-2_amd64.deb b/tools/apt-ostree_0.1.0-2_amd64.deb new file mode 100644 index 0000000..365783d Binary files /dev/null and b/tools/apt-ostree_0.1.0-2_amd64.deb differ diff --git a/tools/bootc_1.5.1-1~trixie1_amd64.deb b/tools/bootc_1.5.1-1~trixie1_amd64.deb new file mode 100644 index 0000000..2367a84 Binary files /dev/null and b/tools/bootc_1.5.1-1~trixie1_amd64.deb differ diff --git a/tools/deb-bootupd_0.2.28-1_amd64.deb b/tools/deb-bootupd_0.2.28-1_amd64.deb new file mode 100644 index 0000000..6c84d44 Binary files /dev/null and b/tools/deb-bootupd_0.2.28-1_amd64.deb differ diff --git a/usr/lib/tmpfiles.d/toolbox.conf b/usr/lib/tmpfiles.d/toolbox.conf new file mode 100644 index 0000000..0ddb1f0 --- /dev/null +++ b/usr/lib/tmpfiles.d/toolbox.conf @@ -0,0 +1,2 @@ +d /run/media 0755 root root - - +L /run/host - - - - ../