diff --git a/src/core/main.c b/src/core/main.c index 4633184b79..2e95edfbd8 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -2435,6 +2435,8 @@ int main(int argc, char *argv[]) { * available, and it previously wasn't. */ log_open(); + disable_printk_ratelimit(); + r = initialize_security( &loaded_policy, &security_start_timestamp, diff --git a/src/core/manager.c b/src/core/manager.c index dac4248356..600718e4bf 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -72,6 +72,7 @@ #include "string-util.h" #include "strv.h" #include "strxcpyx.h" +#include "sysctl-util.h" #include "syslog-util.h" #include "terminal-util.h" #include "time-util.h" @@ -4024,6 +4025,19 @@ static bool manager_journal_is_running(Manager *m) { return true; } +void disable_printk_ratelimit(void) { + /* Disable kernel's printk ratelimit. + * + * Logging to /dev/kmsg is most useful during early boot and shutdown, where normal logging + * mechanisms are not available. The semantics of this sysctl are such that any kernel command-line + * setting takes precedence. */ + int r; + + r = sysctl_write("kernel/printk_devkmsg", "on"); + if (r < 0) + log_debug_errno(r, "Failed to set sysctl kernel.printk_devkmsg=on: %m"); +} + void manager_recheck_journal(Manager *m) { assert(m); diff --git a/src/core/manager.h b/src/core/manager.h index 308ee013bd..424bf71704 100644 --- a/src/core/manager.h +++ b/src/core/manager.h @@ -499,6 +499,7 @@ bool manager_unit_inactive_or_pending(Manager *m, const char *name); void manager_check_finished(Manager *m); +void disable_printk_ratelimit(void); void manager_recheck_dbus(Manager *m); void manager_recheck_journal(Manager *m);