splux-site · log · files · refs · tags · releases · people · languages · GitHub · file
site/install/index.html
25544 bytes at 4c4f12c · GitHub
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Install - Splux Linux</title>
<meta name="description" content="Install Splux: guided setup, a full manual tty install without setup, and the slim image.">
<link rel="icon" href="../../../../../../assets/favicon.png" type="image/png">
<link rel="stylesheet" href="../../../../../../assets/style.css">
</head>
<body>
<a class="skip" href="#main">Skip to content</a>
<div class="wrap wide">
Splux Linux
source-based Linux using SPS
<div class="handbook">
<main id="main">
<h2>Install</h2>
<hr class="rule">
<p>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: <code>#setup</code>, <code>#manual</code>, <code>#slim</code>.</p>
<ul class="local-toc">
<li><a href="#setup">Guided setup</a> on tty or Plasma</li>
<li><a href="#manual">Manual install</a> from the tty ISO, without <code>setup</code></li>
<li><a href="#slim">Slim image</a> (rescue, not a source install)</li>
</ul>
<div class="callout">
<p><strong>Which ISO.</strong> Source install needs <code>sps-live-tty.iso</code> or <code>sps-live-plasma.iso</code>. Those discs carry sps-core, sps-extra, and a seed compiler. <code>sps-live-tty-slim.iso</code> does not. Compare images in the <a href="../../../../../../docs/images/">live images</a> chapter.</p>
</div>
<div class="tabs" data-tabs>
<div class="tablist" role="tablist" aria-label="Install method">
<button type="button" role="tab" id="tab-setup" aria-controls="panel-setup" aria-selected="true" tabindex="0" data-hash="setup">setup</button>
<button type="button" role="tab" id="tab-manual" aria-controls="panel-manual" aria-selected="false" tabindex="-1" data-hash="manual">Manual (tty)</button>
<button type="button" role="tab" id="tab-slim" aria-controls="panel-slim" aria-selected="false" tabindex="-1" data-hash="slim">Slim ISO</button>
</div>
<section class="tabpanel" role="tabpanel" id="panel-setup" aria-labelledby="tab-setup">
<h3>Guided setup</h3>
<p><code>setup</code> 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 <code>grub-install</code>.</p>
<h4>1. Download and verify</h4>
<p>Get <a href="../../../../../../download/">sps-live-tty.iso</a> (or the Plasma image). Check it on the machine that downloaded it:</p>
<pre class="block">sha256sum -c SHA256SUMS</pre>
<p>Current published tag: <a href="https://github.com/RobertFlexx/SPS/releases/latest">live-2026-09-06-1</a> (2026-09-06). Signatures are not published yet.</p>
<h4>2. Write the image</h4>
<pre class="block">dd if=sps-live-tty.iso of=/dev/sdX bs=4M status=progress conv=fsync</pre>
<p>Replace <code>/dev/sdX</code> with the USB device. That command erases the destination.</p>
<h4>3. Boot</h4>
<p>Boot the "SPS Linux live (Splux)" entry. Login is <code>root</code> with an empty password. On Plasma, open Konsole. Live PATH often omits <code>/sbin</code>:</p>
<pre class="block">export PATH=/sbin:/usr/sbin:/usr/bin:/bin:$PATH</pre>
<p>For QEMU, give the guest a writable second disk. The live image never runs <code>grub-install</code> on its own.</p>
<h4>4. Run setup</h4>
<pre class="block">setup</pre>
<p>Profiles: <code>minimal</code>, <code>server</code>, <code>plasma-desktop</code>, <code>plasma-full</code>. Init: systemd, OpenRC, s6, runit, dinit, Shepherd, or SysV. Those packages conflict. Guided partitioning waits until the last confirmation. Kernel <code>none</code> is the interactive default for a console profile; a disk that must boot itself needs <code>linux-desktop</code> or <code>linux</code>.</p>
<p>Non-interactive examples:</p>
<pre class="block">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</pre>
<p><code>--plan</code> and <code>--non-interactive</code> never touch a disk unless you pass <code>--disk</code> and <code>--format yes</code> together. <code>grub-install</code> still needs <code>--install-bootloader</code> and <code>--disk</code>.</p>
<h4>Profiles and kernels</h4>
<table class="docs">
<thead>
<tr><th>Profile</th><th>Packages (plus init and kernel you select)</th></tr>
</thead>
<tbody>
<tr><td><code>minimal</code></td><td><code>base-system dialog splux-base fastfetch</code></td></tr>
<tr><td><code>server</code></td><td>minimal, plus <code>openssh gnupg rsync sudo</code></td></tr>
<tr><td><code>plasma-desktop</code></td><td>minimal, plus Plasma, SDDM, Mesa, PipeWire, portals</td></tr>
<tr><td><code>plasma-full</code></td><td>plasma-desktop, plus <code>kde-apps firefox flatpak</code></td></tr>
</tbody>
</table>
<p><code>setup --list-profiles</code> and <code>setup --list-sets</code> print the catalog. Optional sets cover SSH, printing, Flatpak, NVIDIA, firmware, and more. <code>--kernel</code> is <code>none</code>, <code>linux</code>, <code>linux-desktop</code>, or <code>custom</code>.</p>
<h4>Partition layouts</h4>
<table class="docs">
<thead>
<tr><th>Layout</th><th>GPT map</th></tr>
</thead>
<tbody>
<tr><td><code>efi-root</code></td><td>512MiB ESP, rest root</td></tr>
<tr><td><code>efi-swap-root</code></td><td>ESP, swap (default 8GiB), rest root</td></tr>
<tr><td><code>efi-swap-root-home</code></td><td>ESP, swap, 48GiB root, rest home</td></tr>
<tr><td><code>bios-root</code></td><td>1MiB BIOS boot, rest root</td></tr>
<tr><td><code>existing</code> / <code>manage</code></td><td>you mount or name partitions</td></tr>
</tbody>
</table>
<p>Formats match the installer: ESP is FAT32 labeled <code>SPS_EFI</code>, root is ext4 labeled <code>sps-root</code>, swap is labeled <code>sps-swap</code>. <code>/etc/fstab</code> is written from <code>blkid</code> UUIDs when setup partitioned the disk.</p>
<h4>What setup does</h4>
<p>It writes hostname, timezone, keymap, locale, and <code>/etc/sps/init</code>, copies bundled recipe trees when they exist, writes <code>sps.conf</code>, runs <code>src update</code>, then <code>sget install</code>. Users land after packages so <code>filesystem</code>'s passwd file is already there. If you passed <code>--install-bootloader</code>, it runs live <code>grub-install</code> (EFI removable <code>EFI/BOOT/BOOTX64.EFI</code>, then NVRAM via <code>efibootmgr</code> when that binary exists; BIOS uses <code>i386-pc</code>). It does not run <code>grub-mkconfig</code>. See <code>/root/sps-bootloader.txt</code> on the target.</p>
<p>A Plasma install compiles Qt and KDE and takes a long time. See <a href="../../../../../../git/SPS/blob/man/setup.1/">setup(1)</a> for every flag.</p>
</section>
<section class="tabpanel" role="tabpanel" id="panel-manual" aria-labelledby="tab-manual">
<h3>Manual install (no setup)</h3>
<p>This is the same work <code>setup</code> does, written as shell commands. It uses tools that exist on <code>sps-live-tty.iso</code> (the Plasma ISO has the same installer stack). Do not follow this chapter on slim.</p>
<div class="callout">
<p><strong>Tools on the tty disc.</strong> SPS (<code>src</code>, <code>sget</code>, <code>mkpkg</code>, <code>pkin</code>, and the rest), gcc/g++, make, cmake, ninja, meson, python3, perl, git, curl, wget, tar, xz, gzip, zstd, nano, vim, <code>dialog</code>, <code>openssl</code>, <code>lsblk</code>, <code>blkid</code>, <code>sfdisk</code>, <code>cfdisk</code>, <code>fdisk</code>, <code>wipefs</code>, <code>mkfs.ext4</code>, <code>mkfs.vfat</code>, <code>mkswap</code>, <code>partprobe</code>, <code>dhcpcd</code>, <code>grub-install</code>, <code>grub-mkconfig</code>, <code>efibootmgr</code> (when the builder had it), plus busybox <code>sh</code>, <code>mount</code>, <code>chroot</code>, <code>passwd</code>. Recipes are at <code>/usr/src/sps/core</code> and <code>/usr/src/sps/extra</code>.</p>
</div>
<ol class="steps">
<li>
<p><strong>Boot tty and fix PATH.</strong> Login is <code>root</code> with an empty password.</p>
<pre class="block">export PATH=/sbin:/usr/sbin:/usr/bin:/bin:$PATH
lsblk -o NAME,SIZE,TYPE,TRAN,MODEL</pre>
<p>Pick a writable disk that is not the live USB. On QEMU that is the second disk. Optional DHCP: <code>dhcpcd</code>.</p>
</li>
<li>
<p><strong>Partition and format.</strong> Use the firmware tabs. Names: <code>/dev/sda1</code> versus <code>/dev/nvme0n1p1</code>. These layouts match <code>setup</code>.</p>
<div class="tabs" data-tabs>
<div class="tablist" role="tablist" aria-label="Firmware">
<button type="button" role="tab" id="tab-uefi" aria-controls="panel-uefi" aria-selected="true" tabindex="0" data-hash="uefi">UEFI (GPT)</button>
<button type="button" role="tab" id="tab-bios" aria-controls="panel-bios" aria-selected="false" tabindex="-1" data-hash="bios">BIOS (GPT)</button>
</div>
<section class="tabpanel" role="tabpanel" id="panel-uefi" aria-labelledby="tab-uefi">
<p>ESP (type EFI System), swap, then Linux root. Default swap size is 8GiB, same as setup.</p>
<pre class="block">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"</pre>
<p>No swap: omit the swap line in the sfdisk script (setup layout <code>efi-root</code>) and skip <code>mkswap</code> / <code>swapon</code>. Separate <code>/home</code>: setup layout <code>efi-swap-root-home</code> uses a 48GiB root then the rest as home; format that partition ext4 labeled <code>sps-home</code> and mount it on <code>/mnt/home</code>.</p>
<p><code>cfdisk "$DISK"</code> is on the disc if you want a TUI instead of a script. Types: EFI System, Linux swap, Linux filesystem.</p>
</section>
<section class="tabpanel" role="tabpanel" id="panel-bios" aria-labelledby="tab-bios">
<p>1MiB BIOS boot partition (GRUB GPT), then Linux root. No ESP.</p>
<pre class="block">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</pre>
<p>The remount matters. Autoconf runs conftests on this mount; a <code>noexec</code> or <code>nodev</code> root fails those builds.</p>
</section>
</div>
</li>
<li>
<p><strong>Target directories and sps.conf.</strong> <code>sget</code> will not run without a config.</p>
<pre class="block">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</pre>
</li>
<li>
<p><strong>Copy bundled recipes.</strong> tty and Plasma already have them. Copying avoids a git clone during <code>src update</code>.</p>
<pre class="block">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</pre>
<p>Those paths are for indexing from the live system. After packages you rewrite them to <code>/usr/src/sps/...</code> for the booted machine.</p>
</li>
<li>
<p><strong>Point SPS at /mnt and record init.</strong> Write <code>/etc/sps/init</code> before the first package so service hooks see it. The init packages conflict.</p>
<pre class="block">export SPS_ROOT=/mnt
unset SPS_DB SPS_CACHE SPS_BUILD SPS_CONFIG SPS_REPOS_CONFIG SPS_REPO_ROOT</pre>
<div class="tabs" data-tabs>
<div class="tablist" role="tablist" aria-label="Init system">
<button type="button" role="tab" id="tab-systemd" aria-controls="panel-init-systemd" aria-selected="true" tabindex="0" data-hash="systemd">systemd</button>
<button type="button" role="tab" id="tab-openrc" aria-controls="panel-init-openrc" aria-selected="false" tabindex="-1" data-hash="openrc">OpenRC</button>
<button type="button" role="tab" id="tab-s6" aria-controls="panel-init-s6" aria-selected="false" tabindex="-1" data-hash="s6">s6</button>
<button type="button" role="tab" id="tab-runit" aria-controls="panel-init-runit" aria-selected="false" tabindex="-1" data-hash="runit">runit</button>
<button type="button" role="tab" id="tab-dinit" aria-controls="panel-init-dinit" aria-selected="false" tabindex="-1" data-hash="dinit">dinit</button>
<button type="button" role="tab" id="tab-shepherd" aria-controls="panel-init-shepherd" aria-selected="false" tabindex="-1" data-hash="shepherd">Shepherd</button>
<button type="button" role="tab" id="tab-sysvinit" aria-controls="panel-init-sysvinit" aria-selected="false" tabindex="-1" data-hash="sysvinit">SysV</button>
</div>
<section class="tabpanel" role="tabpanel" id="panel-init-systemd" aria-labelledby="tab-systemd">
<pre class="block">printf '%s\n' systemd > /mnt/etc/sps/init
# later: sget install init-systemd</pre>
<p>PID 1 is systemd, with udev and logind. Interactive <code>setup</code> defaults to systemd when the live disc recorded that init.</p>
</section>
<section class="tabpanel" role="tabpanel" id="panel-init-openrc" aria-labelledby="tab-openrc">
<pre class="block">printf '%s\n' openrc > /mnt/etc/sps/init
# later: sget install init-openrc</pre>
<p>OpenRC plus eudev and elogind. Enable services with <code>rc-update</code> after boot.</p>
</section>
<section class="tabpanel" role="tabpanel" id="panel-init-s6" aria-labelledby="tab-s6">
<pre class="block">printf '%s\n' s6 > /mnt/etc/sps/init
# later: sget install init-s6</pre>
<p>s6 plus eudev and elogind. Enabled longruns live in <code>/etc/s6/enabled</code>.</p>
</section>
<section class="tabpanel" role="tabpanel" id="panel-init-runit" aria-labelledby="tab-runit">
<pre class="block">printf '%s\n' runit > /mnt/etc/sps/init
# later: sget install init-runit</pre>
<p>runit plus eudev and elogind. Enable with a symlink in <code>/etc/runit/runsvdir/default</code>.</p>
</section>
<section class="tabpanel" role="tabpanel" id="panel-init-dinit" aria-labelledby="tab-dinit">
<pre class="block">printf '%s\n' dinit > /mnt/etc/sps/init
# later: sget install init-dinit</pre>
<p>dinit plus eudev and elogind. Enable by linking into <code>/etc/dinit.d/boot.d</code>.</p>
</section>
<section class="tabpanel" role="tabpanel" id="panel-init-shepherd" aria-labelledby="tab-shepherd">
<pre class="block">printf '%s\n' shepherd > /mnt/etc/sps/init
# later: sget install init-shepherd</pre>
<p>GNU Shepherd plus eudev, elogind, and Guile. Services are Scheme files under <code>/etc/shepherd.d</code>.</p>
</section>
<section class="tabpanel" role="tabpanel" id="panel-init-sysvinit" aria-labelledby="tab-sysvinit">
<pre class="block">printf '%s\n' sysvinit > /mnt/etc/sps/init
# later: sget install init-sysvinit</pre>
<p>SysV init plus eudev and elogind. Service scripts land in <code>/etc/rc.d/init.d</code>. Enable with <code>S*</code> links in <code>rc2.d</code> through <code>rc5.d</code>.</p>
</section>
</div>
</li>
<li>
<p><strong>Probe the live compiler, then install packages.</strong> Fail here rather than inside the first autoconf package.</p>
<pre class="block">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</pre>
<p>Replace <code>init-systemd</code> with the package from the init tab. <code>base-system</code> is a metapackage (shell, coreutils, curl, git, e2fsprogs, busybox, shadow, tzdata, and the rest of the essential userland). <code>splux-base</code> is branding and os-release. <code>linux-desktop</code> is the Splux daily-driver kernel and installs <code>/boot/vmlinuz-desktop-7.2.2</code>. <code>linux</code> is upstream defconfig (<code>/boot/vmlinuz-7.2.2</code>). Skipping a kernel package will not boot a new disk.</p>
<p>Server add-ons: <code>sget install openssh gnupg rsync sudo</code>. Plasma add-ons are the plasma-desktop profile set (Plasma, SDDM, Mesa, PipeWire, portals) and compile for a long time.</p>
</li>
<li>
<p><strong>Rewrite repos.conf for the booted system.</strong></p>
<pre class="block">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</pre>
</li>
<li>
<p><strong>Hostname, locale, keymap, timezone, fstab.</strong> Do this after packages so <code>filesystem</code> has already laid down passwd and a stub fstab. <code>tzdata</code> is in <code>base-system</code>; the live disc also has <code>/usr/share/zoneinfo</code> from the seed.</p>
<pre class="block">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</pre>
</li>
<li>
<p><strong>Users.</strong> After <code>shadow</code> / <code>filesystem</code> exist. setup uses uid 1000 and groups wheel, audio, video, input, kvm, users. Busybox <code>passwd</code> can set a hash in the live tree; <code>openssl passwd -6</code> is on the disc too.</p>
<pre class="block"># 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</pre>
<p>A full chroot for <code>passwd</code> needs a working target userland (after <code>base-system</code>). If chroot cannot run the target <code>passwd</code>, set hashes from the live system with <code>openssl passwd -6</code> and put the hash in the shadow field.</p>
</li>
<li>
<p><strong>Bootloader.</strong> Explicit, same as setup. Run it after <code>grub</code> and a kernel are installed. Use the live <code>grub-install</code> pointed at the mounted tree.</p>
<p>UEFI (writes <code>\EFI\BOOT\BOOTX64.EFI</code>, no NVRAM required):</p>
<pre class="block">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</pre>
<p>BIOS:</p>
<pre class="block">grub-install --target=i386-pc --boot-directory=/mnt/boot "$DISK"</pre>
<p><code>setup</code> does not run <code>grub-mkconfig</code>. After the kernel is in <code>/mnt/boot</code>:</p>
<pre class="block">mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg</pre>
</li>
<li>
<p><strong>Unmount and reboot.</strong></p>
<pre class="block">umount /mnt/dev /mnt/proc /mnt/sys 2>/dev/null || :
swapoff -a
umount /mnt/boot/efi 2>/dev/null || :
umount /mnt
reboot</pre>
<p>Continue in <a href="../../../../../../docs/first-boot/">After first boot</a>.</p>
</li>
</ol>
<h4>Time and limits</h4>
<p>Source install compiles on the live compiler into <code>SPS_ROOT</code>. <code>linux-desktop</code> is a kernel build. Plasma is Qt and KDE. Leave it running.</p>
<p>Packages are linked against the live C library. There is no glibc recipe in sps-core yet. That is the same for <code>setup</code> and this chapter. Splux is still under testing; a first boot needs the kernel, an init, GRUB, and a userland that can actually start.</p>
</section>
<section class="tabpanel" role="tabpanel" id="panel-slim" aria-labelledby="tab-slim">
<h3>Slim ISO</h3>
<p><code>sps-live-tty-slim.iso</code> is the small console image from <code>make iso-slim</code> (<code>--no-seed --no-modules</code>, no <code>--core</code>, no <code>--extra</code>). It is a rescue and disk tool. It is not a Splux source-install disc.</p>
<div class="callout">
<p><strong>What slim cannot do.</strong> No gcc, no make, no git, no python, no meson, no recipes, no live kernel modules. <code>repos.conf</code> lists git URLs for core and extra, but <code>git</code> is not on the image, so <code>src update</code> cannot clone them. Community stays a comment. <code>setup</code> is present because SPS is installed on every live root; it still cannot build packages here.</p>
</div>
<h4>What is on the disc</h4>
<table class="docs">
<thead>
<tr><th>Class</th><th>Commands</th></tr>
</thead>
<tbody>
<tr><td>SPS</td><td><code>src sget mkpkg pkin pkdel pkstat pkcheck pkmark setup mkiso</code></td></tr>
<tr><td>Disk</td><td><code>lsblk blkid sfdisk cfdisk fdisk wipefs mkfs.ext4 mke2fs mkfs.vfat mkswap partprobe</code></td></tr>
<tr><td>Boot</td><td><code>grub-install grub-mkconfig</code>, and <code>efibootmgr</code> when the builder had it</td></tr>
<tr><td>Network</td><td>host <code>dhcpcd</code>; busybox <code>udhcpc</code>, <code>wget</code>, <code>ip</code>, <code>ifconfig</code>, <code>ping</code></td></tr>
<tr><td>Crypto / linker</td><td><code>openssl ldd ldconfig</code></td></tr>
<tr><td>Busybox</td><td><code>sh vi mount umount chroot tar gzip xz passwd sha256sum modprobe fdisk mkswap</code> and the rest of the applet list. No <code>git</code>. No <code>zstd</code> applet. No <code>nano</code> / <code>vim</code>.</td></tr>
</tbody>
</table>
<h4>Boot and PATH</h4>
<pre class="block">export PATH=/sbin:/usr/sbin:/usr/bin:/bin:$PATH
lsblk -o NAME,SIZE,TYPE,TRAN,MODEL</pre>
<p>Login is <code>root</code> with an empty password. Edit files with busybox <code>vi</code>.</p>
<h4>Network</h4>
<pre class="block">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</pre>
<p><code>wget</code> can fetch SHA256SUMS or another ISO. It cannot replace git for <code>src update</code>.</p>
<h4>Partition and filesystems</h4>
<p>The same <code>sfdisk</code> / <code>mkfs.ext4</code> / <code>mkfs.vfat</code> / <code>mkswap</code> commands as the <a href="#manual">manual tty chapter</a> work here. That only prepares disks. It does not install Splux. Typical rescue:</p>
<pre class="block">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</pre>
<p>Reinstall GRUB from slim onto a disk that already has a <code>/boot</code> tree, using live <code>grub-install</code> the same way the tty chapter does. You still need a kernel and userland on that disk already.</p>
<h4>Why setup fails here</h4>
<p><code>setup</code> copies recipes from <code>/usr/src/sps/{core,extra}</code> when those trees exist. On slim they do not, so it would try git clones. <code>git</code> is missing. Even with recipes, the live gcc probe fails because there is no compiler. Use tty or Plasma for install.</p>
<p>Download the install disc from another machine, or from slim if you have network and a place to write it, then reboot into tty:</p>
<pre class="block"># on a machine that can download:
# sps-live-tty.iso from https://github.com/RobertFlexx/SPS/releases/latest</pre>
<p>Full install: <a href="#setup">setup tab</a> or <a href="#manual">manual tab</a>.</p>
</section>
</div>
<p class="note">Splux is under active development. These snapshots track installer and live-session work. They are not a numbered stable release.</p>
</main>
</div>
</div>
<script src="../../../../../../assets/live.js?v=4c4f12c-20261019130111" data-root="../../../../../../"></script>
<script src="../../../../../../assets/docs.js?v=4c4f12c-20261019130111"></script>
</body>
</html>