About 1 boot in 10 of an installed system stops on a black screen at
"Starting Switch Root" until a key is pressed. systemd 257 and later
asks the console for its size with ANSI escape sequences when PID 1
starts and waits for the reply; with Plymouth holding the VT the reply
sometimes never comes.
Measured in QEMU on repeated boots of one install: 3 hangs in 30 and 1
in 40 on the prebuilt UKI, 7 in 40 on the stock initramfs, every one of
them ended by pressing Enter; none in 40 with a serial console, none in
40 with plymouth.enable=0, and none in 80 with
systemd.tty.term.console=dumb, which makes systemd skip the query.
systemd fixed two variants of this in v261; Arch's 261.2 still shows it.
The parameter goes where the last Plymouth boot fix went (3f725531,
initramfs_async=0): into the packaged omarchy-defaults.conf for fresh
installs, and a migration rebuilds the boot image on existing systems,
once per machine, only where the booted command line lacks it. Nothing
visible changes under "quiet splash".
Refs #2931
32 lines
1.6 KiB
Bash
32 lines
1.6 KiB
Bash
echo "Stop the boot from waiting on a black screen for the console to answer"
|
|
|
|
# systemd asks the console for its size when PID 1 starts and waits for the
|
|
# reply. With Plymouth holding the screen the reply sometimes never comes, and
|
|
# about 1 boot in 10 sits on a black screen until a key is pressed.
|
|
# omarchy-defaults.conf now carries systemd.tty.term.console=dumb, which makes
|
|
# systemd skip the query. The package has already written that file by the
|
|
# time this runs; the boot image still holds the old command line until it is
|
|
# rebuilt.
|
|
|
|
defaults_conf="${OMARCHY_LIMINE_DEFAULTS_CONF:-/etc/limine-entry-tool.d/omarchy-defaults.conf}"
|
|
running_cmdline="${OMARCHY_RUNNING_CMDLINE:-/proc/cmdline}"
|
|
rebuild_marker="${OMARCHY_LIMINE_REBUILD_MARKER:-/var/lib/omarchy/migrations/1791581004}"
|
|
param="systemd.tty.term.console=dumb"
|
|
|
|
omarchy-cmd-present limine-mkinitcpio || exit 0
|
|
[[ -f $defaults_conf && -r $running_cmdline ]] || exit 0
|
|
|
|
# The running kernel keeps its old command line until reboot, so a marker
|
|
# records the machine-wide rebuild: another user's migration must not repeat
|
|
# it before then, while a missing marker still retries an interrupted rebuild.
|
|
[[ ! -e $rebuild_marker ]] || exit 0
|
|
|
|
# A machine that boots with it already, or whose defaults were edited to leave
|
|
# it out, has nothing to rebuild.
|
|
[[ " $(<"$running_cmdline") " != *" $param "* ]] || exit 0
|
|
grep -Eq "^KERNEL_CMDLINE\[default\]\+=\".*${param//./\\.}.*\"" "$defaults_conf" || exit 0
|
|
|
|
echo "The booted kernel is missing $param; rebuilding the boot image"
|
|
sudo limine-mkinitcpio
|
|
sudo install -Dm644 /dev/null "$rebuild_marker"
|