deploy: Add bootloader-naming-2 opt-init
authorColin Walters <walters@verbum.org>
Thu, 24 Aug 2023 13:40:54 +0000 (09:40 -0400)
committerColin Walters <walters@verbum.org>
Thu, 24 Aug 2023 13:40:54 +0000 (09:40 -0400)
I've verified that this fixes compatibility with GRUB, which
parses the filename:
https://github.com/ostreedev/ostree/issues/2961

However, out of a large degree of conservatism I've made this
an opt-in behavior for now.

My plan is to test it out in the FCOS development streams first.

src/libostree/ostree-sysroot-deploy.c
src/libostree/ostree-sysroot-private.h
src/libostree/ostree-sysroot.c
tests/inst/src/destructive.rs

index 48a49e47f635a7d1a3d961f5879c2af9107a8d90..b756c76a3742a47fec5d69fe6e86609b4af58659 100644 (file)
@@ -1912,8 +1912,15 @@ install_deployment_kernel (OstreeSysroot *sysroot, int new_bootversion,
   const char *bootcsum = ostree_deployment_get_bootcsum (deployment);
   g_autofree char *bootcsumdir = g_strdup_printf ("ostree/%s-%s", osname, bootcsum);
   g_autofree char *bootconfdir = g_strdup_printf ("loader.%d/entries", new_bootversion);
-  g_autofree char *bootconf_name = g_strdup_printf (
-      "ostree-%d-%s.conf", n_deployments - ostree_deployment_get_index (deployment), osname);
+  g_autofree char *bootconf_name = NULL;
+  guint index = n_deployments - ostree_deployment_get_index (deployment);
+  // Allow opt-in to dropping the stateroot, because grub2 parses the *filename* and ignores
+  // the version field.  xref https://github.com/ostreedev/ostree/issues/2961
+  bool use_new_naming = (sysroot->opt_flags & OSTREE_SYSROOT_GLOBAL_OPT_BOOTLOADER_NAMING_2) > 0;
+  if (use_new_naming)
+    bootconf_name = g_strdup_printf ("ostree-%d.conf", index);
+  else
+    bootconf_name = g_strdup_printf ("ostree-%d-%s.conf", index, osname);
   if (!glnx_shutil_mkdir_p_at (sysroot->boot_fd, bootcsumdir, 0775, cancellable, error))
     return FALSE;
 
index 63a294188c53edf2afbbf7276f0ef7599f4b4c7f..a608a7a551d846793d57e55476bad7e7f42629e8 100644 (file)
@@ -45,6 +45,7 @@ typedef enum
   OSTREE_SYSROOT_GLOBAL_OPT_SKIP_SYNC = 1 << 0,
   /* See https://github.com/ostreedev/ostree/pull/2847 */
   OSTREE_SYSROOT_GLOBAL_OPT_EARLY_PRUNE = 1 << 1,
+  OSTREE_SYSROOT_GLOBAL_OPT_BOOTLOADER_NAMING_2 = 1 << 2,
 } OstreeSysrootGlobalOptFlags;
 
 typedef enum
index 8bcc2f733ec43da0fe7b14b1a2dd6744abcc14df..36dac18426ef6c27f1bbbda14076ae11746016ae 100644 (file)
@@ -180,6 +180,7 @@ ostree_sysroot_init (OstreeSysroot *self)
   const GDebugKey globalopt_keys[] = {
     { "skip-sync", OSTREE_SYSROOT_GLOBAL_OPT_SKIP_SYNC },
     { "early-prune", OSTREE_SYSROOT_GLOBAL_OPT_EARLY_PRUNE },
+    { "bootloader-naming-2", OSTREE_SYSROOT_GLOBAL_OPT_BOOTLOADER_NAMING_2 },
   };
   const GDebugKey keys[] = {
     { "mutable-deployments", OSTREE_SYSROOT_DEBUG_MUTABLE_DEPLOYMENTS },
index c780f51cdf922e8d9a6dfe3336c1f91c01b7e596..aad92714a1816f57a9ee579379ec42df5d670585 100644 (file)
@@ -560,9 +560,10 @@ fn impl_transaction_test<M: AsRef<str>>(
 fn suppress_ostree_global_sync(sh: &xshell::Shell) -> Result<()> {
     let dropindir = "/etc/systemd/system/ostree-finalize-staged.service.d";
     std::fs::create_dir_all(dropindir)?;
+    // Aslo opt-in to the new bootloader naming
     std::fs::write(
-        Path::new(dropindir).join("50-suppress-sync.conf"),
-        "[Service]\nEnvironment=OSTREE_SYSROOT_OPTS=skip-sync\n",
+        Path::new(dropindir).join("50-test-options.conf"),
+        "[Service]\nEnvironment=OSTREE_SYSROOT_OPTS=skip-sync,bootloader-naming-2\n",
     )?;
     cmd!(sh, "systemctl daemon-reload").run()?;
     Ok(())