mirror of
https://github.com/johndoe6345789/SparkOS.git
synced 2026-04-24 13:34:56 +00:00
483 lines
16 KiB
Markdown
483 lines
16 KiB
Markdown
# SparkOS
|
|
|
|
A revolutionary operating system that ditches Unix conventions for a modern, network-first approach. SparkOS features:
|
|
|
|
- **Direct Kernel Interface**: Qt6 GUI communicates directly with Linux kernel, bypassing Unix layers
|
|
- **Linux Driver Layer**: All hardware abstraction handled by Linux kernel drivers
|
|
- **No Unix User System**: No users, groups, passwords, or authentication - direct boot to GUI
|
|
- **Network-First Architecture**: Built around networking as the primary paradigm
|
|
- **Qt6 Full-Screen GUI**: Modern graphical interface from boot
|
|
- **Minimal footprint**: Lean system with only essential components
|
|
- **Portable**: dd-able disk image for USB flash drives
|
|
- **Custom init**: Lightweight C init system that launches GUI directly
|
|
- **Immutable base**: Read-only root filesystem with overlay for runtime data
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌─────────────────────────────────────┐
|
|
│ Qt6 GUI Application │
|
|
│ (Direct Framebuffer Rendering) │
|
|
└─────────────────────────────────────┘
|
|
↕
|
|
┌─────────────────────────────────────┐
|
|
│ Linux Kernel │
|
|
│ • Framebuffer (/dev/fb0) │
|
|
│ • Input devices (/dev/input/*) │
|
|
│ • Network stack │
|
|
│ • All hardware drivers │
|
|
└─────────────────────────────────────┘
|
|
↕
|
|
┌─────────────────────────────────────┐
|
|
│ Hardware │
|
|
│ • GPU, Display, Input devices │
|
|
│ • Network adapters │
|
|
│ • Storage, etc. │
|
|
└─────────────────────────────────────┘
|
|
```
|
|
|
|
**Key Design Principles:**
|
|
- Linux kernel provides complete hardware abstraction and driver support
|
|
- Qt6 interfaces directly with kernel through /dev, /proc, /sys interfaces
|
|
- No intermediate Unix layers (no systemd, no user management, no shells by default)
|
|
- Network-first: networking capabilities exposed directly to GUI
|
|
|
|
## MVP Status
|
|
|
|
The current MVP provides:
|
|
- ✅ Custom init system written in C (no external dependencies)
|
|
- ✅ GUI-only architecture (no CLI/shell)
|
|
- ✅ dd-able AMD64 image creation scripts
|
|
- ✅ Minimal root filesystem structure
|
|
- ✅ Build system (Makefile)
|
|
- ✅ Direct network initialization via C ioctl
|
|
- ✅ DNS configuration with public fallback servers
|
|
- ✅ Docker container for testing
|
|
- ✅ Automated builds and publishing to GHCR
|
|
- ✅ Multi-architecture Docker images (AMD64 and ARM64)
|
|
- ✅ CI/CD pipeline for compiled release packages
|
|
- ✅ GitHub releases with pre-built binaries
|
|
|
|
## Prerequisites
|
|
|
|
To build SparkOS, you need:
|
|
|
|
- GCC compiler
|
|
- GNU Make
|
|
- Linux system (for building)
|
|
|
|
To create bootable images (optional):
|
|
- Root privileges
|
|
- `syslinux` bootloader
|
|
- `parted` partitioning tool
|
|
- `losetup` for loop devices
|
|
- `mkfs.ext4` filesystem tools
|
|
|
|
## Quick Start
|
|
|
|
### Using UEFI-Bootable Disk Image (Recommended - Boot from USB)
|
|
|
|
Download the UEFI-bootable image from the [GitHub Releases page](https://github.com/johndoe6345789/SparkOS/releases):
|
|
|
|
```bash
|
|
# Download the disk image (replace VERSION with actual version, e.g., v1.0.0)
|
|
wget https://github.com/johndoe6345789/SparkOS/releases/download/VERSION/sparkos.img.gz
|
|
|
|
# Decompress the image
|
|
gunzip sparkos.img.gz
|
|
|
|
# Write to USB drive (Linux - BE CAREFUL!)
|
|
sudo dd if=sparkos.img of=/dev/sdX bs=4M status=progress oflag=sync
|
|
```
|
|
|
|
**⚠️ WARNING**: Replace `/dev/sdX` with your actual USB device (e.g., `/dev/sdb`). This will **DESTROY ALL DATA** on the target drive!
|
|
|
|
**Boot Instructions:**
|
|
1. Insert the USB drive into a UEFI-capable system
|
|
2. Enter BIOS/UEFI settings (usually F2, F12, DEL, or ESC at boot)
|
|
3. Select the USB drive as boot device
|
|
4. SparkOS will boot automatically
|
|
|
|
The UEFI-bootable disk image includes:
|
|
- ✅ **UEFI boot support** with GRUB bootloader
|
|
- ✅ **GPT partition table** with ESP (EFI System Partition)
|
|
- ✅ **Linux kernel** ready to boot
|
|
- ✅ **SparkOS init system** (completely self-contained, no external dependencies)
|
|
- ✅ **Ready to boot** - Direct to Qt6 GUI, no CLI
|
|
|
|
### Using Pre-built Binary Package
|
|
|
|
Download the binary package from the [GitHub Releases page](https://github.com/johndoe6345789/SparkOS/releases):
|
|
|
|
```bash
|
|
# Download the latest release (replace VERSION with actual version, e.g., v1.0.0)
|
|
wget https://github.com/johndoe6345789/SparkOS/releases/download/VERSION/sparkos-release.zip
|
|
|
|
# Extract the package
|
|
unzip sparkos-release.zip
|
|
cd sparkos/
|
|
|
|
# The init binary is already compiled and ready to use
|
|
ls -lh init
|
|
|
|
# Copy to your rootfs or use directly
|
|
cp init /path/to/your/rootfs/sbin/init
|
|
```
|
|
|
|
The release package includes:
|
|
- Pre-compiled init binary (statically linked, ready to use)
|
|
- Complete source code
|
|
- Build scripts and configuration
|
|
- Root filesystem structure
|
|
- Full documentation
|
|
|
|
### Using Docker (Recommended for Testing)
|
|
|
|
The easiest way to test SparkOS is using the pre-built Docker image from GitHub Container Registry:
|
|
|
|
```bash
|
|
# Pull and run the latest image (automatically selects the correct architecture)
|
|
docker pull ghcr.io/johndoe6345789/sparkos:latest
|
|
docker run --rm ghcr.io/johndoe6345789/sparkos:latest
|
|
|
|
# Or build locally
|
|
docker build -t sparkos:local .
|
|
docker run --rm sparkos:local
|
|
|
|
# Or use Docker Compose for even simpler testing
|
|
docker-compose up
|
|
|
|
# Build for specific architecture
|
|
docker buildx build --platform linux/amd64 -t sparkos:amd64 --load .
|
|
docker buildx build --platform linux/arm64 -t sparkos:arm64 --load .
|
|
```
|
|
|
|
The Docker image includes:
|
|
- Pre-built init system binary
|
|
- Minimal root filesystem structure
|
|
- Test environment for validation
|
|
- **No CLI tools**: Pure GUI-only architecture
|
|
- **Multi-architecture support**: Available for both AMD64 (x86_64) and ARM64 (aarch64) architectures
|
|
|
|
When you run the Docker image, it automatically verifies:
|
|
- Custom init system binary (statically linked, no dependencies)
|
|
- Root filesystem structure
|
|
|
|
Images are automatically built and published to [GitHub Container Registry](https://github.com/johndoe6345789/SparkOS/pkgs/container/sparkos) on every push to main branch.
|
|
|
|
**Building Releases with Docker (No Root Required):**
|
|
|
|
Create release packages easily using Docker without needing root privileges or special tools:
|
|
|
|
```bash
|
|
# Build a release package for version v1.0.0
|
|
./scripts/docker-release.sh v1.0.0
|
|
|
|
# The release ZIP will be created in release/sparkos-release.zip
|
|
# This is the same artifact that GitHub Actions creates
|
|
```
|
|
|
|
### Building the Init System
|
|
|
|
```bash
|
|
# Build the init binary
|
|
make init
|
|
|
|
# Or use the quick build script
|
|
./scripts/build.sh
|
|
```
|
|
|
|
### Setting Up Root Filesystem
|
|
|
|
```bash
|
|
# Create the root filesystem structure
|
|
./scripts/setup_rootfs.sh
|
|
|
|
# Install init to rootfs
|
|
make install
|
|
```
|
|
|
|
### Creating a UEFI-Bootable Image
|
|
|
|
**Using Docker (Recommended - No Root Required):**
|
|
|
|
Build UEFI-bootable disk images easily using Docker without needing root privileges on your host:
|
|
|
|
```bash
|
|
# Build the UEFI-bootable disk image using Docker
|
|
make image-docker
|
|
|
|
# Or use the script directly
|
|
./scripts/build-image.sh
|
|
|
|
# The compressed UEFI-bootable image will be in release/sparkos.img.gz
|
|
```
|
|
|
|
This creates a complete UEFI-bootable image with:
|
|
- GPT partition table
|
|
- EFI System Partition (ESP) with FAT32
|
|
- GRUB UEFI bootloader
|
|
- Linux kernel
|
|
- SparkOS init system (no external dependencies)
|
|
|
|
**Traditional Method (Requires Root):**
|
|
|
|
⚠️ **Warning**: This method is for creating custom partitioned images and requires root privileges.
|
|
|
|
```bash
|
|
# Install required tools (Ubuntu/Debian)
|
|
sudo apt-get install syslinux parted
|
|
|
|
# Build everything and create image
|
|
make all
|
|
sudo make image
|
|
```
|
|
|
|
### Installing to USB Drive
|
|
|
|
Once you have created the `sparkos.img` file, use the installation script to write it to a USB drive or storage device:
|
|
|
|
```bash
|
|
# Use the installation script (RECOMMENDED)
|
|
sudo ./scripts/install.sh /dev/sdX
|
|
|
|
# The script will:
|
|
# - Validate the target drive
|
|
# - Display warnings about data destruction
|
|
# - Require confirmation before proceeding
|
|
# - Show progress during installation
|
|
# - Verify successful installation
|
|
```
|
|
|
|
Replace `/dev/sdX` with your actual USB device (e.g., `/dev/sdb`, `/dev/nvme1n1`).
|
|
|
|
**⚠️ WARNING**: This will permanently erase all data on the target drive!
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
SparkOS/
|
|
├── .github/ # GitHub Actions workflows
|
|
│ └── workflows/
|
|
│ └── docker-publish.yml # Docker build and publish workflow
|
|
├── config/ # Build configuration files
|
|
│ └── build.conf # Build parameters
|
|
├── scripts/ # Build and setup scripts
|
|
│ ├── build.sh # Quick build script
|
|
│ ├── setup_rootfs.sh # Root filesystem setup
|
|
│ ├── create_image.sh # Image creation script
|
|
│ └── install.sh # Installation script for USB drives
|
|
├── src/ # Source code
|
|
│ └── init.c # Custom init system
|
|
├── rootfs/ # Root filesystem (generated)
|
|
│ ├── bin/ # Essential binaries
|
|
│ ├── sbin/ # System binaries
|
|
│ ├── etc/ # Configuration files
|
|
│ └── ... # Standard FHS directories
|
|
├── Dockerfile # Docker image definition
|
|
├── Makefile # Build system
|
|
└── README.md # This file
|
|
```
|
|
|
|
## Architecture
|
|
|
|
### Init System
|
|
|
|
SparkOS uses a custom init system (`/sbin/init`) that:
|
|
- Mounts essential filesystems (proc, sys, dev, tmp) via direct system calls
|
|
- Initializes network interfaces via direct C ioctl calls
|
|
- Spawns Qt6 GUI application directly
|
|
- Handles process reaping
|
|
- Respawns GUI on exit
|
|
- **No external dependencies**: Completely self-contained
|
|
|
|
### Root Filesystem
|
|
|
|
Minimal filesystem structure for GUI-only OS:
|
|
- `/sbin`: Init binary only
|
|
- `/etc`: Minimal system configuration
|
|
- `/proc`, `/sys`, `/dev`: Kernel interfaces
|
|
- `/tmp`: Temporary files
|
|
- `/usr`: Qt6 GUI application and libraries
|
|
- `/var`: Variable data (overlay mount)
|
|
- `/root`: Root home
|
|
|
|
### Networking
|
|
|
|
SparkOS provides network initialization through direct C code:
|
|
- **Interface Management**: Direct ioctl calls to bring up network interfaces
|
|
- **DNS**: Fallback to public DNS servers (8.8.8.8, 8.8.4.4, 1.1.1.1, 1.0.0.1)
|
|
- **DHCP**: Managed by Qt6 NetworkManager in GUI
|
|
- **WiFi**: Configured through Qt6 GUI
|
|
|
|
## Development
|
|
|
|
### CI/CD and Docker
|
|
|
|
SparkOS uses GitHub Actions for continuous integration and delivery:
|
|
|
|
**Automated Builds:**
|
|
- Docker images are automatically built on every push to main/develop branches
|
|
- Compiled release packages are automatically built on every push to main/develop branches
|
|
- Both are also built for pull requests (testing only, not published)
|
|
- Tagged releases automatically create versioned Docker images and GitHub releases with compiled binaries
|
|
- **Multi-architecture builds**: Images are built for both AMD64 (x86_64) and ARM64 (aarch64)
|
|
|
|
**Compiled Releases:**
|
|
- Pre-compiled init binaries are available as GitHub releases for version tags
|
|
- Release packages include: compiled init binary, source code, build scripts, and documentation
|
|
- Download releases from the [GitHub Releases page](https://github.com/johndoe6345789/SparkOS/releases)
|
|
- Build artifacts are available for all workflow runs (retained for 90 days)
|
|
|
|
**Container Registry:**
|
|
- Images are published to GitHub Container Registry (GHCR)
|
|
- Pull images: `docker pull ghcr.io/johndoe6345789/sparkos:latest`
|
|
- Available tags: `latest`, `main`, `develop`, version tags (e.g., `v1.0.0`)
|
|
- Docker will automatically select the correct architecture for your platform
|
|
|
|
**Docker Development:**
|
|
```bash
|
|
# Build Docker image locally
|
|
docker build -t sparkos:dev .
|
|
|
|
# Build for multiple architectures (requires Docker Buildx)
|
|
docker buildx build --platform linux/amd64,linux/arm64 -t sparkos:multiarch .
|
|
|
|
# Test the image
|
|
docker run --rm sparkos:dev
|
|
|
|
# Or use Docker Compose
|
|
docker-compose up
|
|
|
|
# Inspect the init binary
|
|
docker run --rm sparkos:dev sh -c "ls -lh /sparkos/rootfs/sbin/init"
|
|
```
|
|
|
|
### Creating Releases
|
|
|
|
**Using Docker (Recommended - No Root Required):**
|
|
|
|
Build release packages locally using Docker without needing root privileges:
|
|
|
|
```bash
|
|
# Build a release package
|
|
./scripts/docker-release.sh v1.0.0
|
|
|
|
# The release ZIP will be in release/sparkos-release.zip
|
|
# This is identical to what GitHub Actions creates
|
|
```
|
|
|
|
**Creating a GitHub Release:**
|
|
|
|
1. **Commit and push your changes** to the main branch
|
|
2. **Create and push a version tag:**
|
|
```bash
|
|
git tag v1.0.0
|
|
git push origin v1.0.0
|
|
```
|
|
3. **GitHub Actions will automatically:**
|
|
- Build the init binary
|
|
- Create the release package ZIP
|
|
- Build and publish Docker images (AMD64 + ARM64)
|
|
- Create a GitHub Release with the artifacts
|
|
- Publish to GitHub Container Registry
|
|
|
|
The release will be available at:
|
|
- **GitHub Releases:** https://github.com/johndoe6345789/SparkOS/releases
|
|
- **Docker Images:** `ghcr.io/johndoe6345789/sparkos:v1.0.0`
|
|
|
|
**Manual Release Creation:**
|
|
|
|
You can also create a release manually:
|
|
1. Go to https://github.com/johndoe6345789/SparkOS/releases/new
|
|
2. Choose or create a tag (e.g., `v1.0.0`)
|
|
3. Fill in the release title and description
|
|
4. Upload the `sparkos-release.zip` (built locally with `docker-release.sh`)
|
|
5. Publish the release
|
|
|
|
For detailed instructions on creating releases, see [RELEASING.md](RELEASING.md).
|
|
|
|
### Building Components
|
|
|
|
```bash
|
|
# Build init system only
|
|
make init
|
|
|
|
# Build release package using Docker
|
|
make docker-release
|
|
|
|
# Install to rootfs
|
|
make install
|
|
|
|
# Clean build artifacts
|
|
make clean
|
|
|
|
# Show help
|
|
make help
|
|
```
|
|
|
|
### Adding Components to Root Filesystem
|
|
|
|
To create a fully functional bootable system:
|
|
|
|
```bash
|
|
# Required components:
|
|
# 1. Qt6 GUI application - Build with make gui
|
|
# 2. Qt6 libraries - Copy Qt6 runtime libraries to rootfs/usr/lib
|
|
# 3. Linux kernel - Include kernel binary for bootloader
|
|
|
|
# Qt6 GUI is built and installed via:
|
|
make gui
|
|
make install # Installs to rootfs/usr/bin/sparkos-gui
|
|
|
|
# Note: Qt6 must be compiled with linuxfb support for framebuffer rendering
|
|
```
|
|
|
|
## Future Roadmap
|
|
|
|
- [ ] Qt6/QML full screen GUI implementation
|
|
- [ ] Wayland compositor integration
|
|
- [ ] Network management via Qt6 NetworkManager
|
|
- [ ] WiFi configuration through GUI
|
|
- [ ] Advanced network configuration UI
|
|
- [ ] System settings and configuration UI
|
|
|
|
## Contributing
|
|
|
|
Contributions are welcome! This is an early-stage project focused on:
|
|
1. Maintaining minimal footprint
|
|
2. Clean, readable code
|
|
3. Proper documentation
|
|
4. GUI-only architecture (no CLI/shell)
|
|
|
|
## License
|
|
|
|
See LICENSE file for details.
|
|
|
|
## Notes
|
|
|
|
This is an MVP implementation. The system currently provides:
|
|
- Custom init system with direct network initialization
|
|
- GUI-only architecture (no CLI/shell)
|
|
- Build infrastructure
|
|
- Image creation tooling
|
|
- Self-contained init with no external dependencies
|
|
|
|
To create a fully bootable system, you'll also need:
|
|
- Linux kernel binary (`vmlinuz`) with framebuffer and networking support
|
|
- Qt6 GUI application (sparkos-gui)
|
|
- Qt6 runtime libraries
|
|
- Bootloader installation (handled by scripts)
|
|
|
|
Minimum System Requirements:
|
|
- Kernel: Linux kernel with framebuffer and networking support
|
|
- Init: Custom SparkOS init (included, no dependencies)
|
|
- GUI: Qt6 application with linuxfb platform support
|
|
- Libraries: Qt6 runtime libraries for GUI
|
|
|
|
System Philosophy:
|
|
- **No CLI tools**: Everything through Qt6 GUI
|
|
- **No shell**: Direct kernel-to-GUI communication
|
|
- **No busybox**: Self-contained init system
|
|
- **Network-first**: Networking integrated into GUI
|