bootc_lib/install/
osbuild.rs1use std::process::Command;
7
8use anyhow::Result;
9use bootc_utils::CommandRunExt as _;
10use camino::Utf8Path;
11use cap_std_ext::{cap_std::fs::Dir, cmdext::CapStdExtCommandExt};
12use fn_error_context::context;
13
14fn adjust_etc_containers(tempdir: &Dir) -> Result<()> {
22 let etc_containers = Utf8Path::new("/etc/containers");
23 if !etc_containers.try_exists()? {
25 return Ok(());
26 }
27 if rustix::fs::access(etc_containers.as_std_path(), rustix::fs::Access::WRITE_OK).is_ok() {
28 return Ok(());
29 }
30 tempdir.create_dir_all("etc-ovl/upper")?;
32 tempdir.create_dir("etc-ovl/work")?;
33 let opts = format!("lowerdir={etc_containers},workdir=etc-ovl/work,upperdir=etc-ovl/upper");
34 Command::new("mount")
35 .log_debug()
36 .args(["-t", "overlay", "overlay", "-o", opts.as_str()])
37 .arg(etc_containers)
38 .cwd_dir(tempdir.try_clone()?)
39 .run_capture_stderr()?;
40 Ok(())
41}
42
43fn propagate_run_osbuild_containers(root: &Dir) -> Result<()> {
46 let osbuild_run_containers = Utf8Path::new("run/osbuild/containers");
47 if !root.try_exists(osbuild_run_containers)? {
49 return Ok(());
50 }
51 if crate::podman::storage_exists_default(root)? {
53 return Ok(());
54 }
55 let relative_storage = Utf8Path::new(crate::podman::CONTAINER_STORAGE.trim_start_matches('/'));
56 root.create_dir_all(relative_storage)?;
57 Command::new("mount")
58 .log_debug()
59 .arg("--rbind")
60 .args([osbuild_run_containers, relative_storage])
61 .cwd_dir(root.try_clone()?)
62 .run_capture_stderr()?;
63 Ok(())
64}
65
66#[context("bootc-image-builder adjustments")]
69pub(crate) fn adjust_for_bootc_image_builder(root: &Dir, tempdir: &Dir) -> Result<()> {
70 adjust_etc_containers(tempdir)?;
71 propagate_run_osbuild_containers(root)?;
72 Ok(())
73}