mirror of
https://github.com/johndoe6345789/SparkOS.git
synced 2026-04-25 14:04:57 +00:00
382 lines
10 KiB
Bash
Executable File
382 lines
10 KiB
Bash
Executable File
#!/bin/bash
|
|
# SparkOS Setup Script
|
|
# Sets up a minimal rootfs with busybox and essential utilities
|
|
# Note: This script runs on the host system and uses bash for ${BASH_SOURCE}
|
|
# The target system uses busybox sh instead.
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
ROOTFS_DIR="$PROJECT_ROOT/rootfs"
|
|
|
|
echo "SparkOS Root Filesystem Setup"
|
|
echo "=============================="
|
|
echo ""
|
|
|
|
# Create directory structure
|
|
echo "Creating directory structure..."
|
|
mkdir -p "$ROOTFS_DIR"/{bin,sbin,etc,proc,sys,dev,tmp,usr/{bin,sbin,lib,lib64},var,root,home}
|
|
mkdir -p "$ROOTFS_DIR/etc"/{init.d,network}
|
|
mkdir -p "$ROOTFS_DIR/var"/{log,run}
|
|
mkdir -p "$ROOTFS_DIR/home/spark"
|
|
mkdir -p "$ROOTFS_DIR/etc/sudoers.d"
|
|
|
|
# Set permissions
|
|
chmod 1777 "$ROOTFS_DIR/tmp"
|
|
chmod 700 "$ROOTFS_DIR/root"
|
|
chmod 755 "$ROOTFS_DIR/home/spark"
|
|
|
|
# Create basic config files
|
|
echo "Creating configuration files..."
|
|
|
|
# /etc/hostname
|
|
echo "sparkos" > "$ROOTFS_DIR/etc/hostname"
|
|
|
|
# /etc/hosts
|
|
cat > "$ROOTFS_DIR/etc/hosts" << 'EOF'
|
|
127.0.0.1 localhost
|
|
127.0.1.1 sparkos
|
|
::1 localhost ip6-localhost ip6-loopback
|
|
EOF
|
|
|
|
# /etc/passwd
|
|
cat > "$ROOTFS_DIR/etc/passwd" << 'EOF'
|
|
root:x:0:0:root:/root:/bin/sh
|
|
spark:x:1000:1000:SparkOS User:/home/spark:/bin/sh
|
|
EOF
|
|
|
|
# /etc/group
|
|
cat > "$ROOTFS_DIR/etc/group" << 'EOF'
|
|
root:x:0:
|
|
spark:x:1000:
|
|
sudo:x:27:spark
|
|
EOF
|
|
|
|
# /etc/fstab
|
|
cat > "$ROOTFS_DIR/etc/fstab" << 'EOF'
|
|
# <file system> <mount point> <type> <options> <dump> <pass>
|
|
proc /proc proc defaults 0 0
|
|
sysfs /sys sysfs defaults 0 0
|
|
devtmpfs /dev devtmpfs defaults 0 0
|
|
tmpfs /tmp tmpfs defaults 0 0
|
|
EOF
|
|
|
|
# /etc/resolv.conf - DNS configuration
|
|
cat > "$ROOTFS_DIR/etc/resolv.conf" << 'EOF'
|
|
# SparkOS DNS Configuration
|
|
# Fallback to public DNS servers for reliability
|
|
nameserver 8.8.8.8
|
|
nameserver 8.8.4.4
|
|
nameserver 1.1.1.1
|
|
nameserver 1.0.0.1
|
|
EOF
|
|
|
|
# /etc/sudoers - Sudo configuration
|
|
cat > "$ROOTFS_DIR/etc/sudoers" << 'EOF'
|
|
# SparkOS Sudoers Configuration
|
|
# Allow spark user to run any command without password
|
|
|
|
# Default settings
|
|
Defaults env_reset
|
|
Defaults secure_path="/bin:/sbin:/usr/bin:/usr/sbin"
|
|
|
|
# Root can run anything
|
|
root ALL=(ALL:ALL) ALL
|
|
|
|
# Spark user can run anything without password
|
|
spark ALL=(ALL:ALL) NOPASSWD: ALL
|
|
|
|
# Include sudoers.d directory
|
|
@includedir /etc/sudoers.d
|
|
EOF
|
|
|
|
chmod 0440 "$ROOTFS_DIR/etc/sudoers"
|
|
|
|
# /etc/network/interfaces - Wired network configuration
|
|
cat > "$ROOTFS_DIR/etc/network/interfaces" << 'EOF'
|
|
# SparkOS Network Configuration
|
|
# Wired networking only for bootstrapping
|
|
|
|
# Loopback interface
|
|
auto lo
|
|
iface lo inet loopback
|
|
|
|
# Primary wired interface (DHCP)
|
|
auto eth0
|
|
iface eth0 inet dhcp
|
|
EOF
|
|
|
|
# /etc/profile
|
|
cat > "$ROOTFS_DIR/etc/profile" << 'EOF'
|
|
# SparkOS System Profile
|
|
|
|
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
|
|
export PS1='SparkOS:\w\$ '
|
|
export TERM=linux
|
|
|
|
# Set HOME based on user
|
|
if [ "$(id -u)" = "0" ]; then
|
|
export HOME=/root
|
|
else
|
|
export HOME=/home/$(whoami)
|
|
fi
|
|
|
|
# Welcome message
|
|
echo "Welcome to SparkOS!"
|
|
echo "Type 'help' for available commands"
|
|
echo ""
|
|
EOF
|
|
|
|
# Create .profile for root (busybox uses .profile instead of .bashrc)
|
|
cat > "$ROOTFS_DIR/root/.profile" << 'EOF'
|
|
# SparkOS Root Shell Configuration
|
|
|
|
# Set prompt
|
|
PS1='SparkOS:\w# '
|
|
|
|
# Aliases
|
|
alias ll='ls -lah'
|
|
alias ..='cd ..'
|
|
|
|
# Environment
|
|
export EDITOR=vi
|
|
export PAGER=less
|
|
EOF
|
|
|
|
# Create .profile for spark user
|
|
cat > "$ROOTFS_DIR/home/spark/.profile" << 'EOF'
|
|
# SparkOS User Shell Configuration
|
|
|
|
# Set prompt
|
|
PS1='SparkOS:\w\$ '
|
|
|
|
# Aliases
|
|
alias ll='ls -lah'
|
|
alias ..='cd ..'
|
|
|
|
# Environment
|
|
export EDITOR=vi
|
|
export PAGER=less
|
|
EOF
|
|
|
|
# Create clone-sparkos.sh script for spark user
|
|
cat > "$ROOTFS_DIR/home/spark/clone-sparkos.sh" << 'EOF'
|
|
#!/bin/sh
|
|
# SparkOS CLI Installation Script
|
|
# This script clones the SparkOS CLI repository
|
|
|
|
echo "SparkOS CLI Installation"
|
|
echo "========================"
|
|
echo ""
|
|
|
|
SPARK_REPO="https://github.com/johndoe6345789/spark-cli.git"
|
|
INSTALL_DIR="$HOME/spark-cli"
|
|
|
|
echo "This script will clone the SparkOS CLI to: $INSTALL_DIR"
|
|
echo ""
|
|
|
|
# Check if git is available
|
|
if ! command -v git >/dev/null 2>&1; then
|
|
echo "Error: git is not installed"
|
|
echo "Please install git to continue"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if directory already exists
|
|
if [ -d "$INSTALL_DIR" ]; then
|
|
echo "Warning: $INSTALL_DIR already exists"
|
|
echo -n "Do you want to remove it and re-clone? (y/N): "
|
|
read answer
|
|
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
|
|
rm -rf "$INSTALL_DIR"
|
|
else
|
|
echo "Installation cancelled"
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
# Clone the repository
|
|
echo "Cloning spark CLI repository..."
|
|
if git clone "$SPARK_REPO" "$INSTALL_DIR"; then
|
|
echo ""
|
|
echo "SparkOS CLI cloned successfully!"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo " 1. cd $INSTALL_DIR"
|
|
echo " 2. Follow the installation instructions in the repository"
|
|
echo ""
|
|
else
|
|
echo ""
|
|
echo "Error: Failed to clone repository"
|
|
echo "Please check your network connection and try again"
|
|
exit 1
|
|
fi
|
|
EOF
|
|
|
|
chmod +x "$ROOTFS_DIR/home/spark/clone-sparkos.sh"
|
|
|
|
# Create a simple help script
|
|
cat > "$ROOTFS_DIR/bin/sparkos-help" << 'EOF'
|
|
#!/bin/sh
|
|
cat << 'HELP'
|
|
SparkOS - Minimal Linux Distribution
|
|
====================================
|
|
|
|
Default Packages:
|
|
- Kernel (Linux)
|
|
- Init system (custom)
|
|
- Busybox (shell and utilities)
|
|
- Git (for installing spark CLI)
|
|
- Sudo (privilege elevation)
|
|
|
|
Default User:
|
|
Username: spark
|
|
Home: /home/spark
|
|
Privileges: Full sudo access (no password required)
|
|
|
|
To run commands as root: sudo <command>
|
|
To become root: sudo -i
|
|
|
|
Available commands:
|
|
ls, cd, pwd - Navigate filesystem
|
|
cat, less - View files
|
|
mkdir, rm, cp - File operations
|
|
mount, umount - Mount filesystems
|
|
ip, ifconfig - Network configuration
|
|
ping, wget - Network testing
|
|
git - Version control
|
|
sudo - Run commands as root
|
|
poweroff, reboot - System control
|
|
help - Show this help
|
|
|
|
Network:
|
|
Wired networking (eth0) configured via DHCP
|
|
DNS: 8.8.8.8, 1.1.1.1 (Google and Cloudflare)
|
|
To check network: ping 8.8.8.8
|
|
To test DNS: ping google.com
|
|
|
|
Next Steps:
|
|
1. Install spark CLI: ~/clone-sparkos.sh
|
|
2. Use spark CLI to configure WiFi and system
|
|
3. Install additional packages as needed
|
|
|
|
For more information: https://github.com/johndoe6345789/SparkOS
|
|
HELP
|
|
EOF
|
|
|
|
chmod +x "$ROOTFS_DIR/bin/sparkos-help"
|
|
ln -sf sparkos-help "$ROOTFS_DIR/bin/help"
|
|
|
|
# Create network initialization script
|
|
cat > "$ROOTFS_DIR/sbin/init-network" << 'EOF'
|
|
#!/bin/sh
|
|
# SparkOS Network Initialization
|
|
# Brings up wired networking for system bootstrap
|
|
|
|
echo "Initializing network..."
|
|
|
|
# Bring up loopback
|
|
ip link set lo up 2>/dev/null || ifconfig lo up 2>/dev/null
|
|
|
|
# Bring up primary wired interface with DHCP
|
|
# Try eth0 first, then other common interface names
|
|
for iface in eth0 enp0s3 enp0s8 ens33; do
|
|
if ip link show "$iface" >/dev/null 2>&1; then
|
|
echo "Bringing up $iface..."
|
|
|
|
# Bring up the interface
|
|
if ip link set "$iface" up 2>/dev/null || ifconfig "$iface" up 2>/dev/null; then
|
|
# Try to get IP via DHCP using busybox udhcpc
|
|
if command -v udhcpc >/dev/null 2>&1; then
|
|
# Run udhcpc in background, it will daemonize itself
|
|
udhcpc -i "$iface" -b -t 5 2>/dev/null
|
|
fi
|
|
else
|
|
echo "Warning: Failed to bring up $iface"
|
|
fi
|
|
break
|
|
fi
|
|
done
|
|
|
|
echo "Network initialization complete"
|
|
EOF
|
|
|
|
chmod +x "$ROOTFS_DIR/sbin/init-network"
|
|
|
|
# Create README
|
|
cat > "$ROOTFS_DIR/README.txt" << 'EOF'
|
|
SparkOS Root Filesystem
|
|
=======================
|
|
|
|
This is the root filesystem for SparkOS, a minimal Linux distribution.
|
|
|
|
Minimal System Packages:
|
|
- Linux Kernel (with networking support)
|
|
- SparkOS Init System (custom)
|
|
- Busybox (shell, utilities, networking)
|
|
- Git (for installing spark CLI)
|
|
- Sudo (privilege elevation)
|
|
|
|
Directory Structure:
|
|
/bin, /sbin - Essential binaries
|
|
/etc - Configuration files
|
|
/proc, /sys, /dev - Kernel interfaces
|
|
/tmp - Temporary files
|
|
/usr - User programs
|
|
/var - Variable data
|
|
/root - Root home directory
|
|
/home/spark - Default user home directory
|
|
|
|
Default User:
|
|
Username: spark (UID 1000)
|
|
Home: /home/spark
|
|
Sudo: Full access without password
|
|
Scripts: ~/clone-sparkos.sh for installing spark CLI
|
|
|
|
Network Configuration:
|
|
/etc/network/interfaces - Wired network (DHCP)
|
|
/etc/resolv.conf - DNS configuration (8.8.8.8, 1.1.1.1)
|
|
/sbin/init-network - Network initialization script
|
|
|
|
Bootstrap Process:
|
|
1. System boots as 'spark' user with wired networking (DHCP)
|
|
2. Run ~/clone-sparkos.sh to install spark CLI
|
|
3. Use spark CLI to configure WiFi and system
|
|
4. Install additional packages via spark CLI
|
|
5. Use 'sudo' for any root-level operations
|
|
|
|
Note: This is a minimal system. You'll need to populate /bin and /usr/bin
|
|
with actual binaries (busybox, git, sudo) from a proper Linux system
|
|
or by cross-compiling.
|
|
EOF
|
|
|
|
echo ""
|
|
echo "Root filesystem structure created at: $ROOTFS_DIR"
|
|
echo ""
|
|
echo "User configuration:"
|
|
echo " - Default user: spark (UID 1000)"
|
|
echo " - Home directory: /home/spark"
|
|
echo " - Sudo access: Enabled (no password required)"
|
|
echo " - Clone script: /home/spark/clone-sparkos.sh"
|
|
echo ""
|
|
echo "Network configuration:"
|
|
echo " - Wired networking (DHCP) configured for eth0"
|
|
echo " - DNS: 8.8.8.8, 1.1.1.1, 8.8.4.4, 1.0.0.1"
|
|
echo " - Network init script: /sbin/init-network"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo " 1. Build init: make init"
|
|
echo " 2. Install init: make install"
|
|
echo " 3. Copy busybox, git, and sudo binaries to rootfs/bin/"
|
|
echo " 4. Create busybox symlinks"
|
|
echo " 5. Create bootable image: sudo make image"
|
|
echo ""
|
|
echo "Minimum required binaries:"
|
|
echo " - busybox (provides shell, networking, utilities)"
|
|
echo " - git (for installing spark CLI)"
|
|
echo " - sudo (for privilege elevation)"
|
|
echo ""
|
|
echo "Note: Busybox should be compiled with networking support"
|
|
echo " (CONFIG_UDHCPC, CONFIG_IFCONFIG, CONFIG_IP, CONFIG_PING, CONFIG_WGET)"
|