This commit is contained in:
Michael Smith
2026-02-21 17:12:35 +01:00
parent 91e1d32f1c
commit 0453470cde
5 changed files with 659 additions and 19 deletions

View File

@@ -83,7 +83,10 @@ d-i cdrom-checker/start boolean false
# Finish
d-i finish-install/reboot_in_progress note
# Post-install: configure serial console, SDDM + UWSM + Hyprland desktop
# Post-install: configure serial console, sid repo, and first-boot desktop setup
# NOTE: preseed interprets \n as literal newlines, breaking shell commands.
# Use multiple echo commands instead of printf with \n for multi-line files.
# Heavy package installation is deferred to a first-boot systemd service.
d-i preseed/late_command string \
USER=$(grep ':x:1000:' /target/etc/passwd | cut -d: -f1); \
LOG=/target/var/log/yino-late-command.log; \
@@ -99,22 +102,81 @@ d-i preseed/late_command string \
echo "nameserver 1.1.1.1" > /target/etc/resolv.conf; \
echo "--- sid repo ---" >> $LOG; \
echo 'deb http://deb.debian.org/debian sid main contrib non-free-firmware' > /target/etc/apt/sources.list.d/sid.list; \
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 100\n' > /target/etc/apt/preferences.d/sid-low-priority; \
echo "--- apt-get update ---" >> $LOG; \
in-target apt-get update >> $LOG 2>&1 || echo "FAILED: apt-get update (exit $?)" >> $LOG; \
echo "--- install sddm ---" >> $LOG; \
in-target env DEBIAN_FRONTEND=noninteractive apt-get -y install sddm >> $LOG 2>&1 || echo "FAILED: install sddm (exit $?)" >> $LOG; \
echo "--- install hyprland uwsm foot ---" >> $LOG; \
in-target env DEBIAN_FRONTEND=noninteractive apt-get -y -t unstable install hyprland uwsm foot >> $LOG 2>&1 || echo "FAILED: install hyprland (exit $?)" >> $LOG; \
echo "--- SDDM config ---" >> $LOG; \
mkdir -p /target/etc/sddm.conf.d; \
printf '[Autologin]\nUser=%s\nSession=hyprland-uwsm\n\n[Theme]\nCurrent=breeze\n' "$USER" > /target/etc/sddm.conf.d/autologin.conf; \
in-target systemctl enable sddm >> $LOG 2>&1 || echo "FAILED: enable sddm" >> $LOG; \
mkdir -p /target/usr/share/wayland-sessions; \
printf '[Desktop Entry]\nName=Hyprland (UWSM)\nComment=Hyprland via Universal Wayland Session Manager\nExec=uwsm start hyprland.desktop\nType=Application\nDesktopNames=Hyprland\n' > /target/usr/share/wayland-sessions/hyprland-uwsm.desktop; \
echo "--- Hyprland config ---" >> $LOG; \
UHOME=/target/home/$USER; \
mkdir -p $UHOME/.config/hyprland; \
printf 'monitor = ,preferred,auto,1\n\nenv = WLR_NO_HARDWARE_CURSORS,1\nenv = WLR_RENDERER_ALLOW_SOFTWARE,1\n\nexec-once = foot --server\n\n$mainMod = SUPER\n\nbind = $mainMod, Return, exec, foot\nbind = $mainMod SHIFT, Q, killactive\nbind = $mainMod SHIFT, E, exit\n\nbind = $mainMod, 1, workspace, 1\nbind = $mainMod, 2, workspace, 2\nbind = $mainMod, 3, workspace, 3\nbind = $mainMod, 4, workspace, 4\nbind = $mainMod, 5, workspace, 5\n\nbind = $mainMod, left, movefocus, l\nbind = $mainMod, right, movefocus, r\nbind = $mainMod, up, movefocus, u\nbind = $mainMod, down, movefocus, d\n' > $UHOME/.config/hyprland/hyprland.conf; \
chown -R 1000:1000 $UHOME/.config; \
F=/target/etc/apt/preferences.d/sid-low-priority; \
echo 'Package: *' > $F; \
echo 'Pin: release a=unstable' >> $F; \
echo 'Pin-Priority: 100' >> $F; \
echo "--- first-boot setup script ---" >> $LOG; \
S=/target/usr/local/sbin/yino-first-boot; \
echo '#!/bin/sh' > $S; \
echo 'set -ex' >> $S; \
echo 'LOG=/var/log/yino-first-boot.log' >> $S; \
echo 'exec > "$LOG" 2>&1' >> $S; \
echo 'echo "=== Yino first-boot start ==="' >> $S; \
echo 'USER=$(grep ":x:1000:" /etc/passwd | cut -d: -f1)' >> $S; \
echo 'export DEBIAN_FRONTEND=noninteractive' >> $S; \
echo 'apt-get update' >> $S; \
echo 'apt-get -y install sddm' >> $S; \
echo 'apt-get -y -t unstable install hyprland uwsm foot' >> $S; \
echo 'mkdir -p /etc/sddm.conf.d' >> $S; \
echo 'echo "[Autologin]" > /etc/sddm.conf.d/autologin.conf' >> $S; \
echo 'echo "User=$USER" >> /etc/sddm.conf.d/autologin.conf' >> $S; \
echo 'echo "Session=hyprland-uwsm" >> /etc/sddm.conf.d/autologin.conf' >> $S; \
echo 'echo "" >> /etc/sddm.conf.d/autologin.conf' >> $S; \
echo 'echo "[Theme]" >> /etc/sddm.conf.d/autologin.conf' >> $S; \
echo 'echo "Current=breeze" >> /etc/sddm.conf.d/autologin.conf' >> $S; \
echo 'systemctl enable sddm' >> $S; \
echo 'mkdir -p /usr/share/wayland-sessions' >> $S; \
echo 'echo "[Desktop Entry]" > /usr/share/wayland-sessions/hyprland-uwsm.desktop' >> $S; \
echo 'echo "Name=Hyprland (UWSM)" >> /usr/share/wayland-sessions/hyprland-uwsm.desktop' >> $S; \
echo 'echo "Comment=Hyprland via Universal Wayland Session Manager" >> /usr/share/wayland-sessions/hyprland-uwsm.desktop' >> $S; \
echo 'echo "Exec=uwsm start hyprland.desktop" >> /usr/share/wayland-sessions/hyprland-uwsm.desktop' >> $S; \
echo 'echo "Type=Application" >> /usr/share/wayland-sessions/hyprland-uwsm.desktop' >> $S; \
echo 'echo "DesktopNames=Hyprland" >> /usr/share/wayland-sessions/hyprland-uwsm.desktop' >> $S; \
echo 'UHOME=/home/$USER' >> $S; \
echo 'mkdir -p $UHOME/.config/hyprland' >> $S; \
echo 'F=$UHOME/.config/hyprland/hyprland.conf' >> $S; \
echo 'echo "monitor = ,preferred,auto,1" > $F' >> $S; \
echo 'echo "" >> $F' >> $S; \
echo 'echo "env = WLR_NO_HARDWARE_CURSORS,1" >> $F' >> $S; \
echo 'echo "env = WLR_RENDERER_ALLOW_SOFTWARE,1" >> $F' >> $S; \
echo 'echo "" >> $F' >> $S; \
echo 'echo "exec-once = foot --server" >> $F' >> $S; \
echo 'echo "" >> $F' >> $S; \
echo 'echo "\$mainMod = SUPER" >> $F' >> $S; \
echo 'echo "" >> $F' >> $S; \
echo 'echo "bind = \$mainMod, Return, exec, foot" >> $F' >> $S; \
echo 'echo "bind = \$mainMod SHIFT, Q, killactive" >> $F' >> $S; \
echo 'echo "bind = \$mainMod SHIFT, E, exit" >> $F' >> $S; \
echo 'echo "" >> $F' >> $S; \
echo 'echo "bind = \$mainMod, 1, workspace, 1" >> $F' >> $S; \
echo 'echo "bind = \$mainMod, 2, workspace, 2" >> $F' >> $S; \
echo 'echo "bind = \$mainMod, 3, workspace, 3" >> $F' >> $S; \
echo 'echo "bind = \$mainMod, 4, workspace, 4" >> $F' >> $S; \
echo 'echo "bind = \$mainMod, 5, workspace, 5" >> $F' >> $S; \
echo 'echo "" >> $F' >> $S; \
echo 'echo "bind = \$mainMod, left, movefocus, l" >> $F' >> $S; \
echo 'echo "bind = \$mainMod, right, movefocus, r" >> $F' >> $S; \
echo 'echo "bind = \$mainMod, up, movefocus, u" >> $F' >> $S; \
echo 'echo "bind = \$mainMod, down, movefocus, d" >> $F' >> $S; \
echo 'chown -R 1000:1000 $UHOME/.config' >> $S; \
echo 'systemctl disable yino-first-boot.service' >> $S; \
echo 'rm -f /usr/local/sbin/yino-first-boot' >> $S; \
echo 'echo "=== Yino first-boot done ==="' >> $S; \
chmod 755 $S; \
F=/target/etc/systemd/system/yino-first-boot.service; \
echo '[Unit]' > $F; \
echo 'Description=Yino first-boot desktop setup' >> $F; \
echo 'After=network-online.target' >> $F; \
echo 'Wants=network-online.target' >> $F; \
echo 'ConditionPathExists=/usr/local/sbin/yino-first-boot' >> $F; \
echo '' >> $F; \
echo '[Service]' >> $F; \
echo 'Type=oneshot' >> $F; \
echo 'ExecStart=/usr/local/sbin/yino-first-boot' >> $F; \
echo 'RemainAfterExit=yes' >> $F; \
echo '' >> $F; \
echo '[Install]' >> $F; \
echo 'WantedBy=multi-user.target' >> $F; \
in-target systemctl enable yino-first-boot.service >> $LOG 2>&1; \
echo "=== Yino late_command done ===" >> $LOG