From: Zbigniew Jędrzejewski-Szmek Date: Wed, 21 Feb 2024 12:41:57 +0000 (+0100) Subject: kernel-install: support full set of config files and drop-ins X-Git-Tag: v256-rc1~601^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=db26d8025e5bbc188f93b645124126bbc550caa5;p=thirdparty%2Fsystemd.git kernel-install: support full set of config files and drop-ins This brings the handling of config for kernel-install in line with most of systemd, i.e. we search the set of paths for the main config file, and the full set of drop-in paths for drop-ins. This mirrors what 07f5e35fe7967c824a87f18a3a1d3c22e5be70f5 did for udev.conf. That change worked out fine, so I hope this one will too. The update in the man page is minimal. I think we should split out a separate page for the config file later on. One motivating use case is to allow a drop-in to be created for temporary config overrides and then removed after the operation is done. --- diff --git a/man/kernel-install.xml b/man/kernel-install.xml index 519829579fa..168776b4d36 100644 --- a/man/kernel-install.xml +++ b/man/kernel-install.xml @@ -510,8 +510,12 @@ $KERNEL_INSTALL_CONF_ROOT can be set to override the location of the configuration files read by kernel-install. When set, - install.conf, entry-token, and other files will be - read from this directory. + install.conf, entry-token, and other files will be read from + this directory only. Note that this path is relative to the host, and in particular symlinks + in this directory are resolved relative to the host, even if + is used. This means that it is generally + not correct to use this variable to specify a directory underneath + root if symlinks are used there. $KERNEL_INSTALL_PLUGINS can be set to override the list of plugins executed by kernel-install. The argument is a whitespace-separated list of paths. @@ -639,14 +643,23 @@ /etc/kernel/install.conf + /run/kernel/install.conf + /usr/local/lib/kernel/install.conf /usr/lib/kernel/install.conf + /etc/kernel/install.conf.d/*.conf + /run/kernel/install.conf.d/*.conf + /usr/local/lib/kernel/install.conf.d/*.conf + /usr/lib/kernel/install.conf.d/*.conf Configuration file with options for kernel-install, as a series of KEY=VALUE assignments, compatible with shell syntax, following the same rules as described in os-release5. The first of the files that is found will be used. $KERNEL_INSTALL_CONF_ROOT may be - used to override the search path; see below for details. + used to override the search path; see below for details. Drop-in files may also be used + to extend the configuration with overrides, see + systemd.unit5. + Currently, the following keys are supported: MACHINE_ID=, diff --git a/src/kernel-install/kernel-install.c b/src/kernel-install/kernel-install.c index aa81af70d08..af44ab911b0 100644 --- a/src/kernel-install/kernel-install.c +++ b/src/kernel-install/kernel-install.c @@ -431,64 +431,59 @@ static int context_load_environment(Context *c) { return 0; } -static int context_load_install_conf_one(Context *c, const char *path) { - _cleanup_fclose_ FILE *f = NULL; - _cleanup_free_ char - *conf = NULL, *machine_id = NULL, *boot_root = NULL, *layout = NULL, - *initrd_generator = NULL, *uki_generator = NULL; +static int context_load_install_conf(Context *c) { + _cleanup_free_ char *machine_id = NULL, *boot_root = NULL, *layout = NULL, + *initrd_generator = NULL, *uki_generator = NULL; + const ConfigTableItem items[] = { + { NULL, "MACHINE_ID", config_parse_string, 0, &machine_id }, + { NULL, "BOOT_ROOT", config_parse_string, 0, &boot_root }, + { NULL, "layout", config_parse_string, 0, &layout }, + { NULL, "initrd_generator", config_parse_string, 0, &initrd_generator }, + { NULL, "uki_generator", config_parse_string, 0, &uki_generator }, + {} + }; int r; assert(c); - assert(path); - conf = path_join(path, "install.conf"); - if (!conf) - return log_oom(); - - r = chase_and_fopenat_unlocked(c->rfd, conf, CHASE_AT_RESOLVE_IN_ROOT, "re", NULL, &f); - if (r == -ENOENT) - return 0; - if (r < 0) - return log_error_errno(r, "Failed to chase %s: %m", conf); + if (c->conf_root) { + _cleanup_free_ char *conf = NULL; - log_debug("Loading %s…", conf); + conf = path_join(c->conf_root, "install.conf"); + if (!conf) + return log_oom(); - r = parse_env_file(f, conf, - "MACHINE_ID", &machine_id, - "BOOT_ROOT", &boot_root, - "layout", &layout, - "initrd_generator", &initrd_generator, - "uki_generator", &uki_generator); + r = config_parse_many( + STRV_MAKE_CONST(conf), + STRV_MAKE_CONST(c->conf_root), + "install.conf.d", + /* root= */ NULL, /* $KERNEL_INSTALL_CONF_ROOT and --root are independent */ + /* sections= */ NULL, + config_item_table_lookup, items, + CONFIG_PARSE_WARN, + /* userdata = */ NULL, + /* ret_stats_by_path= */ NULL, + /* ret_dropin_files= */ NULL); + } else + r = config_parse_standard_file_with_dropins_full( + arg_root, + "kernel/install.conf", + /* sections= */ NULL, + config_item_table_lookup, items, + CONFIG_PARSE_WARN, + /* userdata = */ NULL, + /* ret_stats_by_path= */ NULL, + /* ret_dropin_files= */ NULL); if (r < 0) - return log_error_errno(r, "Failed to parse '%s': %m", conf); - - (void) context_set_machine_id(c, machine_id, conf); - (void) context_set_boot_root(c, boot_root, conf); - (void) context_set_layout(c, layout, conf); - (void) context_set_initrd_generator(c, initrd_generator, conf); - (void) context_set_uki_generator(c, uki_generator, conf); - - log_debug("Loaded %s.", conf); - return 1; -} - -static int context_load_install_conf(Context *c) { - int r; - - assert(c); + return r == -ENOENT ? 0 : r; - if (c->conf_root) { - r = context_load_install_conf_one(c, c->conf_root); - if (r != 0) - return r; - } - - FOREACH_STRING(p, "/etc/kernel", "/usr/lib/kernel") { - r = context_load_install_conf_one(c, p); - if (r != 0) - return r; - } + (void) context_set_machine_id(c, machine_id, "config"); + (void) context_set_boot_root(c, boot_root, "config"); + (void) context_set_layout(c, layout, "config"); + (void) context_set_initrd_generator(c, initrd_generator, "config"); + (void) context_set_uki_generator(c, uki_generator, "config"); + log_debug("Loaded config."); return 0; } diff --git a/src/kernel-install/test-kernel-install.sh b/src/kernel-install/test-kernel-install.sh index 338d8119578..0e419798782 100755 --- a/src/kernel-install/test-kernel-install.sh +++ b/src/kernel-install/test-kernel-install.sh @@ -125,7 +125,8 @@ grep -qE 'initrd' "$BOOT_ROOT/the-token/1.1.1/initrd" # Install UKI if [ -f "$ukify" ]; then - cat >>"$D/sources/install.conf" <>"$D/sources/install.conf.d/override.conf" <