Recently Written · git

waybase

Bootable installer: KISS, Gentoo, Arch or Alpine + Nix + a Wayland compositor (sway, river, labwc, dwl)

git clone https://github.com/equwal/waybase

Log | Files | Refs


backends/kiss.sh (3241 bytes)

1 # KISS: the official chroot tarball plus baseinit (busybox init + runit).
2 # KISS builds every package from source, so the desktop (compositor, foot,
3 # PipeWire, seatd, udev) comes from Nix and the kernel is Alpine's linux-lts
4 # with an Alpine mkinitfs initramfs. Nothing compiles.
5 # shellcheck shell=sh disable=SC2034
6 bootstrap() {
7     v=$(curl -fsSL https://api.github.com/repos/kisslinux/repo/releases/latest |
8         sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p')
9     f=$(fetch "https://github.com/kisslinux/repo/releases/download/$v/kiss-chroot-$v.tar.xz")
10     tar -xJf "$f" -C $M --numeric-owner && rm "$f"
11     chroot_mounts
12     ch "git clone -q https://github.com/kisslinux/repo /var/db/kiss/repo"
13     ch "KISS_PATH=/var/db/kiss/repo/core KISS_PROMPT=0 kiss build baseinit" >/dev/null
14     mkdir -p $M/etc/sv $M/var/service $M/etc/rc.d
15     sv() { # sv NAME COMMAND: runit service
16         mkdir -p $M/etc/sv/$1
17         printf '#!/bin/sh\nexec %s\n' "$2" > $M/etc/sv/$1/run
18         chmod 755 $M/etc/sv/$1/run
19         ln -sfn /etc/sv/$1 $M/var/service/$1
20     }
21     p=/nix/var/nix/profiles/waybase/bin
22     sv udevd "$p/udevd"
23     sv seatd "$p/seatd -g video"
24     # udev database for libinput, then DHCP on the first wired interface
25     printf '%s\n' "$p/udevadm trigger --action=add 2>/dev/null; $p/udevadm settle 2>/dev/null" \
26         'for i in /sys/class/net/e*; do [ -e "$i" ] && udhcpc -b -i "${i##*/}" -s /etc/udhcpc.script >/dev/null 2>&1 && break; done' \
27         > $M/etc/rc.d/waybase.boot
28     cat > $M/etc/udhcpc.script <<'EOF'
29 #!/bin/sh
30 [ "$1" = bound ] || [ "$1" = renew ] || exit 0
31 ip addr flush dev "$interface"; ip addr add "$ip/${mask:-24}" dev "$interface"
32 [ -n "$router" ] && ip route add default via "${router%% *}" dev "$interface"
33 : > /etc/resolv.conf; for d in $dns; do echo "nameserver $d" >> /etc/resolv.conf; done
34 EOF
35     chmod 755 $M/etc/udhcpc.script
36 }
37 pkg() { :; }
38 pkg_install() { return 1; }
39 extra_pkgs() { echo seatd eudev dbus; }
40 user_add() {
41     ch "adduser -D -s /bin/sh $1"
42     for g in wheel video input audio; do ch "addgroup $1 $g" 2>/dev/null || true; done
43 }
44 serial_getty() { echo 'ttyS0::respawn:/usr/bin/getty -L 115200 ttyS0 vt100' >> $M/etc/inittab; }
45 nix_native() { return 1; }
46 nix_service() {
47     mkdir -p $M/etc/sv/nix-daemon
48     printf '#!/bin/sh\nexec /nix/var/nix/profiles/default/bin/nix-daemon\n' > $M/etc/sv/nix-daemon/run
49     chmod 755 $M/etc/sv/nix-daemon/run
50     ln -sfn /etc/sv/nix-daemon $M/var/service/nix-daemon
51 }
52 boot_cmd() { echo "$1" >> $M/etc/rc.d/waybase.boot; }
53 kernel() {
54     k=/tmp/waybase-kernel; rm -rf $k; mkdir -p $k
55     apk fetch -q -o $k linux-lts
56     [ "${FIRMWARE:-}" = no ] || apk fetch -q -R -o $k linux-firmware
57     for f in "$k"/*.apk; do tar -xzf "$f" -C $M --keep-directory-symlink --exclude='.[A-Z]*' 2>/dev/null; done
58     rm -rf $k
59     kv=$(ls $M/lib/modules | head -1)
60     # Alpine's mkinitfs (live system) with the target's modules
61     mount --bind $M/lib/modules /lib/modules
62     mkinitfs -F "ata base cryptsetup ext4 keymap mmc nvme scsi usb virtio" -o $M/boot/initramfs-lts "$kv" >/dev/null
63     umount /lib/modules
64     KERNEL=vmlinuz-lts INITRD=initramfs-lts
65     KARGS="modules=sd-mod,usb-storage,ext4"
66     CRYPTARGS="cryptroot=UUID=$UL cryptdm=root"
67 }