From 24f929dee287c3678c72a4d6f14088b3bbf96112 Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Mon, 8 Feb 2021 14:59:12 -0500 Subject: [PATCH] Add /etc/rpm/macros.rpm-ostree to set %_dbpath to /usr/lib/sysimage/rpm We trigger a librpm macro file load in many of our paths. Since the default value shipped by rpm's macro file sets `_dbpath` to `/var/lib/rpm`, we have to explicitly set that back to `/usr/share/rpm` in those paths. This became more problematic recently with libsolv v0.7.17 which fully keys off of `_dbpath` to find the rpmdb path to load: https://github.com/openSUSE/libsolv/commit/04d4d036b275693a23eef75fba634e7cea2f1a6d And it's not technically wrong; we really should make that macro not lie. This is what this patch does by injecting an RPM macro file in our composes which sets it to our path. (So then e.g. the `rpm` CLI doesn't actually need the `/var/lib/rpm` backcompat link anymore, though there's no harm in leaving it.) In the future, we should be able to drop this once we move all of Fedora to `/usr/lib/sysimage/rpm` (see https://github.com/coreos/fedora-coreos-tracker/issues/639). Closes: #2548 --- rust/src/composepost.rs | 19 +++++++++++++++++++ src/libpriv/rpmostree-core.cxx | 6 ++++-- src/libpriv/rpmostree-core.h | 1 + tests/compose/libbasic-test.sh | 4 ++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/rust/src/composepost.rs b/rust/src/composepost.rs index c5bb74024e..7dedbe1b4d 100644 --- a/rust/src/composepost.rs +++ b/rust/src/composepost.rs @@ -12,6 +12,9 @@ use std::io; use std::io::{BufRead, Write}; use std::path::Path; +/* See rpmostree-core.h */ +const RPMOSTREE_SYSIMAGE_RPMDB: &'static str = "usr/lib/sysimage/rpm"; + // rpm-ostree uses /home → /var/home by default as generated by our // rootfs; we don't expect people to change this. Let's be nice // and also fixup the $HOME entries generated by `useradd` so @@ -55,6 +58,21 @@ fn postprocess_presets(rootfs_dfd: &openat::Dir) -> Result<()> { Ok(()) } +// We keep hitting issues with the ostree-remount preset not being +// enabled; let's just do this rather than trying to propagate the +// preset everywhere. +fn postprocess_rpm_macro(rootfs_dfd: &openat::Dir) -> Result<()> { + let rpm_macros_dir = "usr/lib/rpm/macros.d"; + rootfs_dfd.ensure_dir_all(rpm_macros_dir, 0o755)?; + let rpm_macros_dfd = rootfs_dfd.sub_dir(rpm_macros_dir)?; + rpm_macros_dfd.write_file_with("macros.rpm-ostree", 0o644, |w| -> Result<()> { + w.write_all(b"%_dbpath /")?; + w.write_all(RPMOSTREE_SYSIMAGE_RPMDB.as_bytes())?; + Ok(()) + })?; + Ok(()) +} + // This function does two things: (1) make sure there is a /home --> /var/home substitution rule, // and (2) make sure there *isn't* a /var/home -> /home substition rule. The latter check won't // technically be needed once downstreams have: @@ -90,6 +108,7 @@ pub(crate) fn compose_postprocess_final(rootfs_dfd: i32) -> CxxResult<()> { postprocess_useradd, postprocess_presets, postprocess_subs_dist, + postprocess_rpm_macro, ]; Ok(tasks.par_iter().try_for_each(|f| f(&rootfs_dfd))?) } diff --git a/src/libpriv/rpmostree-core.cxx b/src/libpriv/rpmostree-core.cxx index b47140e16b..f3fa2c53f3 100644 --- a/src/libpriv/rpmostree-core.cxx +++ b/src/libpriv/rpmostree-core.cxx @@ -753,7 +753,8 @@ rpmostree_context_setup (RpmOstreeContext *self, dnf_context_set_rpm_macro (self->dnfctx, "_install_langs", opt->str); } - /* This is what we use as default. */ + /* This is what we use as default. Note we should be able to drop this in the + * future now that we inject a macro to set that value in our OSTrees. */ dnf_context_set_rpm_macro (self->dnfctx, "_dbpath", "/" RPMOSTREE_RPMDB_LOCATION); /* Set the database backend only in the compose path. It then becomes the default @@ -4130,7 +4131,8 @@ rpmostree_context_assemble (RpmOstreeContext *self, rpmtsSetRootDir (ordering_ts, dnf_context_get_install_root (dnfctx)); /* First for the ordering TS, set the dbpath to relative, which will also gain - * the root dir. + * the root dir. Note we should be able to drop this in the future now that we + * inject a macro to set that value in our OSTrees. */ set_rpm_macro_define ("_dbpath", "/" RPMOSTREE_RPMDB_LOCATION); diff --git a/src/libpriv/rpmostree-core.h b/src/libpriv/rpmostree-core.h index fb347622e0..45947a1334 100644 --- a/src/libpriv/rpmostree-core.h +++ b/src/libpriv/rpmostree-core.h @@ -44,6 +44,7 @@ G_BEGIN_DECLS /* See http://lists.rpm.org/pipermail/rpm-maint/2017-October/006681.html */ #define RPMOSTREE_RPMDB_LOCATION "usr/share/rpm" #define RPMOSTREE_SYSIMAGE_DIR "usr/lib/sysimage" +/* This is also defined on the Rust side. */ #define RPMOSTREE_SYSIMAGE_RPMDB RPMOSTREE_SYSIMAGE_DIR "/rpm" #define RPMOSTREE_BASE_RPMDB RPMOSTREE_SYSIMAGE_DIR "/rpm-ostree-base-db" diff --git a/tests/compose/libbasic-test.sh b/tests/compose/libbasic-test.sh index 883ddf8d68..b9c8328c4a 100644 --- a/tests/compose/libbasic-test.sh +++ b/tests/compose/libbasic-test.sh @@ -39,6 +39,10 @@ done ostree --repo=${repo} ls ${treeref} /usr/lib/sysimage/rpm >/dev/null echo "ok db" +ostree --repo=${repo} cat ${treeref} /usr/etc/rpm/macros.rpm-ostree > rpm-ostree-macro.txt +assert_file_has_content_literal rpm-ostree-macro.txt '%_dbpath /usr/share/rpm' +echo "ok rpm macro" + ostree --repo=${repo} show --print-metadata-key exampleos.gitrepo ${treeref} > meta.txt assert_file_has_content meta.txt 'rev.*97ec21c614689e533d294cdae464df607b526ab9' assert_file_has_content meta.txt 'src.*https://gitlab.com/exampleos/custom-atomic-host'