From 411d8c72ecc31f1e7ecfa70b40e7766093aa14b2 Mon Sep 17 00:00:00 2001 From: Nick Rosbrook Date: Thu, 12 Oct 2023 13:39:56 -0400 Subject: [PATCH] nspawn: set CoredumpReceive=yes on container's scope when --boot is set When --boot is set, and --keep-unit is not, set CoredumpReceive=yes on the scope allocated for the container. When --keep-unit is set, nspawn does not allocate the container's unit, so the existing unit needs to configure this setting itself. Since systemd-nspawn@.service sets --boot and --keep-unit, add CoredumpReceives=yes to that unit. --- src/nspawn/nspawn-register.c | 24 ++++++++++++++++++------ src/nspawn/nspawn-register.h | 5 +++-- src/nspawn/nspawn.c | 6 ++++-- units/systemd-nspawn@.service.in | 1 + 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/nspawn/nspawn-register.c b/src/nspawn/nspawn-register.c index 2c9ebda61a1..f8f82e91b1b 100644 --- a/src/nspawn/nspawn-register.c +++ b/src/nspawn/nspawn-register.c @@ -8,6 +8,7 @@ #include "bus-util.h" #include "bus-wait-for-jobs.h" #include "nspawn-register.h" +#include "nspawn-settings.h" #include "special.h" #include "stat-util.h" #include "strv.h" @@ -16,7 +17,8 @@ static int append_machine_properties( sd_bus_message *m, CustomMount *mounts, unsigned n_mounts, - int kill_signal) { + int kill_signal, + bool coredump_receive) { unsigned j; int r; @@ -79,6 +81,12 @@ static int append_machine_properties( return bus_log_create_error(r); } + if (coredump_receive) { + r = sd_bus_message_append(m, "(sv)", "CoredumpReceive", "b", true); + if (r < 0) + return bus_log_create_error(r); + } + return 0; } @@ -114,7 +122,8 @@ int register_machine( char **properties, sd_bus_message *properties_message, bool keep_unit, - const char *service) { + const char *service, + StartMode start_mode) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; int r; @@ -174,7 +183,8 @@ int register_machine( m, mounts, n_mounts, - kill_signal); + kill_signal, + start_mode == START_BOOT); if (r < 0) return r; @@ -226,7 +236,8 @@ int allocate_scope( int kill_signal, char **properties, sd_bus_message *properties_message, - bool allow_pidfd) { + bool allow_pidfd, + StartMode start_mode) { _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL; _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; @@ -295,7 +306,8 @@ int allocate_scope( m, mounts, n_mounts, - kill_signal); + kill_signal, + start_mode == START_BOOT); if (r < 0) return r; @@ -321,7 +333,7 @@ int allocate_scope( * doesn't support PIDFDs yet, let's try without. */ if (allow_pidfd && sd_bus_error_has_names(&error, SD_BUS_ERROR_UNKNOWN_PROPERTY, SD_BUS_ERROR_PROPERTY_READ_ONLY)) - return allocate_scope(bus, machine_name, pid, slice, mounts, n_mounts, kill_signal, properties, properties_message, /* allow_pidfd= */ false); + return allocate_scope(bus, machine_name, pid, slice, mounts, n_mounts, kill_signal, properties, properties_message, /* allow_pidfd= */ false, start_mode); return log_error_errno(r, "Failed to allocate scope: %s", bus_error_message(&error, r)); } diff --git a/src/nspawn/nspawn-register.h b/src/nspawn/nspawn-register.h index be65d2b2300..4d16ac20e2d 100644 --- a/src/nspawn/nspawn-register.h +++ b/src/nspawn/nspawn-register.h @@ -6,9 +6,10 @@ #include "sd-id128.h" #include "nspawn-mount.h" +#include "nspawn-settings.h" -int register_machine(sd_bus *bus, const char *machine_name, pid_t pid, const char *directory, sd_id128_t uuid, int local_ifindex, const char *slice, CustomMount *mounts, unsigned n_mounts, int kill_signal, char **properties, sd_bus_message *properties_message, bool keep_unit, const char *service); +int register_machine(sd_bus *bus, const char *machine_name, pid_t pid, const char *directory, sd_id128_t uuid, int local_ifindex, const char *slice, CustomMount *mounts, unsigned n_mounts, int kill_signal, char **properties, sd_bus_message *properties_message, bool keep_unit, const char *service, StartMode start_mode); int unregister_machine(sd_bus *bus, const char *machine_name); -int allocate_scope(sd_bus *bus, const char *machine_name, pid_t pid, const char *slice, CustomMount *mounts, unsigned n_mounts, int kill_signal, char **properties, sd_bus_message *properties_message, bool allow_pidfds); +int allocate_scope(sd_bus *bus, const char *machine_name, pid_t pid, const char *slice, CustomMount *mounts, unsigned n_mounts, int kill_signal, char **properties, sd_bus_message *properties_message, bool allow_pidfds, StartMode start_mode); int terminate_scope(sd_bus *bus, const char *machine_name); diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 07234df85b2..de76b88c278 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -5061,7 +5061,8 @@ static int run_container( arg_property, arg_property_message, arg_keep_unit, - arg_container_service_name); + arg_container_service_name, + arg_start_mode); if (r < 0) return r; @@ -5075,7 +5076,8 @@ static int run_container( arg_kill_signal, arg_property, arg_property_message, - /* allow_pidfds= */ true); + /* allow_pidfds= */ true, + arg_start_mode); if (r < 0) return r; diff --git a/units/systemd-nspawn@.service.in b/units/systemd-nspawn@.service.in index 079d6064f63..ff66d4090ac 100644 --- a/units/systemd-nspawn@.service.in +++ b/units/systemd-nspawn@.service.in @@ -26,6 +26,7 @@ SuccessExitStatus=133 Slice=machine.slice Delegate=yes DelegateSubgroup=supervisor +CoredumpReceive=yes TasksMax=16384 {{SERVICE_WATCHDOG}} -- 2.47.3