One stack, live and installed alike: wpa_supplicant and udhcpc,
driven by wifi-connect. No NetworkManager anywhere in
the base system.
wifi-connect pick an interface and a network wifi-connect <ssid> <psk> [iface] connect without being asked anything wifi-connect scan [iface] scan and show what is in range
Scans, lists what's in range, asks which interface and network,
reads the passphrase with the characters masked. On a successful
connect it writes the SSID/PSK/interface to
/etc/scraplinux/network.conf - see
configuration. rc.d/wifi
reads that back on every boot and reconnects, started in the
background by rc.boot and never waited on - an
association or a DHCP lease never holds up the login prompt.
Wired DHCP comes up on its own via rc.d/network, same
non-blocking treatment. A soft-blocked radio (a BIOS default on many
laptops) is unblocked automatically before scanning; a hard block (a
physical switch) has to be cleared in hardware.
No regulatory database installed means the kernel stays in world
domain 00, where most 5 GHz channels are receive-only -
an access point shows up in a scan and the card is then forbidden to
transmit to it, which reads exactly like a wrong passphrase.
scraps add wireless-regdb fixes it; WIFI_COUNTRY=US
wifi-connect sets a country code for one run.
scraps add scraplinux-xfce # or scraplinux-kde, niri-dms, apiwow-dwm
scraplinux-xfce | XFCE 4.20, foot, Thunar, LightDM, X11, PipeWire, fonts |
scraplinux-kde | Plasma 6, foot, Dolphin, SDDM, PipeWire, fonts |
niri-dms | Niri, DankMaterialShell, foot, fuzzel, mako, PipeWire, fonts, Firefox |
apiwow-dwm | dwm, dmenu, st, picom, slstatus, slock, X11, fonts |
Each is a single profile meta-package pulling in the whole working
environment at once, rather than assembling the pieces by hand.
dwm starts from a console login rather than a display
manager - it needs a .xinitrc:
printf '#!/bin/sh\nexec dwm\n' > ~/.xinitrc startx
scraps add sound-setup # busybox init scraps add sound-setup-openrc # OpenRC
PipeWire and WirePlumber as the audio layer, the PipeWire
PulseAudio compatibility shim, ALSA, and alsamixer.
Unlike the bare scraplinux-sound meta-package (dependencies
only), sound-setup also adds every real user to the
audio group and drops a per-session autostart hook -
PipeWire is a per-user daemon, so nothing starts it without one.
busybox | the default, bundled in the def tarball. /etc/rc.boot, /etc/rc.d scripts. |
openrc | bundled in the openrc tarball, with openrc-init wired up as PID 1. Dependency-based, from Gentoo - /etc/init.d, rc-update. |
sysvinit | installed afterward via scraps add. /etc/inittab, /etc/rc3.d. |
runit | installed afterward. /etc/sv, sv up/sv down. |
dinit | installed afterward. dinitctl. |
initialization | ScrapLinux's own fork of nitro, installed afterward. |
Only the two bundled in the tarballs (busybox, OpenRC) are boot-tested end to end; the rest are verified by inspection of the generated service definitions.
Every service is defined once, in /etc/rc.d, as a
handful of shell variables:
#!/bin/sh NAME=bluetoothd CMD=/usr/bin/bluetoothd ARGS="" BACKGROUND=yes . /etc/scraplinux/svc.lib svc_main "$@"
scraplinux-init-setup reads (not runs) that and generates
the equivalent for whichever init is actually running - an OpenRC
init.d script, a runit run file, and so on.
One definition, generated rest - adding a service stays a one-file
change, and no init drifts out of step with the others.
scraplinux-init-setup openrc regenerate service definitions for OpenRC scraplinux-init-setup runit --root /mnt or write them into a target root
A rebuild that changes the enabled service set regenerates the definitions for whichever init is running automatically - not something to remember by hand.