Add `sysroot.bootprefix` option
authorColin Walters <walters@verbum.org>
Wed, 31 Aug 2022 17:50:21 +0000 (13:50 -0400)
committerColin Walters <walters@verbum.org>
Wed, 31 Aug 2022 20:30:31 +0000 (16:30 -0400)
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
man/ostree.repo-config.xml
src/libostree/ostree-repo-private.h
src/libostree/ostree-repo.c
src/libostree/ostree-sysroot-deploy.c
tests/test-admin-deploy-bootprefix.sh [new file with mode: 0755]

index c87893ee28bce444d268b009cc3e7584838a494f..c20132fc6904e2e02ad34efb3c627b20b86d5a13 100644 (file)
@@ -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 \
index 5afeac8a09425d89fb6bfbfd096c4ddeecaa6973..5e6d9d893525d06276cbc446c17905eacfc7e7fb 100644 (file)
@@ -415,6 +415,15 @@ License along with this library. If not, see <https://www.gnu.org/licenses/>.
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>bootprefix</varname></term>
+        <listitem><para>A boolean value; defaults to false.  If set to true, the bootloader entries
+        generated will include <literal>/boot</literal> as a prefix.  This will likely be turned
+        on by default in the future.
+        </para>
+        </listitem>
+      </varlistentry>
+
     </variablelist>
 
   </refsect1>
index 0d33f7c2d05e032359900d0daafa3f8a01de8118..f230a7de44c949437285e71dc1e93fc4abe49ec1 100644 (file)
@@ -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;
 };
index 90cde65139a3039437880a3e521451b6f70d465a..195ae667e99470611abac95624432238e8c7ba36 100644 (file)
@@ -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;
 }
 
index 7b2f1a6fccdc317f454ed9e5aa49cb8269b4a0f0..4e8e2a2eda3435bc5cd61663f67c18145558f013 100644 (file)
@@ -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 (executable)
index 0000000..d80c310
--- /dev/null
@@ -0,0 +1,35 @@
+#!/bin/bash
+#
+# Copyright (C) 2022 Colin Walters <walters@verbum.org>
+#
+# 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 <https://www.gnu.org/licenses/>.
+
+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