zinit 0.3.9

Process supervisor with dependency management
Documentation
#!/bin/sh
# Alpine-based MyceliumOS Init Script
# Maintains identical flow to original busybox version

if [ ! -c /dev/console ]; then
    mknod /dev/console c 5 1
fi

# Redirect output to console explicitly
exec >/dev/console 2>&1

echo ""
echo "============================================"
echo "==       MyceliumOS ALPINE INITRAMFS        =="
echo "============================================"

echo "[+] creating ram filesystem"
target="/mnt/root"
mkdir -p $target
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t tmpfs tmpfs /mnt/root -o size=1536M
mount -t devtmpfs devtmpfs /dev
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts

# Re-initialize modules dependencies for basic init
depmod -a

echo "[+] building ram filesystem"

# Copy Alpine filesystem to tmpfs (same as original)
echo "  copying /bin..."
cp -ar /bin $target
echo "  copying /etc..."
cp -ar /etc $target
echo "  copying /lib..."
cp -ar /lib* $target
echo "  copying /usr..."
cp -ar /usr $target
echo "  copying /root..."
cp -ar /root $target
echo "  copying /sbin..."
cp -ar /sbin $target
echo "  copying /tmp..."
cp -ar /tmp $target
echo "  copying /var..."
cp -ar /var $target
echo "  copying /run..."
cp -ar /run $target
echo "  creating /home"
mkdir $target/home

# Create essential directories
mkdir -p $target/dev
mkdir -p $target/sys
mkdir -p $target/proc
mkdir -p $target/mnt

# Mount filesystems in tmpfs
mount -t proc proc $target/proc
mount -t sysfs sysfs $target/sys
mount -t devtmpfs devtmpfs $target/dev

# Mount devpts for terminals
mkdir -p $target/dev/pts
mount -t devpts devpts $target/dev/pts

echo "[+] setting environment"
export PATH

echo "[+] probing drivers"
# Use Alpine's udev instead of busybox udevadm
if [ -x /sbin/udevd ]; then
    echo "  starting udevd..."
    udevd --daemon

    # Preload keyboard input modules early so console works before zinit and rfs mounts
    echo "[+] preloading keyboard input modules"
    for m in i8042 atkbd usbhid hid hid_generic evdev xhci_pci xhci_hcd ehci_pci ehci_hcd ohci_pci ohci_hcd uhci_hcd; do
        modprobe "$m"
    done
    echo "[+] loading essential drivers"
    # Load core drivers for storage and network
    /bin/busybox sh -l
    modprobe btrfs 2>/dev/null || true
    modprobe fuse 2>/dev/null || true
    modprobe overlay 2>/dev/null || true

    # Load storage drivers
    modprobe ahci 2>/dev/null || true
    modprobe nvme 2>/dev/null || true
    modprobe virtio_blk 2>/dev/null || true
    modprobe virtio_scsi 2>/dev/null || true
    modprobe virtio_pci 2>/dev/null || true

    # Load network drivers
    modprobe virtio_net 2>/dev/null || true

    echo "  triggering device discovery..."
    udevadm trigger --action=add --type=subsystems
    udevadm trigger --action=add --type=devices
    udevadm trigger --action=add
    udevadm settle

    echo "  stopping udevd..."

    kill $(pidof udevd) || true
else
    echo "  warning: udevd not found, skipping hardware detection"
fi

echo "[+] debug hook: initdebug=true or /init-debug"
if grep -qw "initdebug=true" /proc/cmdline; then
    if [ -x /init-debug ]; then
        echo "  initdebug=true: executing /init-debug ..."
        sh /init-debug
    else
        echo "  initdebug=true: starting interactive shell (no /init-debug). Type 'exit' to continue."
        debug="-d"
        /bin/busybox sh
    fi
elif [ -x /init-debug ]; then
    echo "  executing /init-debug ..."
    sh /init-debug
fi

# Unmount init filesystems
umount /proc 2>/dev/null || true
umount /sys 2>/dev/null || true

echo "[+] switching root"
echo "  exec switch_root /mnt/root /sbin/zinit init"
exec switch_root /mnt/root /sbin/zinit ${debug} init

# switch_root failed, drop into shell
/bin/busybox sh
##