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 }