1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-26 03:22:00 +03:00

Merge pull request #13118 from bluca/shutdown_watchdog_kexec

core: add KExecWatchdogSec and rename ShutdownWatchdogSec to RebootWatchdogSec
This commit is contained in:
Lennart Poettering 2019-07-24 11:11:03 +02:00 committed by GitHub
commit 544ad34257
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 43 additions and 18 deletions

View File

@ -127,7 +127,8 @@
<varlistentry> <varlistentry>
<term><varname>RuntimeWatchdogSec=</varname></term> <term><varname>RuntimeWatchdogSec=</varname></term>
<term><varname>ShutdownWatchdogSec=</varname></term> <term><varname>RebootWatchdogSec=</varname></term>
<term><varname>KExecWatchdogSec=</varname></term>
<listitem><para>Configure the hardware watchdog at runtime and at reboot. Takes a timeout value in seconds (or <listitem><para>Configure the hardware watchdog at runtime and at reboot. Takes a timeout value in seconds (or
in other time units if suffixed with <literal>ms</literal>, <literal>min</literal>, <literal>h</literal>, in other time units if suffixed with <literal>ms</literal>, <literal>min</literal>, <literal>h</literal>,
@ -138,9 +139,9 @@
system manager will ensure to contact it at least once in half the specified timeout interval. This feature system manager will ensure to contact it at least once in half the specified timeout interval. This feature
requires a hardware watchdog device to be present, as it is commonly the case in embedded and server requires a hardware watchdog device to be present, as it is commonly the case in embedded and server
systems. Not all hardware watchdogs allow configuration of all possible reboot timeout values, in which case systems. Not all hardware watchdogs allow configuration of all possible reboot timeout values, in which case
the closest available timeout is picked. <varname>ShutdownWatchdogSec=</varname> may be used to configure the the closest available timeout is picked. <varname>RebootWatchdogSec=</varname> may be used to configure the
hardware watchdog when the system is asked to reboot. It works as a safety net to ensure that the reboot takes hardware watchdog when the system is asked to reboot. It works as a safety net to ensure that the reboot takes
place even if a clean reboot attempt times out. Note that the <varname>ShutdownWatchdogSec=</varname> timeout place even if a clean reboot attempt times out. Note that the <varname>RebootWatchdogSec=</varname> timeout
applies only to the second phase of the reboot, i.e. after all regular services are already terminated, and applies only to the second phase of the reboot, i.e. after all regular services are already terminated, and
after the system and service manager process (PID 1) got replaced by the <filename>systemd-shutdown</filename> after the system and service manager process (PID 1) got replaced by the <filename>systemd-shutdown</filename>
binary, see system <citerefentry><refentrytitle>bootup</refentrytitle><manvolnum>7</manvolnum></citerefentry> binary, see system <citerefentry><refentrytitle>bootup</refentrytitle><manvolnum>7</manvolnum></citerefentry>
@ -148,8 +149,14 @@
and hence <varname>RuntimeWatchdogSec=</varname> is still honoured. In order to define a timeout on this first and hence <varname>RuntimeWatchdogSec=</varname> is still honoured. In order to define a timeout on this first
phase of system shutdown, configure <varname>JobTimeoutSec=</varname> and <varname>JobTimeoutAction=</varname> phase of system shutdown, configure <varname>JobTimeoutSec=</varname> and <varname>JobTimeoutAction=</varname>
in the <literal>[Unit]</literal> section of the <filename>shutdown.target</filename> unit. By default in the <literal>[Unit]</literal> section of the <filename>shutdown.target</filename> unit. By default
<varname>RuntimeWatchdogSec=</varname> defaults to 0 (off), and <varname>ShutdownWatchdogSec=</varname> to <varname>RuntimeWatchdogSec=</varname> defaults to 0 (off), and <varname>RebootWatchdogSec=</varname> to
10min. These settings have no effect if a hardware watchdog is not available.</para></listitem> 10min. <varname>KExecWatchdogSec=</varname> may be used to additionally enable the watchdog when kexec
is being executed rather than when rebooting. Note that if the kernel does not reset the watchdog on kexec (depending
on the specific hardware and/or driver), in this case the watchdog might not get disabled after kexec succeeds
and thus the system might get rebooted, unless <varname>RuntimeWatchdogSec=</varname> is also enabled at the same time.
For this reason it is recommended to enable <varname>KExecWatchdogSec=</varname> only if
<varname>RuntimeWatchdogSec=</varname> is also enabled.
These settings have no effect if a hardware watchdog is not available.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>

View File

@ -2409,7 +2409,10 @@ const sd_bus_vtable bus_manager_vtable[] = {
SD_BUS_PROPERTY("DefaultStandardOutput", "s", bus_property_get_exec_output, offsetof(Manager, default_std_output), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("DefaultStandardOutput", "s", bus_property_get_exec_output, offsetof(Manager, default_std_output), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("DefaultStandardError", "s", bus_property_get_exec_output, offsetof(Manager, default_std_output), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("DefaultStandardError", "s", bus_property_get_exec_output, offsetof(Manager, default_std_output), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_WRITABLE_PROPERTY("RuntimeWatchdogUSec", "t", bus_property_get_usec, property_set_runtime_watchdog, offsetof(Manager, runtime_watchdog), 0), SD_BUS_WRITABLE_PROPERTY("RuntimeWatchdogUSec", "t", bus_property_get_usec, property_set_runtime_watchdog, offsetof(Manager, runtime_watchdog), 0),
SD_BUS_WRITABLE_PROPERTY("ShutdownWatchdogUSec", "t", bus_property_get_usec, bus_property_set_usec, offsetof(Manager, shutdown_watchdog), 0), SD_BUS_WRITABLE_PROPERTY("RebootWatchdogUSec", "t", bus_property_get_usec, bus_property_set_usec, offsetof(Manager, reboot_watchdog), 0),
/* The following item is an obsolete alias */
SD_BUS_WRITABLE_PROPERTY("ShutdownWatchdogUSec", "t", bus_property_get_usec, bus_property_set_usec, offsetof(Manager, reboot_watchdog), SD_BUS_VTABLE_HIDDEN),
SD_BUS_WRITABLE_PROPERTY("KExecWatchdogUSec", "t", bus_property_get_usec, bus_property_set_usec, offsetof(Manager, kexec_watchdog), 0),
SD_BUS_WRITABLE_PROPERTY("ServiceWatchdogs", "b", bus_property_get_bool, bus_property_set_bool, offsetof(Manager, service_watchdogs), 0), SD_BUS_WRITABLE_PROPERTY("ServiceWatchdogs", "b", bus_property_get_bool, bus_property_set_bool, offsetof(Manager, service_watchdogs), 0),
SD_BUS_PROPERTY("ControlGroup", "s", NULL, offsetof(Manager, cgroup_root), 0), SD_BUS_PROPERTY("ControlGroup", "s", NULL, offsetof(Manager, cgroup_root), 0),
SD_BUS_PROPERTY("SystemState", "s", property_get_system_state, 0, 0), SD_BUS_PROPERTY("SystemState", "s", property_get_system_state, 0, 0),

View File

@ -121,7 +121,8 @@ static bool arg_default_timeout_abort_set;
static usec_t arg_default_start_limit_interval; static usec_t arg_default_start_limit_interval;
static unsigned arg_default_start_limit_burst; static unsigned arg_default_start_limit_burst;
static usec_t arg_runtime_watchdog; static usec_t arg_runtime_watchdog;
static usec_t arg_shutdown_watchdog; static usec_t arg_reboot_watchdog;
static usec_t arg_kexec_watchdog;
static char *arg_early_core_pattern; static char *arg_early_core_pattern;
static char *arg_watchdog_device; static char *arg_watchdog_device;
static char **arg_default_environment; static char **arg_default_environment;
@ -554,7 +555,9 @@ static int parse_config_file(void) {
{ "Manager", "NUMAMask", config_parse_numa_mask, 0, &arg_numa_policy }, { "Manager", "NUMAMask", config_parse_numa_mask, 0, &arg_numa_policy },
{ "Manager", "JoinControllers", config_parse_warn_compat, DISABLED_CONFIGURATION, NULL }, { "Manager", "JoinControllers", config_parse_warn_compat, DISABLED_CONFIGURATION, NULL },
{ "Manager", "RuntimeWatchdogSec", config_parse_sec, 0, &arg_runtime_watchdog }, { "Manager", "RuntimeWatchdogSec", config_parse_sec, 0, &arg_runtime_watchdog },
{ "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_shutdown_watchdog }, { "Manager", "RebootWatchdogSec", config_parse_sec, 0, &arg_reboot_watchdog },
{ "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_reboot_watchdog }, /* obsolete alias */
{ "Manager", "KExecWatchdogSec", config_parse_sec, 0, &arg_kexec_watchdog },
{ "Manager", "WatchdogDevice", config_parse_path, 0, &arg_watchdog_device }, { "Manager", "WatchdogDevice", config_parse_path, 0, &arg_watchdog_device },
{ "Manager", "CapabilityBoundingSet", config_parse_capability_set, 0, &arg_capability_bounding_set }, { "Manager", "CapabilityBoundingSet", config_parse_capability_set, 0, &arg_capability_bounding_set },
{ "Manager", "NoNewPrivileges", config_parse_bool, 0, &arg_no_new_privs }, { "Manager", "NoNewPrivileges", config_parse_bool, 0, &arg_no_new_privs },
@ -673,7 +676,8 @@ static void set_manager_settings(Manager *m) {
m->confirm_spawn = arg_confirm_spawn; m->confirm_spawn = arg_confirm_spawn;
m->service_watchdogs = arg_service_watchdogs; m->service_watchdogs = arg_service_watchdogs;
m->runtime_watchdog = arg_runtime_watchdog; m->runtime_watchdog = arg_runtime_watchdog;
m->shutdown_watchdog = arg_shutdown_watchdog; m->reboot_watchdog = arg_reboot_watchdog;
m->kexec_watchdog = arg_kexec_watchdog;
m->cad_burst_action = arg_cad_burst_action; m->cad_burst_action = arg_cad_burst_action;
manager_set_show_status(m, arg_show_status); manager_set_show_status(m, arg_show_status);
@ -1356,6 +1360,7 @@ static int become_shutdown(
_cleanup_strv_free_ char **env_block = NULL; _cleanup_strv_free_ char **env_block = NULL;
size_t pos = 7; size_t pos = 7;
int r; int r;
usec_t watchdog_timer = 0;
assert(shutdown_verb); assert(shutdown_verb);
assert(!command_line[pos]); assert(!command_line[pos]);
@ -1396,20 +1401,23 @@ static int become_shutdown(
assert(pos < ELEMENTSOF(command_line)); assert(pos < ELEMENTSOF(command_line));
if (STR_IN_SET(shutdown_verb, "reboot", "kexec") && if (streq(shutdown_verb, "reboot"))
arg_shutdown_watchdog > 0 && watchdog_timer = arg_reboot_watchdog;
arg_shutdown_watchdog != USEC_INFINITY) { else if (streq(shutdown_verb, "kexec"))
watchdog_timer = arg_kexec_watchdog;
if (watchdog_timer > 0 && watchdog_timer != USEC_INFINITY) {
char *e; char *e;
/* If we reboot let's set the shutdown /* If we reboot or kexec let's set the shutdown
* watchdog and tell the shutdown binary to * watchdog and tell the shutdown binary to
* repeatedly ping it */ * repeatedly ping it */
r = watchdog_set_timeout(&arg_shutdown_watchdog); r = watchdog_set_timeout(&watchdog_timer);
watchdog_close(r < 0); watchdog_close(r < 0);
/* Tell the binary how often to ping, ignore failure */ /* Tell the binary how often to ping, ignore failure */
if (asprintf(&e, "WATCHDOG_USEC="USEC_FMT, arg_shutdown_watchdog) > 0) if (asprintf(&e, "WATCHDOG_USEC="USEC_FMT, watchdog_timer) > 0)
(void) strv_consume(&env_block, e); (void) strv_consume(&env_block, e);
if (arg_watchdog_device && if (arg_watchdog_device &&
@ -2099,7 +2107,8 @@ static void reset_arguments(void) {
arg_default_start_limit_interval = DEFAULT_START_LIMIT_INTERVAL; arg_default_start_limit_interval = DEFAULT_START_LIMIT_INTERVAL;
arg_default_start_limit_burst = DEFAULT_START_LIMIT_BURST; arg_default_start_limit_burst = DEFAULT_START_LIMIT_BURST;
arg_runtime_watchdog = 0; arg_runtime_watchdog = 0;
arg_shutdown_watchdog = 10 * USEC_PER_MINUTE; arg_reboot_watchdog = 10 * USEC_PER_MINUTE;
arg_kexec_watchdog = 0;
arg_early_core_pattern = NULL; arg_early_core_pattern = NULL;
arg_watchdog_device = NULL; arg_watchdog_device = NULL;
@ -2638,7 +2647,8 @@ finish:
pager_close(); pager_close();
if (m) { if (m) {
arg_shutdown_watchdog = m->shutdown_watchdog; arg_reboot_watchdog = m->reboot_watchdog;
arg_kexec_watchdog = m->kexec_watchdog;
m = manager_free(m); m = manager_free(m);
} }

View File

@ -228,7 +228,8 @@ struct Manager {
char **client_environment; /* Environment variables created by clients through the bus API */ char **client_environment; /* Environment variables created by clients through the bus API */
usec_t runtime_watchdog; usec_t runtime_watchdog;
usec_t shutdown_watchdog; usec_t reboot_watchdog;
usec_t kexec_watchdog;
dual_timestamp timestamps[_MANAGER_TIMESTAMP_MAX]; dual_timestamp timestamps[_MANAGER_TIMESTAMP_MAX];

View File

@ -26,7 +26,9 @@
#NUMAPolicy=default #NUMAPolicy=default
#NUMAMask= #NUMAMask=
#RuntimeWatchdogSec=0 #RuntimeWatchdogSec=0
#RebootWatchdogSec=10min
#ShutdownWatchdogSec=10min #ShutdownWatchdogSec=10min
#KExecWatchdogSec=0
#WatchdogDevice= #WatchdogDevice=
#CapabilityBoundingSet= #CapabilityBoundingSet=
#NoNewPrivileges=no #NoNewPrivileges=no

View File

@ -702,7 +702,9 @@ LogLocation=
LogTarget= LogTarget=
RuntimeWatchdogSec= RuntimeWatchdogSec=
ShowStatus= ShowStatus=
RebootWatchdogSec=
ShutdownWatchdogSec= ShutdownWatchdogSec=
KExecWatchdogSec=
SuspendMode= SuspendMode=
SuspendState= SuspendState=
SystemCallArchitectures= SystemCallArchitectures=