From 10e465c3c41f54c773c2b7c21da69e52f0c1ce99 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 31 Aug 2022 13:50:21 -0400 Subject: [PATCH] Add `sysroot.bootprefix` option This is a follow up to https://github.com/ostreedev/ostree/pull/2149/commits/0ced9fde7649271d9458ca424aa8c41908634b02 "sysroot: Support /boot on root or as seperate filesystem for syslinux and u-boot" What we should have done at the time is changed our bootloader entries to be prefixed with `/boot`. This means that the GRUB2 BLS support will Just Work. For now, I'm making this option default to off out of a lot of conservatism. I think in the future we should flip this on by default. --- Makefile-tests.am | 1 + man/ostree.repo-config.xml | 9 +++++++ src/libostree/ostree-repo-private.h | 1 + src/libostree/ostree-repo.c | 5 ++++ src/libostree/ostree-sysroot-deploy.c | 12 +++++---- tests/test-admin-deploy-bootprefix.sh | 35 +++++++++++++++++++++++++++ 6 files changed, 58 insertions(+), 5 deletions(-) create mode 100755 tests/test-admin-deploy-bootprefix.sh diff --git a/Makefile-tests.am b/Makefile-tests.am index c87893ee..c20132fc 100644 --- a/Makefile-tests.am +++ b/Makefile-tests.am @@ -98,6 +98,7 @@ _installed_or_uninstalled_test_scripts = \ tests/test-admin-upgrade-endoflife.sh \ tests/test-admin-upgrade-systemd-update.sh \ tests/test-admin-deploy-syslinux.sh \ + tests/test-admin-deploy-bootprefix.sh \ tests/test-admin-deploy-2.sh \ tests/test-admin-deploy-karg.sh \ tests/test-admin-deploy-switch.sh \ diff --git a/man/ostree.repo-config.xml b/man/ostree.repo-config.xml index 5afeac8a..5e6d9d89 100644 --- a/man/ostree.repo-config.xml +++ b/man/ostree.repo-config.xml @@ -415,6 +415,15 @@ License along with this library. If not, see . + + bootprefix + A boolean value; defaults to false. If set to true, the bootloader entries + generated will include /boot as a prefix. This will likely be turned + on by default in the future. + + + + diff --git a/src/libostree/ostree-repo-private.h b/src/libostree/ostree-repo-private.h index 0d33f7c2..f230a7de 100644 --- a/src/libostree/ostree-repo-private.h +++ b/src/libostree/ostree-repo-private.h @@ -225,6 +225,7 @@ struct OstreeRepo { gchar **repo_finders; OstreeCfgSysrootBootloaderOpt bootloader; /* Configure which bootloader to use. */ GHashTable *bls_append_values; /* Parsed key-values from bls-append-except-default key in config. */ + gboolean enable_bootprefix; /* If true, prepend bootloader entries with /boot */ OstreeRepo *parent_repo; }; diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index 90cde651..195ae667 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -3549,6 +3549,11 @@ reload_sysroot_config (OstreeRepo *self, g_hash_table_replace (self->bls_append_values, key, value); } + if (!ot_keyfile_get_boolean_with_default (self->config, "sysroot", + "bootprefix", FALSE, + &self->enable_bootprefix, error)) + return FALSE; + return TRUE; } diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c index 7b2f1a6f..4e8e2a2e 100644 --- a/src/libostree/ostree-sysroot-deploy.c +++ b/src/libostree/ostree-sysroot-deploy.c @@ -1856,6 +1856,8 @@ install_deployment_kernel (OstreeSysroot *sysroot, OstreeRepo *repo = ostree_sysroot_repo (sysroot); + const char *bootprefix = repo->enable_bootprefix ? "/boot/" : "/"; + /* Install (hardlink/copy) the kernel into /boot/ostree/osname-${bootcsum} if * it doesn't exist already. */ @@ -1936,7 +1938,7 @@ install_deployment_kernel (OstreeSysroot *sysroot, * /boot itself and drop the boocsum dir concept entirely. */ g_autofree char *destpath = - g_strdup_printf ("/" _OSTREE_SYSROOT_BOOT_INITRAMFS_OVERLAYS "/%s.img", checksum); + g_strdup_printf ("%s%s/%s.img", bootprefix, _OSTREE_SYSROOT_BOOT_INITRAMFS_OVERLAYS, checksum); const char *rel_destpath = destpath + 1; /* lazily allocate array and create dir so we don't pollute /boot if not needed */ @@ -2032,7 +2034,7 @@ install_deployment_kernel (OstreeSysroot *sysroot, g_autofree char *version_key = g_strdup_printf ("%d", n_deployments - ostree_deployment_get_index (deployment)); ostree_bootconfig_parser_set (bootconfig, OSTREE_COMMIT_META_KEY_VERSION, version_key); - g_autofree char * boot_relpath = g_strconcat ("/", bootcsumdir, "/", kernel_layout->kernel_namever, NULL); + g_autofree char * boot_relpath = g_strconcat (bootprefix, bootcsumdir, "/", kernel_layout->kernel_namever, NULL); ostree_bootconfig_parser_set (bootconfig, "linux", boot_relpath); val = ostree_bootconfig_parser_get (bootconfig, "options"); @@ -2041,7 +2043,7 @@ install_deployment_kernel (OstreeSysroot *sysroot, if (kernel_layout->initramfs_namever) { g_autofree char * initrd_boot_relpath = - g_strconcat ("/", bootcsumdir, "/", kernel_layout->initramfs_namever, NULL); + g_strconcat (bootprefix, bootcsumdir, "/", kernel_layout->initramfs_namever, NULL); ostree_bootconfig_parser_set (bootconfig, "initrd", initrd_boot_relpath); if (overlay_initrds) @@ -2061,7 +2063,7 @@ install_deployment_kernel (OstreeSysroot *sysroot, if (kernel_layout->devicetree_namever) { - g_autofree char * dt_boot_relpath = g_strconcat ("/", bootcsumdir, "/", kernel_layout->devicetree_namever, NULL); + g_autofree char * dt_boot_relpath = g_strconcat (bootprefix, bootcsumdir, "/", kernel_layout->devicetree_namever, NULL); ostree_bootconfig_parser_set (bootconfig, "devicetree", dt_boot_relpath); } else if (kernel_layout->devicetree_srcpath) @@ -2070,7 +2072,7 @@ install_deployment_kernel (OstreeSysroot *sysroot, * want to point to a whole directory of device trees. * See: https://github.com/ostreedev/ostree/issues/1900 */ - g_autofree char * dt_boot_relpath = g_strconcat ("/", bootcsumdir, "/", kernel_layout->devicetree_srcpath, NULL); + g_autofree char * dt_boot_relpath = g_strconcat (bootprefix, bootcsumdir, "/", kernel_layout->devicetree_srcpath, NULL); ostree_bootconfig_parser_set (bootconfig, "fdtdir", dt_boot_relpath); } diff --git a/tests/test-admin-deploy-bootprefix.sh b/tests/test-admin-deploy-bootprefix.sh new file mode 100755 index 00000000..d80c310b --- /dev/null +++ b/tests/test-admin-deploy-bootprefix.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# +# Copyright (C) 2022 Colin Walters +# +# SPDX-License-Identifier: LGPL-2.0+ +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +set -euo pipefail + +. $(dirname $0)/libtest.sh + +# Exports OSTREE_SYSROOT so --sysroot not needed. +setup_os_repository "archive" "syslinux" + +${CMD_PREFIX} ostree --repo=sysroot/ostree/repo pull-local --remote=testos testos-repo testos/buildmain/x86_64-runtime +${CMD_PREFIX} ostree --repo=sysroot/ostree/repo config set sysroot.bootprefix 'true' +${CMD_PREFIX} ostree admin deploy --karg=root=LABEL=root --os=testos testos:testos/buildmain/x86_64-runtime +assert_file_has_content_literal sysroot/boot/loader/entries/ostree-1-testos.conf 'linux /boot/ostree/testos-' +assert_file_has_content_literal sysroot/boot/loader/entries/ostree-1-testos.conf 'initrd /boot/ostree/testos-' + +tap_ok "bootprefix" + +tap_end