Splux Linux

source-based Linux using SPS

Install


Splux is installed from a live ISO. Packages are compiled on that live system into a target root. Pick a tab. Hash URLs stay on the method: #setup, #manual, #slim.

Which ISO. Source install needs sps-live-tty.iso or sps-live-plasma.iso. Those discs carry sps-core, sps-extra, and a seed compiler. sps-live-tty-slim.iso does not. Compare images in the live images chapter.

Guided setup

setup is the Splux installer. It is not a generic SPS or LFS installer. Dialog screens collect the same choices you can pass as flags. It never guesses a disk for grub-install.

1. Download and verify

Get sps-live-tty.iso (or the Plasma image). Check it on the machine that downloaded it:

sha256sum -c SHA256SUMS

Current published tag: live-2026-09-06-1 (2026-09-06). Signatures are not published yet.

2. Write the image

dd if=sps-live-tty.iso of=/dev/sdX bs=4M status=progress conv=fsync

Replace /dev/sdX with the USB device. That command erases the destination.

3. Boot

Boot the "SPS Linux live (Splux)" entry. Login is root with an empty password. On Plasma, open Konsole. Live PATH often omits /sbin:

export PATH=/sbin:/usr/sbin:/usr/bin:/bin:$PATH

For QEMU, give the guest a writable second disk. The live image never runs grub-install on its own.

4. Run setup

setup

Profiles: minimal, server, plasma-desktop, plasma-full. Init: systemd, OpenRC, s6, runit, dinit, Shepherd, or SysV. Those packages conflict. Guided partitioning waits until the last confirmation. Kernel none is the interactive default for a console profile; a disk that must boot itself needs linux-desktop or linux.

Non-interactive examples:

setup --plan --profile plasma-desktop --target /mnt --user alex

setup --non-interactive \
  --profile minimal \
  --target /mnt \
  --hostname darkstar \
  --timezone UTC \
  --keymap us \
  --locale C.UTF-8 \
  --init systemd \
  --kernel linux-desktop \
  --partition efi-swap-root \
  --disk /dev/sda \
  --format yes \
  --bootloader grub \
  --install-bootloader \
  --user alex

--plan and --non-interactive never touch a disk unless you pass --disk and --format yes together. grub-install still needs --install-bootloader and --disk.

Profiles and kernels

ProfilePackages (plus init and kernel you select)
minimalbase-system dialog splux-base fastfetch
serverminimal, plus openssh gnupg rsync sudo
plasma-desktopminimal, plus Plasma, SDDM, Mesa, PipeWire, portals
plasma-fullplasma-desktop, plus kde-apps firefox flatpak

setup --list-profiles and setup --list-sets print the catalog. Optional sets cover SSH, printing, Flatpak, NVIDIA, firmware, and more. --kernel is none, linux, linux-desktop, or custom.

Partition layouts

LayoutGPT map
efi-root512MiB ESP, rest root
efi-swap-rootESP, swap (default 8GiB), rest root
efi-swap-root-homeESP, swap, 48GiB root, rest home
bios-root1MiB BIOS boot, rest root
existing / manageyou mount or name partitions

Formats match the installer: ESP is FAT32 labeled SPS_EFI, root is ext4 labeled sps-root, swap is labeled sps-swap. /etc/fstab is written from blkid UUIDs when setup partitioned the disk.

What setup does

It writes hostname, timezone, keymap, locale, and /etc/sps/init, copies bundled recipe trees when they exist, writes sps.conf, runs src update, then sget install. Users land after packages so filesystem's passwd file is already there. If you passed --install-bootloader, it runs live grub-install (EFI removable EFI/BOOT/BOOTX64.EFI, then NVRAM via efibootmgr when that binary exists; BIOS uses i386-pc). It does not run grub-mkconfig. See /root/sps-bootloader.txt on the target.

A Plasma install compiles Qt and KDE and takes a long time. See setup(1) for every flag.

Manual install (no setup)

This is the same work setup does, written as shell commands. It uses tools that exist on sps-live-tty.iso (the Plasma ISO has the same installer stack). Do not follow this chapter on slim.

Tools on the tty disc. SPS (src, sget, mkpkg, pkin, and the rest), gcc/g++, make, cmake, ninja, meson, python3, perl, git, curl, wget, tar, xz, gzip, zstd, nano, vim, dialog, openssl, lsblk, blkid, sfdisk, cfdisk, fdisk, wipefs, mkfs.ext4, mkfs.vfat, mkswap, partprobe, dhcpcd, grub-install, grub-mkconfig, efibootmgr (when the builder had it), plus busybox sh, mount, chroot, passwd. Recipes are at /usr/src/sps/core and /usr/src/sps/extra.

  1. Boot tty and fix PATH. Login is root with an empty password.

    export PATH=/sbin:/usr/sbin:/usr/bin:/bin:$PATH
    lsblk -o NAME,SIZE,TYPE,TRAN,MODEL

    Pick a writable disk that is not the live USB. On QEMU that is the second disk. Optional DHCP: dhcpcd.

  2. Partition and format. Use the firmware tabs. Names: /dev/sda1 versus /dev/nvme0n1p1. These layouts match setup.

    ESP (type EFI System), swap, then Linux root. Default swap size is 8GiB, same as setup.

    DISK=/dev/sda
    wipefs -a "$DISK"
    sfdisk --wipe always --wipe-partitions always "$DISK" <<'EOF'
    label: gpt
    size=512MiB, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, name=EFI
    size=8GiB, type=0657FD6D-A4AB-43C4-84E5-0933C84B4F4F, name=swap
    type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, name=root
    EOF
    partprobe "$DISK"
    
    EFI=${DISK}1
    SWAP=${DISK}2
    ROOT=${DISK}3
    # nvme: EFI=${DISK}p1 and so on
    
    mkfs.vfat -F 32 -n SPS_EFI "$EFI"
    mkswap -L sps-swap "$SWAP"
    mkfs.ext4 -F -L sps-root "$ROOT"
    
    mount "$ROOT" /mnt
    mount -o remount,rw,exec,suid,dev /mnt
    mkdir -p /mnt/boot/efi
    mount "$EFI" /mnt/boot/efi
    swapon "$SWAP"

    No swap: omit the swap line in the sfdisk script (setup layout efi-root) and skip mkswap / swapon. Separate /home: setup layout efi-swap-root-home uses a 48GiB root then the rest as home; format that partition ext4 labeled sps-home and mount it on /mnt/home.

    cfdisk "$DISK" is on the disc if you want a TUI instead of a script. Types: EFI System, Linux swap, Linux filesystem.

    1MiB BIOS boot partition (GRUB GPT), then Linux root. No ESP.

    DISK=/dev/sda
    wipefs -a "$DISK"
    sfdisk --wipe always --wipe-partitions always "$DISK" <<'EOF'
    label: gpt
    size=1MiB, type=21686148-6449-6E6F-744E-656564454649, name=BIOS
    type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, name=root
    EOF
    partprobe "$DISK"
    
    ROOT=${DISK}2
    mkfs.ext4 -F -L sps-root "$ROOT"
    mount "$ROOT" /mnt
    mount -o remount,rw,exec,suid,dev /mnt

    The remount matters. Autoconf runs conftests on this mount; a noexec or nodev root fails those builds.

  3. Target directories and sps.conf. sget will not run without a config.

    mkdir -p /mnt/etc/sps /mnt/usr/src/sps /mnt/root
    if [ -f /etc/sps/live ] && [ -f /etc/sps/sps.conf ]; then
      cp /etc/sps/sps.conf /mnt/etc/sps/sps.conf
    else
      cat > /mnt/etc/sps/sps.conf <<'EOF'
    db /var/lib/sps
    cache /var/cache/sps
    build /var/tmp/sps
    repo_root /usr/src/sps
    makejobs auto
    cflags -O2 -pipe
    cxxflags -O2 -pipe
    march native
    compression auto
    preserve etc
    EOF
    fi
  4. Copy bundled recipes. tty and Plasma already have them. Copying avoids a git clone during src update.

    cp -a /usr/src/sps/core/. /mnt/usr/src/sps/core/
    cp -a /usr/src/sps/extra/. /mnt/usr/src/sps/extra/
    rm -rf /mnt/usr/src/sps/core/.git /mnt/usr/src/sps/extra/.git
    
    cat > /mnt/etc/sps/repos.conf <<'EOF'
    dir core /mnt/usr/src/sps/core 100
    dir extra /mnt/usr/src/sps/extra 80
    
    # Community is not enabled by default.
    # git community https://github.com/RobertFlexx/sps-community.git 50
    EOF

    Those paths are for indexing from the live system. After packages you rewrite them to /usr/src/sps/... for the booted machine.

  5. Point SPS at /mnt and record init. Write /etc/sps/init before the first package so service hooks see it. The init packages conflict.

    export SPS_ROOT=/mnt
    unset SPS_DB SPS_CACHE SPS_BUILD SPS_CONFIG SPS_REPOS_CONFIG SPS_REPO_ROOT
    printf '%s\n' systemd > /mnt/etc/sps/init
    # later: sget install init-systemd

    PID 1 is systemd, with udev and logind. Interactive setup defaults to systemd when the live disc recorded that init.

    printf '%s\n' openrc > /mnt/etc/sps/init
    # later: sget install init-openrc

    OpenRC plus eudev and elogind. Enable services with rc-update after boot.

    printf '%s\n' s6 > /mnt/etc/sps/init
    # later: sget install init-s6

    s6 plus eudev and elogind. Enabled longruns live in /etc/s6/enabled.

    printf '%s\n' runit > /mnt/etc/sps/init
    # later: sget install init-runit

    runit plus eudev and elogind. Enable with a symlink in /etc/runit/runsvdir/default.

    printf '%s\n' dinit > /mnt/etc/sps/init
    # later: sget install init-dinit

    dinit plus eudev and elogind. Enable by linking into /etc/dinit.d/boot.d.

    printf '%s\n' shepherd > /mnt/etc/sps/init
    # later: sget install init-shepherd

    GNU Shepherd plus eudev, elogind, and Guile. Services are Scheme files under /etc/shepherd.d.

    printf '%s\n' sysvinit > /mnt/etc/sps/init
    # later: sget install init-sysvinit

    SysV init plus eudev and elogind. Service scripts land in /etc/rc.d/init.d. Enable with S* links in rc2.d through rc5.d.

  6. Probe the live compiler, then install packages. Fail here rather than inside the first autoconf package.

    printf '%s\n' 'int main(void){return 0;}' | gcc -x c - -o /tmp/sps-cc-probe
    rm -f /tmp/sps-cc-probe
    meson --version
    
    src update
    
    sget install base-system dialog splux-base fastfetch
    sget install init-systemd
    sget install linux-desktop
    sget install grub

    Replace init-systemd with the package from the init tab. base-system is a metapackage (shell, coreutils, curl, git, e2fsprogs, busybox, shadow, tzdata, and the rest of the essential userland). splux-base is branding and os-release. linux-desktop is the Splux daily-driver kernel and installs /boot/vmlinuz-desktop-7.2.2. linux is upstream defconfig (/boot/vmlinuz-7.2.2). Skipping a kernel package will not boot a new disk.

    Server add-ons: sget install openssh gnupg rsync sudo. Plasma add-ons are the plasma-desktop profile set (Plasma, SDDM, Mesa, PipeWire, portals) and compile for a long time.

  7. Rewrite repos.conf for the booted system.

    cat > /mnt/etc/sps/repos.conf <<'EOF'
    dir core /usr/src/sps/core 100
    dir extra /usr/src/sps/extra 80
    
    # Community is not enabled by default.
    # git community https://github.com/RobertFlexx/sps-community.git 50
    EOF
  8. Hostname, locale, keymap, timezone, fstab. Do this after packages so filesystem has already laid down passwd and a stub fstab. tzdata is in base-system; the live disc also has /usr/share/zoneinfo from the seed.

    printf '%s\n' darkstar > /mnt/etc/hostname
    printf '%s\n' UTC > /mnt/etc/timezone
    printf 'KEYMAP=%s\n' us > /mnt/etc/vconsole.conf
    printf 'keymap %s\n' us > /mnt/etc/sps/keymap
    printf 'LANG=%s\n' C.UTF-8 > /mnt/etc/locale.conf
    cp /usr/share/zoneinfo/UTC /mnt/etc/localtime
    
    ROOT_UUID=$(blkid -s UUID -o value "$ROOT")
    {
      printf '%s\n' '# /etc/fstab'
      printf 'UUID=%s / ext4 defaults 1 1\n' "$ROOT_UUID"
      if [ -n "$EFI" ]; then
        printf 'UUID=%s /boot/efi vfat umask=0077 0 2\n' \
          "$(blkid -s UUID -o value "$EFI")"
      fi
      if [ -n "$SWAP" ]; then
        printf 'UUID=%s none swap defaults 0 0\n' \
          "$(blkid -s UUID -o value "$SWAP")"
      fi
    } > /mnt/etc/fstab
  9. Users. After shadow / filesystem exist. setup uses uid 1000 and groups wheel, audio, video, input, kvm, users. Busybox passwd can set a hash in the live tree; openssl passwd -6 is on the disc too.

    # example: lock root until you set a password, add user alex
    # edit /mnt/etc/passwd /mnt/etc/group /mnt/etc/shadow, or:
    mkdir -p /mnt/home/alex
    printf '%s\n' 'alex:x:1000:1000:alex:/home/alex:/bin/sh' >> /mnt/etc/passwd
    printf '%s\n' 'alex:x:1000:' >> /mnt/etc/group
    printf '%s\n' 'alex:!:0:0:99999:7:::' >> /mnt/etc/shadow
    chown -R 1000:1000 /mnt/home/alex
    chmod 0750 /mnt/home/alex
    # add alex to wheel,audio,video,input,kvm,users in /mnt/etc/group
    chroot /mnt passwd root
    chroot /mnt passwd alex

    A full chroot for passwd needs a working target userland (after base-system). If chroot cannot run the target passwd, set hashes from the live system with openssl passwd -6 and put the hash in the shadow field.

  10. Bootloader. Explicit, same as setup. Run it after grub and a kernel are installed. Use the live grub-install pointed at the mounted tree.

    UEFI (writes \EFI\BOOT\BOOTX64.EFI, no NVRAM required):

    grub-install --target=x86_64-efi \
      --efi-directory=/mnt/boot/efi \
      --boot-directory=/mnt/boot \
      --removable --no-nvram \
      "$DISK"
    if command -v efibootmgr >/dev/null 2>&1; then
      grub-install --target=x86_64-efi \
        --efi-directory=/mnt/boot/efi \
        --bootloader-id=SPS \
        --boot-directory=/mnt/boot \
        "$DISK" || printf '%s\n' 'NVRAM update failed; removable path is in place'
    fi

    BIOS:

    grub-install --target=i386-pc --boot-directory=/mnt/boot "$DISK"

    setup does not run grub-mkconfig. After the kernel is in /mnt/boot:

    mount --bind /dev /mnt/dev
    mount --bind /proc /mnt/proc
    mount --bind /sys /mnt/sys
    chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg
  11. Unmount and reboot.

    umount /mnt/dev /mnt/proc /mnt/sys 2>/dev/null || :
    swapoff -a
    umount /mnt/boot/efi 2>/dev/null || :
    umount /mnt
    reboot

    Continue in After first boot.

Time and limits

Source install compiles on the live compiler into SPS_ROOT. linux-desktop is a kernel build. Plasma is Qt and KDE. Leave it running.

Packages are linked against the live C library. There is no glibc recipe in sps-core yet. That is the same for setup and this chapter. Splux is still under testing; a first boot needs the kernel, an init, GRUB, and a userland that can actually start.

Slim ISO

sps-live-tty-slim.iso is the small console image from make iso-slim (--no-seed --no-modules, no --core, no --extra). It is a rescue and disk tool. It is not a Splux source-install disc.

What slim cannot do. No gcc, no make, no git, no python, no meson, no recipes, no live kernel modules. repos.conf lists git URLs for core and extra, but git is not on the image, so src update cannot clone them. Community stays a comment. setup is present because SPS is installed on every live root; it still cannot build packages here.

What is on the disc

ClassCommands
SPSsrc sget mkpkg pkin pkdel pkstat pkcheck pkmark setup mkiso
Disklsblk blkid sfdisk cfdisk fdisk wipefs mkfs.ext4 mke2fs mkfs.vfat mkswap partprobe
Bootgrub-install grub-mkconfig, and efibootmgr when the builder had it
Networkhost dhcpcd; busybox udhcpc, wget, ip, ifconfig, ping
Crypto / linkeropenssl ldd ldconfig
Busyboxsh vi mount umount chroot tar gzip xz passwd sha256sum modprobe fdisk mkswap and the rest of the applet list. No git. No zstd applet. No nano / vim.

Boot and PATH

export PATH=/sbin:/usr/sbin:/usr/bin:/bin:$PATH
lsblk -o NAME,SIZE,TYPE,TRAN,MODEL

Login is root with an empty password. Edit files with busybox vi.

Network

ip link
dhcpcd
# if dhcpcd is missing or the interface needs busybox:
udhcpc -i eth0
ping -c 1 1.1.1.1
wget -O - https://splux.robertflexx.dev/ > /dev/null

wget can fetch SHA256SUMS or another ISO. It cannot replace git for src update.

Partition and filesystems

The same sfdisk / mkfs.ext4 / mkfs.vfat / mkswap commands as the manual tty chapter work here. That only prepares disks. It does not install Splux. Typical rescue:

lsblk
# mount an existing Splux or other Linux root
mount /dev/sda2 /mnt
mount /dev/sda1 /mnt/boot/efi
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt /bin/sh

Reinstall GRUB from slim onto a disk that already has a /boot tree, using live grub-install the same way the tty chapter does. You still need a kernel and userland on that disk already.

Why setup fails here

setup copies recipes from /usr/src/sps/{core,extra} when those trees exist. On slim they do not, so it would try git clones. git is missing. Even with recipes, the live gcc probe fails because there is no compiler. Use tty or Plasma for install.

Download the install disc from another machine, or from slim if you have network and a place to write it, then reboot into tty:

# on a machine that can download:
# sps-live-tty.iso from https://github.com/RobertFlexx/SPS/releases/latest

Full install: setup tab or manual tab.

Splux is under active development. These snapshots track installer and live-session work. They are not a numbered stable release.