One stack: iwd runs the wireless radio and remembers
networks, dhcpcd gets addresses for every interface, wired
or wireless. No NetworkManager anywhere in the base system.
None of this can work before the card's driver and firmware are
loaded and the interface actually exists. If wifi-connect
reports no wireless device found, start at
manual setup, which covers firmware and how
to confirm the interface is really there.
wifi-connect scan and choose from a list wifi-connect <ssid> connect by name, asks for the passphrase if needed wifi-connect <ssid> <psk> without asking wifi-connect --status what the wireless device is doing wifi-connect --forget <ssid> drop a saved network
The first time it runs, wifi-connect enables
iwd and dhcpcd to start at boot. iwd keeps every
network it has joined in /var/lib/iwd and reconnects on its
own, so there is nothing to replay at boot. iwctl is there
for anything wifi-connect does not cover. A wired-only
machine needs only service enable dhcpcd.
A network can also be declared in
/etc/scraplinux/network.conf (see
configuration); scraplinux-rebuild
turns it into an iwd profile, which iwd picks up at once.
A soft-blocked radio (a BIOS default on many laptops) is unblocked 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.
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
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, enables the pipewire service and
drops a per-session autostart hook - PipeWire is a per-user daemon, so
nothing starts it without one.
dinit is PID 1 and the only init. It starts services in parallel as soon as what they depend on is up, supervises daemons and restarts them if they die, and shuts down in reverse order. A boot in QEMU reaches the login prompt about 1.3 seconds after the kernel hands over.
service every service, whether it starts at boot, its state service enable sshd start at boot, and now service disable sshd stop, and no longer at boot service start|stop|restart|status <name> dinitctl list every service dinit knows, boot plumbing included
Service definitions live in /etc/dinit.d, one small file
each; the enabled set is the links in /etc/dinit.d/boot.d.
The boot itself is split into services too (early-fs,
udevd, fsck, local-fs and so on),
all pulled in by system, which the login gettys wait for.
dinitctl status <name> says why one failed.
Shutting down is poweroff, reboot or
halt; they are dinit's own and stop every service before
the machine goes down. Booting with single on the kernel
command line starts a root shell first; exiting it carries on with the
normal boot.