Skip to content

Commit

Permalink
prepare-root: Add ostree.prepare-root.composefs
Browse files Browse the repository at this point in the history
We have a use case for overriding the composefs state via
the kernel commandline; see e.g.
https://gitlab.com/fedora/bootc/tracker/-/issues/27

Signed-off-by: Colin Walters <walters@verbum.org>
  • Loading branch information
cgwalters committed Jul 10, 2024
1 parent 65ff404 commit 575563a
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 5 deletions.
12 changes: 12 additions & 0 deletions man/ostree-prepare-root.xml
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,18 @@ License along with this library. If not, see <https://www.gnu.org/licenses/>.
commit must match the target composefs image.</para></listitem>
</varlistentry>
</variablelist>

<para>
The following kernel commandline parameters are also parsed:
</para>
<variablelist>
<varlistentry>
<term><varname>ostree.prepare-root.composefs</varname></term>
<listitem><para>This accepts the same values as <literal>composefs.enabled</literal> above, and overrides the config file (if present).
For example, specifying <literal>ostree.prepare-root.composefs=0</literal> will disable composefs, even if it is enabled by default in the initrd config.</para></listitem>
</varlistentry>
</variablelist>

</refsect1>


Expand Down
2 changes: 1 addition & 1 deletion src/libostree/ostree-sysroot-deploy.c
Original file line number Diff line number Diff line change
Expand Up @@ -655,7 +655,7 @@ checkout_deployment_tree (OstreeSysroot *sysroot, OstreeRepo *repo, OstreeDeploy
// However, we don't load the keys here, because they may not exist, such
// as in the initial deploy
g_autoptr (ComposefsConfig) composefs_config
= otcore_load_composefs_config (prepare_root_config, FALSE, error);
= otcore_load_composefs_config ("", prepare_root_config, FALSE, error);
if (!composefs_config)
return glnx_prefix_error (error, "Reading composefs config");

Expand Down
23 changes: 22 additions & 1 deletion src/libotcore/otcore-prepare-root.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,11 @@ otcore_free_composefs_config (ComposefsConfig *config)

// Parse the [composefs] section of the prepare-root.conf.
ComposefsConfig *
otcore_load_composefs_config (GKeyFile *config, gboolean load_keys, GError **error)
otcore_load_composefs_config (const char *cmdline, GKeyFile *config, gboolean load_keys, GError **error)
{
g_assert (cmdline);
g_assert (config);

GLNX_AUTO_PREFIX_ERROR ("Loading composefs config", error);

g_autoptr (ComposefsConfig) ret = g_new0 (ComposefsConfig, 1);
Expand Down Expand Up @@ -214,5 +217,23 @@ otcore_load_composefs_config (GKeyFile *config, gboolean load_keys, GError **err
return glnx_null_throw (error, "public key file specified, but no public keys found");
}

g_autofree char *ostree_composefs
= otcore_find_proc_cmdline_key (cmdline, "ostree.prepare-root.composefs");
if (ostree_composefs)
{
if (g_strcmp0 (ostree_composefs, "signed") == 0)
{
ret->enabled = OT_TRISTATE_YES;
ret->is_signed = true;
}
else
{
// The other states force off signatures
ret->is_signed = false;
if (!_ostree_parse_tristate (ostree_composefs, &ret->enabled, error))
return FALSE;
}
}

return g_steal_pointer (&ret);
}
2 changes: 1 addition & 1 deletion src/libotcore/otcore.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ typedef struct
void otcore_free_composefs_config (ComposefsConfig *config);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ComposefsConfig, otcore_free_composefs_config)

ComposefsConfig *otcore_load_composefs_config (GKeyFile *config, gboolean load_keys,
ComposefsConfig *otcore_load_composefs_config (const char *cmdline, GKeyFile *config, gboolean load_keys,
GError **error);

// Our directory with transient state (eventually /run/ostree-booted should be a link to
Expand Down
2 changes: 1 addition & 1 deletion src/switchroot/ostree-prepare-root.c
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ main (int argc, char *argv[])
// We always parse the composefs config, because we want to detect and error
// out if it's enabled, but not supported at compile time.
g_autoptr (ComposefsConfig) composefs_config
= otcore_load_composefs_config (config, TRUE, &error);
= otcore_load_composefs_config (kernel_cmdline, config, TRUE, &error);
if (!composefs_config)
errx (EXIT_FAILURE, "%s", error->message);

Expand Down
24 changes: 23 additions & 1 deletion tests/inst/src/composefs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,19 @@ fn verify_composefs_signed(sh: &xshell::Shell, metadata: &glib::VariantDict) ->
Ok(())
}

fn verify_disable_composefs(sh: &xshell::Shell, metadata: &glib::VariantDict) -> Result<()> {
assert_eq!(
metadata
.lookup::<bool>("composefs")
.unwrap()
.unwrap_or_default(),
false
);
let fstype = cmd!(sh, "findmnt -n -o FSTYPE /").read()?;
assert_ne!(fstype.as_str(), "overlay");
Ok(())
}

pub(crate) fn itest_composefs() -> Result<()> {
let sh = &xshell::Shell::new()?;
let mark = match crate::test::get_reboot_mark()? {
Expand Down Expand Up @@ -165,7 +178,16 @@ pub(crate) fn itest_composefs() -> Result<()> {
Err(reboot("2"))?;
Ok(())
}
"2" => verify_composefs_signed(sh, &metadata),
"2" => {
verify_composefs_signed(sh, &metadata)?;
cmd!(
sh,
"rpm-ostree kargs --append=ostree.prepare-root.composefs=0"
)
.run()?;
Err(reboot("3"))
}
"3" => verify_disable_composefs(sh, &metadata),
o => anyhow::bail!("Unrecognized reboot mark {o}"),
}
}
Expand Down

0 comments on commit 575563a

Please sign in to comment.