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:
commit
544ad34257
@ -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>
|
||||||
|
@ -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),
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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];
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -702,7 +702,9 @@ LogLocation=
|
|||||||
LogTarget=
|
LogTarget=
|
||||||
RuntimeWatchdogSec=
|
RuntimeWatchdogSec=
|
||||||
ShowStatus=
|
ShowStatus=
|
||||||
|
RebootWatchdogSec=
|
||||||
ShutdownWatchdogSec=
|
ShutdownWatchdogSec=
|
||||||
|
KExecWatchdogSec=
|
||||||
SuspendMode=
|
SuspendMode=
|
||||||
SuspendState=
|
SuspendState=
|
||||||
SystemCallArchitectures=
|
SystemCallArchitectures=
|
||||||
|
Loading…
Reference in New Issue
Block a user