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.
- Guided setup on tty or Plasma
- Manual install from the tty ISO, without
setup - Slim image (rescue, not a source install)
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
| Profile | Packages (plus init and kernel you select) |
|---|---|
minimal | base-system dialog splux-base fastfetch |
server | minimal, plus openssh gnupg rsync sudo |
plasma-desktop | minimal, plus Plasma, SDDM, Mesa, PipeWire, portals |
plasma-full | plasma-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
| Layout | GPT map |
|---|---|
efi-root | 512MiB ESP, rest root |
efi-swap-root | ESP, swap (default 8GiB), rest root |
efi-swap-root-home | ESP, swap, 48GiB root, rest home |
bios-root | 1MiB BIOS boot, rest root |
existing / manage | you 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.
-
Boot tty and fix PATH. Login is
rootwith 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. -
Partition and format. Use the firmware tabs. Names:
/dev/sda1versus/dev/nvme0n1p1. These layouts matchsetup.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 skipmkswap/swapon. Separate/home: setup layoutefi-swap-root-homeuses a 48GiB root then the rest as home; format that partition ext4 labeledsps-homeand 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 /mntThe remount matters. Autoconf runs conftests on this mount; a
noexecornodevroot fails those builds. -
Target directories and sps.conf.
sgetwill 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
-
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. -
Point SPS at /mnt and record init. Write
/etc/sps/initbefore 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
setupdefaults 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-updateafter 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 withS*links inrc2.dthroughrc5.d. -
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 grubReplace
init-systemdwith the package from the init tab.base-systemis a metapackage (shell, coreutils, curl, git, e2fsprogs, busybox, shadow, tzdata, and the rest of the essential userland).splux-baseis branding and os-release.linux-desktopis the Splux daily-driver kernel and installs/boot/vmlinuz-desktop-7.2.2.linuxis 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. -
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
-
Hostname, locale, keymap, timezone, fstab. Do this after packages so
filesystemhas already laid down passwd and a stub fstab.tzdatais inbase-system; the live disc also has/usr/share/zoneinfofrom 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 -
Users. After
shadow/filesystemexist. setup uses uid 1000 and groups wheel, audio, video, input, kvm, users. Busyboxpasswdcan set a hash in the live tree;openssl passwd -6is 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
passwdneeds a working target userland (afterbase-system). If chroot cannot run the targetpasswd, set hashes from the live system withopenssl passwd -6and put the hash in the shadow field. -
Bootloader. Explicit, same as setup. Run it after
gruband a kernel are installed. Use the livegrub-installpointed 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' fiBIOS:
grub-install --target=i386-pc --boot-directory=/mnt/boot "$DISK"
setupdoes not rungrub-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
-
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
| Class | Commands |
|---|---|
| SPS | src sget mkpkg pkin pkdel pkstat pkcheck pkmark setup mkiso |
| Disk | lsblk blkid sfdisk cfdisk fdisk wipefs mkfs.ext4 mke2fs mkfs.vfat mkswap partprobe |
| Boot | grub-install grub-mkconfig, and efibootmgr when the builder had it |
| Network | host dhcpcd; busybox udhcpc, wget, ip, ifconfig, ping |
| Crypto / linker | openssl ldd ldconfig |
| Busybox | sh 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.