mirror of
https://github.com/johndoe6345789/SparkOS.git
synced 2026-04-24 13:34:56 +00:00
Replace bash with busybox for minimal footprint
Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com>
This commit is contained in:
@@ -26,7 +26,7 @@ Follows the Filesystem Hierarchy Standard (FHS):
|
|||||||
|
|
||||||
```
|
```
|
||||||
/
|
/
|
||||||
├── bin/ Essential user binaries (bash, ls, cp, etc.)
|
├── bin/ Essential user binaries (busybox with symlinks)
|
||||||
├── sbin/ System binaries (init, mount, etc.)
|
├── sbin/ System binaries (init, mount, etc.)
|
||||||
├── etc/ System configuration files
|
├── etc/ System configuration files
|
||||||
├── proc/ Kernel process information (virtual)
|
├── proc/ Kernel process information (virtual)
|
||||||
@@ -71,7 +71,7 @@ Init System (/sbin/init) [PID 1]
|
|||||||
↓
|
↓
|
||||||
Mount filesystems
|
Mount filesystems
|
||||||
↓
|
↓
|
||||||
Spawn bash shell
|
Spawn busybox sh shell
|
||||||
↓
|
↓
|
||||||
User interaction
|
User interaction
|
||||||
```
|
```
|
||||||
@@ -91,11 +91,12 @@ User interaction
|
|||||||
- **Portability**: Works on any Linux system
|
- **Portability**: Works on any Linux system
|
||||||
- **Reliability**: No missing library issues
|
- **Reliability**: No missing library issues
|
||||||
|
|
||||||
### Why Bash?
|
### Why Busybox?
|
||||||
|
|
||||||
- **Familiar**: Most users know bash
|
- **Minimal**: Single binary provides dozens of utilities
|
||||||
- **Powerful**: Full scripting capabilities
|
- **Small footprint**: Typically <1MB for full feature set
|
||||||
- **Standard**: Available on virtually all Linux systems
|
- **Efficient**: Less memory and storage overhead than full GNU coreutils
|
||||||
|
- **Standard**: De facto standard for embedded Linux systems
|
||||||
|
|
||||||
## Future Architecture
|
## Future Architecture
|
||||||
|
|
||||||
@@ -132,7 +133,7 @@ User interaction
|
|||||||
## Performance
|
## Performance
|
||||||
|
|
||||||
- Fast boot time (seconds, not minutes)
|
- Fast boot time (seconds, not minutes)
|
||||||
- Low memory footprint (~100MB base system)
|
- Low memory footprint (~50MB base system with busybox)
|
||||||
- No unnecessary background services
|
- No unnecessary background services
|
||||||
- Efficient init system
|
- Efficient init system
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,8 @@ SparkOS aims to be:
|
|||||||
- Comment complex logic
|
- Comment complex logic
|
||||||
|
|
||||||
- **Shell Scripts**: Follow Google Shell Style Guide
|
- **Shell Scripts**: Follow Google Shell Style Guide
|
||||||
- Use `#!/bin/bash` shebang
|
- Use `#!/bin/sh` for POSIX-compliant scripts (preferred for busybox compatibility)
|
||||||
|
- Use `#!/bin/bash` only when bash-specific features are required
|
||||||
- Quote variables
|
- Quote variables
|
||||||
- Use meaningful variable names
|
- Use meaningful variable names
|
||||||
|
|
||||||
|
|||||||
24
README.md
24
README.md
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
A minimal Linux distribution designed for simplicity and portability. SparkOS features:
|
A minimal Linux distribution designed for simplicity and portability. SparkOS features:
|
||||||
|
|
||||||
- **Minimal footprint**: Barebones Linux system with bash shell
|
- **Minimal footprint**: Barebones Linux system with busybox shell
|
||||||
- **Portable**: dd-able disk image for USB flash drives
|
- **Portable**: dd-able disk image for USB flash drives
|
||||||
- **Custom init**: Lightweight C init system
|
- **Custom init**: Lightweight C init system
|
||||||
- **Future-ready**: Designed to support Qt6/QML GUI and Wayland
|
- **Future-ready**: Designed to support Qt6/QML GUI and Wayland
|
||||||
@@ -12,7 +12,7 @@ A minimal Linux distribution designed for simplicity and portability. SparkOS fe
|
|||||||
|
|
||||||
The current MVP provides:
|
The current MVP provides:
|
||||||
- ✅ Custom init system written in C
|
- ✅ Custom init system written in C
|
||||||
- ✅ Working bash shell environment
|
- ✅ Working busybox shell environment
|
||||||
- ✅ dd-able AMD64 image creation scripts
|
- ✅ dd-able AMD64 image creation scripts
|
||||||
- ✅ Minimal root filesystem structure
|
- ✅ Minimal root filesystem structure
|
||||||
- ✅ Build system (Makefile)
|
- ✅ Build system (Makefile)
|
||||||
@@ -99,7 +99,7 @@ SparkOS/
|
|||||||
|
|
||||||
SparkOS uses a custom init system (`/sbin/init`) that:
|
SparkOS uses a custom init system (`/sbin/init`) that:
|
||||||
- Mounts essential filesystems (proc, sys, dev, tmp)
|
- Mounts essential filesystems (proc, sys, dev, tmp)
|
||||||
- Spawns a bash login shell
|
- Spawns a busybox sh login shell
|
||||||
- Handles process reaping
|
- Handles process reaping
|
||||||
- Respawns shell on exit
|
- Respawns shell on exit
|
||||||
|
|
||||||
@@ -138,14 +138,18 @@ make help
|
|||||||
To create a fully functional system, you need to populate the rootfs with binaries:
|
To create a fully functional system, you need to populate the rootfs with binaries:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Example: Add bash (statically linked is best)
|
# Example: Add busybox (statically linked is best)
|
||||||
cp /bin/bash rootfs/bin/
|
cp /bin/busybox rootfs/bin/
|
||||||
|
|
||||||
# Example: Add essential utilities
|
# Create busybox symlinks for common utilities
|
||||||
cp /bin/{ls,cat,mkdir,rm,cp,mount} rootfs/bin/
|
cd rootfs/bin
|
||||||
|
for cmd in sh ls cat mkdir rm cp mount umount chmod chown ln; do
|
||||||
|
ln -sf busybox $cmd
|
||||||
|
done
|
||||||
|
cd ../..
|
||||||
|
|
||||||
# Copy required libraries if not static
|
# If using dynamically linked busybox, copy required libraries
|
||||||
ldd rootfs/bin/bash # Check dependencies
|
ldd rootfs/bin/busybox # Check dependencies
|
||||||
# Copy libraries to rootfs/lib or rootfs/lib64
|
# Copy libraries to rootfs/lib or rootfs/lib64
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -184,7 +188,7 @@ To create a fully bootable system, you'll also need:
|
|||||||
- Bootloader installation (handled by scripts)
|
- Bootloader installation (handled by scripts)
|
||||||
A single binary on top of Linux / Wayland that manages the OS, C++ CLI and Qt6/QML Full screen GUI. Android like design but more desktop orientated. A distribution that can be dd'ed to a USB flash drive. Root elevation powered by sudo. This project will need to set up a barebones distro (doesn't really need to be based on another, to keep things clean)
|
A single binary on top of Linux / Wayland that manages the OS, C++ CLI and Qt6/QML Full screen GUI. Android like design but more desktop orientated. A distribution that can be dd'ed to a USB flash drive. Root elevation powered by sudo. This project will need to set up a barebones distro (doesn't really need to be based on another, to keep things clean)
|
||||||
|
|
||||||
MVP is just a to get to a bash prompt with sudo support. Install minimum on system, maybe even use busybox.
|
MVP is just a to get to a shell prompt with sudo support. Install minimum on system using busybox for minimal footprint.
|
||||||
|
|
||||||
We should try to build the system with github actions if possible.
|
We should try to build the system with github actions if possible.
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ BOOTLOADER=syslinux
|
|||||||
INIT=sparkos-init
|
INIT=sparkos-init
|
||||||
|
|
||||||
# Default shell
|
# Default shell
|
||||||
SHELL=/bin/bash
|
SHELL=/bin/sh
|
||||||
|
|
||||||
# Compiler flags
|
# Compiler flags
|
||||||
CFLAGS=-Wall -O2 -static
|
CFLAGS=-Wall -O2 -static
|
||||||
|
|||||||
@@ -14,5 +14,5 @@ Directory Structure:
|
|||||||
/home - User home directories
|
/home - User home directories
|
||||||
|
|
||||||
Note: This is a minimal system. You'll need to populate /bin and /usr/bin
|
Note: This is a minimal system. You'll need to populate /bin and /usr/bin
|
||||||
with actual binaries (bash, coreutils, etc.) from a proper Linux system
|
with actual binaries (busybox, etc.) from a proper Linux system
|
||||||
or by cross-compiling.
|
or by cross-compiling.
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
root:x:0:0:root:/root:/bin/bash
|
root:x:0:0:root:/root:/bin/sh
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
# SparkOS Root Bash Configuration
|
# SparkOS Root Shell Configuration
|
||||||
|
|
||||||
# Set prompt
|
# Set prompt
|
||||||
PS1='SparkOS:\w# '
|
PS1='SparkOS:\w# '
|
||||||
|
|
||||||
# Aliases
|
# Aliases
|
||||||
alias ls='ls --color=auto'
|
|
||||||
alias ll='ls -lah'
|
alias ll='ls -lah'
|
||||||
alias ..='cd ..'
|
alias ..='cd ..'
|
||||||
|
|
||||||
@@ -28,9 +28,10 @@ echo ""
|
|||||||
echo "Build complete!"
|
echo "Build complete!"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Next steps to create a full bootable system:"
|
echo "Next steps to create a full bootable system:"
|
||||||
echo " 1. Populate rootfs/bin with bash and essential utilities"
|
echo " 1. Copy busybox to rootfs/bin/"
|
||||||
echo " (cp /bin/bash rootfs/bin/, etc.)"
|
echo " (cp /bin/busybox rootfs/bin/)"
|
||||||
echo " 2. Copy required libraries to rootfs/usr/lib and rootfs/lib"
|
echo " 2. Create symlinks in rootfs/bin for common utilities"
|
||||||
|
echo " (cd rootfs/bin && for cmd in sh ls cat mkdir rm cp mount; do ln -sf busybox \$cmd; done)"
|
||||||
echo " 3. Add a Linux kernel to rootfs/boot/vmlinuz"
|
echo " 3. Add a Linux kernel to rootfs/boot/vmlinuz"
|
||||||
echo " 4. Run: sudo make image"
|
echo " 4. Run: sudo make image"
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# SparkOS Setup Script
|
# SparkOS Setup Script
|
||||||
# Sets up a minimal rootfs with bash and essential utilities
|
# Sets up a minimal rootfs with busybox and essential utilities
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ EOF
|
|||||||
|
|
||||||
# /etc/passwd
|
# /etc/passwd
|
||||||
cat > "$ROOTFS_DIR/etc/passwd" << 'EOF'
|
cat > "$ROOTFS_DIR/etc/passwd" << 'EOF'
|
||||||
root:x:0:0:root:/root:/bin/bash
|
root:x:0:0:root:/root:/bin/sh
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# /etc/group
|
# /etc/group
|
||||||
@@ -69,15 +69,14 @@ echo "Type 'help' for available commands"
|
|||||||
echo ""
|
echo ""
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Create .bashrc for root
|
# Create .profile for root (busybox uses .profile instead of .bashrc)
|
||||||
cat > "$ROOTFS_DIR/root/.bashrc" << 'EOF'
|
cat > "$ROOTFS_DIR/root/.profile" << 'EOF'
|
||||||
# SparkOS Root Bash Configuration
|
# SparkOS Root Shell Configuration
|
||||||
|
|
||||||
# Set prompt
|
# Set prompt
|
||||||
PS1='SparkOS:\w# '
|
PS1='SparkOS:\w# '
|
||||||
|
|
||||||
# Aliases
|
# Aliases
|
||||||
alias ls='ls --color=auto'
|
|
||||||
alias ll='ls -lah'
|
alias ll='ls -lah'
|
||||||
alias ..='cd ..'
|
alias ..='cd ..'
|
||||||
|
|
||||||
@@ -131,7 +130,7 @@ Directory Structure:
|
|||||||
/home - User home directories
|
/home - User home directories
|
||||||
|
|
||||||
Note: This is a minimal system. You'll need to populate /bin and /usr/bin
|
Note: This is a minimal system. You'll need to populate /bin and /usr/bin
|
||||||
with actual binaries (bash, coreutils, etc.) from a proper Linux system
|
with actual binaries (busybox, etc.) from a proper Linux system
|
||||||
or by cross-compiling.
|
or by cross-compiling.
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
@@ -141,8 +140,8 @@ echo ""
|
|||||||
echo "Next steps:"
|
echo "Next steps:"
|
||||||
echo " 1. Build init: make init"
|
echo " 1. Build init: make init"
|
||||||
echo " 2. Install init: make install"
|
echo " 2. Install init: make install"
|
||||||
echo " 3. Copy bash and essential binaries to rootfs/bin/"
|
echo " 3. Copy busybox to rootfs/bin/ and create symlinks"
|
||||||
echo " 4. Create bootable image: sudo make image"
|
echo " 4. Create bootable image: sudo make image"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Note: You'll need to populate the rootfs with actual binaries"
|
echo "Note: You'll need to populate the rootfs with busybox binary"
|
||||||
echo " before creating a bootable image."
|
echo " before creating a bootable image."
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ static void spawn_shell() {
|
|||||||
|
|
||||||
if (pid == 0) {
|
if (pid == 0) {
|
||||||
// Child process - exec shell
|
// Child process - exec shell
|
||||||
char *argv[] = {"/bin/bash", "--login", NULL};
|
char *argv[] = {"/bin/sh", "-l", NULL};
|
||||||
char *envp[] = {
|
char *envp[] = {
|
||||||
"HOME=/root",
|
"HOME=/root",
|
||||||
"PATH=/bin:/sbin:/usr/bin:/usr/sbin",
|
"PATH=/bin:/sbin:/usr/bin:/usr/sbin",
|
||||||
@@ -38,11 +38,7 @@ static void spawn_shell() {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
execve("/bin/bash", argv, envp);
|
execve("/bin/sh", argv, envp);
|
||||||
|
|
||||||
// If bash fails, try sh
|
|
||||||
char *sh_argv[] = {"/bin/sh", NULL};
|
|
||||||
execve("/bin/sh", sh_argv, envp);
|
|
||||||
|
|
||||||
perror("failed to exec shell");
|
perror("failed to exec shell");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|||||||
Reference in New Issue
Block a user