From 75cb25c0b9250555212014e3ece14e5aadace6d4 Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Mon, 2 Feb 2026 12:58:19 +0100 Subject: [PATCH] firstboot/homectl: hide plymouth splashscreen when asking questions When plymouth is enabled, the screen gets all garbled when firstboot runs and asks questions. Disable the splash screen, but only when actually asking questions. --- src/firstboot/firstboot.c | 5 +++++ src/home/homectl.c | 4 ++++ src/shared/plymouth-util.c | 11 +++++++++++ src/shared/plymouth-util.h | 1 + 4 files changed, 21 insertions(+) diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c index 55bd273f21a..38e3adaed6e 100644 --- a/src/firstboot/firstboot.c +++ b/src/firstboot/firstboot.c @@ -43,6 +43,7 @@ #include "parse-util.h" #include "password-quality-util.h" #include "path-util.h" +#include "plymouth-util.h" #include "pretty-print.h" #include "proc-cmdline.h" #include "prompt-util.h" @@ -110,6 +111,10 @@ static void print_welcome(int rfd, sd_varlink **mute_console_link) { assert(rfd >= 0); assert(mute_console_link); + /* Needs to be called before mute_console or it will garble the screen */ + if (arg_welcome) + (void) plymouth_hide_splash(); + if (!*mute_console_link && arg_mute_console) (void) mute_console(mute_console_link); diff --git a/src/home/homectl.c b/src/home/homectl.c index cb73c51b1bb..c6a3d4b3eb5 100644 --- a/src/home/homectl.c +++ b/src/home/homectl.c @@ -48,6 +48,7 @@ #include "percent-util.h" #include "pidref.h" #include "pkcs11-util.h" +#include "plymouth-util.h" #include "polkit-agent.h" #include "pretty-print.h" #include "proc-cmdline.h" @@ -2891,6 +2892,9 @@ static int create_interactively(void) { return 0; } + /* Needs to be called before mute_console or it will garble the screen */ + (void) plymouth_hide_splash(); + _cleanup_(sd_varlink_flush_close_unrefp) sd_varlink *mute_console_link = NULL; (void) mute_console(&mute_console_link); diff --git a/src/shared/plymouth-util.c b/src/shared/plymouth-util.c index aaf604afd54..38b4f1fe2a1 100644 --- a/src/shared/plymouth-util.c +++ b/src/shared/plymouth-util.c @@ -56,3 +56,14 @@ int plymouth_send_msg(const char *text, bool pause_spinner) { return 0; } + +int plymouth_hide_splash(void) { + int r; + + r = plymouth_send_raw("H\0", 2, SOCK_NONBLOCK); + if (r < 0) + return log_full_errno(ERRNO_IS_NO_PLYMOUTH(r) ? LOG_DEBUG : LOG_WARNING, r, + "Failed to communicate with plymouth: %m"); + + return 0; +} diff --git a/src/shared/plymouth-util.h b/src/shared/plymouth-util.h index c73b44567c2..4030c5bdb62 100644 --- a/src/shared/plymouth-util.h +++ b/src/shared/plymouth-util.h @@ -7,6 +7,7 @@ int plymouth_connect(int flags); int plymouth_send_raw(const void *raw, size_t size, int flags); int plymouth_send_msg(const char *text, bool pause_spinner); +int plymouth_hide_splash(void); static inline bool ERRNO_IS_NO_PLYMOUTH(int r) { return IN_SET(ABS(r), EAGAIN, ENOENT) || ERRNO_IS_DISCONNECT(r); -- 2.47.3