From 5fa89444d70efc68579b5f005359184a75a46e8b Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Wed, 18 Feb 2026 00:44:21 +0100 Subject: [PATCH] Fix preseed late_command breaking finish-install stage The debconf preseed parser interprets \n in string values as literal newlines. The printf format string had its \n converted to real newlines before the shell saw it, causing ExecStart= to be executed as a separate command ("Illegal number: ExecStart="). Replace the single printf with multiple echo statements that avoid \n entirely. Co-Authored-By: Claude Opus 4.6 --- iso/preseed.cfg | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 iso/preseed.cfg diff --git a/iso/preseed.cfg b/iso/preseed.cfg new file mode 100644 index 0000000..8bfc3d1 --- /dev/null +++ b/iso/preseed.cfg @@ -0,0 +1,69 @@ +# Yino preseed configuration for Debian 13 (Trixie) +# Performs an unattended install, prompting only for: +# 1. LUKS encryption passphrase +# 2. Full name, username, and password + +# Locale and keyboard +d-i debian-installer/locale string en_US.UTF-8 +d-i keyboard-configuration/xkb-keymap select us + +# Network — skip (offline DVD install) +d-i netcfg/enable boolean false + +# Mirror — no network mirror +d-i apt-setup/use_mirror boolean false + +# Clock +d-i clock-setup/utc boolean true +d-i time/zone string UTC + +# Partitioning — encrypted LVM with btrfs root +d-i partman-auto/method string crypto +d-i partman-lvm/device_remove_lvm boolean true +d-i partman-md/device_remove_md boolean true +d-i partman-lvm/confirm boolean true +d-i partman-lvm/confirm_nooverwrite boolean true +d-i partman-auto-lvm/guided_size string max +d-i partman-auto-crypto/erase_disks boolean false +d-i partman/default_filesystem string btrfs +d-i partman-auto/choose_recipe select atomic +d-i partman-partitioning/confirm_write_new_label boolean true +d-i partman/choose_partition select finish +d-i partman/confirm boolean true +d-i partman/confirm_nooverwrite boolean true + +# Packages — minimal base + essentials +tasksel tasksel/first multiselect standard +d-i pkgsel/include string sudo btrfs-progs + +# Don't eject CD (fails in QEMU, causes prompt loop) +d-i cdrom-detect/eject boolean false + +# Skip upgrade check (offline install, nothing to upgrade) +d-i pkgsel/upgrade select none + +# No security/updates services (offline) +d-i apt-setup/services-select multiselect + +# No popularity contest +popularity-contest popularity-contest/participate boolean false + +# GRUB +d-i grub-installer/only_debian boolean true +d-i grub-installer/bootdev string default + +# Skip additional media scan +d-i apt-setup/cdrom/set-first boolean false +d-i apt-setup/cdrom/set-next boolean false +d-i apt-setup/cdrom/set-failed boolean false + +# Finish +d-i finish-install/reboot_in_progress note + +# Post-install: enable auto-login on tty1 for the created user +d-i preseed/late_command string \ + USER=$(grep ':x:1000:' /target/etc/passwd | cut -d: -f1); \ + mkdir -p /target/etc/systemd/system/getty@tty1.service.d; \ + echo '[Service]' > /target/etc/systemd/system/getty@tty1.service.d/autologin.conf; \ + echo 'ExecStart=' >> /target/etc/systemd/system/getty@tty1.service.d/autologin.conf; \ + echo "ExecStart=-/sbin/agetty --autologin $USER --noclear %I \$TERM" >> /target/etc/systemd/system/getty@tty1.service.d/autologin.conf