1
0
mirror of https://github.com/containers/bootc.git synced 2026-02-05 06:45:13 +01:00

255 Commits

Author SHA1 Message Date
John Eckersberg
1b898758c9 kernel: Add KernelPath enum
This just clarifies things in a few places to distinguish between a
UKI which has just a single path versus a traditional kernel with
separate vmlinuz and initramfs.

Also renames `find_uki_filename` to `find_uki_path` and updates the
return type to use `Utf8PathBuf` instead of just `String`.

Signed-off-by: John Eckersberg <jeckersb@redhat.com>
2026-02-03 16:28:53 -05:00
jbtrystram
0a757685ee install/bootupd: chroot to deployment
When `--src-imgref` is passed, the deployed systemd does not match the
running environnement. In this case, let's run bootupd from inside
the deployment. This makes sure we are using the binaries
shipped in the image (and relevant config files such as grub fragements).

We use bwrap to set up the chroot for a easier handling of the API
filesystems.

We could do that in all cases but i kept it behind the `--src-imgref`
option since when using the target container as the buildroot it will
have no impact, and we expect this scenario to be the most common.

In CoreOS we have a specific test that checks if the bootloader was
installed with the `grub2-install` of the image.

Fixes https://github.com/bootc-dev/bootc/issues/1559
Also see https://github.com/bootc-dev/bootc/issues/1455

Assisted-by: OpenCode (Opus 4.5)
Signed-off-by: jbtrystram <jbtrystram@redhat.com>
2026-02-03 11:07:15 -05:00
Matija Tudan
216d720b9d bootc-lib: fix ARM architecture support
Currently build fails for armv7, this fixes the issue:

```
1094.0    Compiling bootc-lib v1.12.1 (/bootc/crates/lib)
1097.2 error: Unsupported architecture
1097.2    --> crates/lib/src/discoverable_partition_specification.rs:523:13
1097.2     |
1097.2 523 |             compile_error!("Unsupported architecture")
1097.2     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1097.2
1157.8 error: could not compile `bootc-lib` (lib) due to 1 previous error
1157.8 error: Generating manpages: Syncing man pages: Extracting CLI: Running CLI JSON dump command: command exited with non-zero code `cargo run --features=docgen -- internals dump-cli-json`: 101
1157.8 make: *** [Makefile:44: manpages] Error 1
1157.8 make: Leaving directory '/bootc'
```

Signed-off-by: Matija Tudan <tudan.matija@gmail.com>
2026-02-03 14:53:07 +05:30
John Eckersberg
5d6dd67276 feat: Add bootc container ukify command
Add a new subcommand that builds a Unified Kernel Image (UKI) by
computing the necessary arguments from a container image and invoking
ukify. This simplifies the sealed image build workflow by having bootc
internally compute:

- The composefs digest (via existing compute-composefs-digest logic)
- Kernel arguments from /usr/lib/bootc/kargs.d/*.toml files
- Paths to kernel, initrd, and os-release

Any additional arguments are passed through to ukify unchanged, allowing
full control over signing, output paths, and other ukify options.

The seal-uki script is updated to use this new command instead of
manually computing these values and invoking ukify directly.

Also adds kargs.d configuration files for the sealed UKI workflow:
- 10-rootfs-rw.toml: Mount root filesystem read-write
- 21-console-hvc0.toml: Console configuration for QEMU/virtio

Closes: #1955

Assisted-by: OpenCode (Opus 4.5)
Signed-off-by: John Eckersberg <jeckersb@redhat.com>
2026-01-30 08:49:07 -05:00
Colin Walters
4f51a5fbcb Update to latest composefs-rs
To unblock reverse dependency testing.

(We still have the forked cfsctl, that's the only thing)

Signed-off-by: Colin Walters <walters@verbum.org>
2026-01-29 11:37:42 -05:00
Colin Walters
b17ca33ba9 docs: Enhance installation documentation with DPS and provisioning flow
Add comprehensive documentation for the installation process, with particular
focus on the Discoverable Partitions Specification (DPS) and first-boot
provisioning.

Main documentation (bootc-install.md):
- Add DPS section explaining partition type GUIDs and auto-discovery
- Add table showing when DPS vs explicit root= kargs are used
- Add provisioning and first boot section covering cloud-init,
  Ignition, SSH key injection, and custom provisioning
- Document the .bootc-aleph.json provenance file
- Fix typos ('boot install' -> 'bootc install', 'pased' -> 'passed')

Man page (bootc-install-to-disk.8.md):
- Document partition layout conceptually (avoiding specific sizes/GUIDs
  that may change between versions)
- Explain root filesystem discovery with systemd-gpt-auto-generator

Rustdoc for install.rs:
- Add comprehensive module documentation
- Document all installation modes (to-disk, to-filesystem, to-existing-root, reset)
- Explain OSTree vs Composefs storage backends
- Document key types (State, RootSetup, SourceInfo, SELinuxFinalState)
- List configuration paths and submodules

Rustdoc for discoverable_partition_specification.rs:
- Explain how bootc uses DPS for partition creation
- Document automatic root discovery mechanism
- Describe composefs and sealed boot integration

Assisted-by: OpenCode (Claude Sonnet 4)
Signed-off-by: Colin Walters <walters@verbum.org>
2026-01-28 12:47:03 -05:00
Colin Walters
d790891e7f docs: Add architecture documentation to internals page
Extend our internals docs to have more information.

Assisted-by: OpenCode (Sonnet 4)
Signed-off-by: Colin Walters <walters@verbum.org>
2026-01-28 12:47:03 -05:00
Colin Walters
fa856b1ef8 lib: Fix rustdoc warnings for URLs and intra-doc links
Wrap bare URLs in angle brackets to make them proper hyperlinks,
escape angle brackets in doc comments that look like HTML tags,
and fix broken intra-doc links.

Assisted-by: OpenCode (Sonnet 4)
Signed-off-by: Colin Walters <walters@verbum.org>
2026-01-28 12:47:03 -05:00
Colin Walters
1d8cf090f9 lib: Set user agent header for container image pulls
This allows registries to distinguish "image pulls for bootc client
runs" from other skopeo/containers-image users. The user agent will
be in the format "bootc/<version> skopeo/<version>".

All places in bootc that create ImageProxyConfig now use a new helper
function that sets the user_agent_prefix field.

Closes: https://github.com/bootc-dev/bootc/issues/1686
Assisted-by: OpenCode (Sonnet 4)
Signed-off-by: Colin Walters <walters@verbum.org>
2026-01-23 17:44:44 -05:00
Pragyan Poudyal
bf3987a465 composefs/selinux: Add tests
Tests added by Claude Code

Assisted-by: Claude Code (Sonnet 4)
Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2026-01-23 13:17:31 -05:00
Pragyan Poudyal
e59e967037 composefs/soft-reboot: Check for SELinux policy divergence
Until now while checking if a deployment is capable of being soft
rebooted, we were not taking into account any differences in SELinux
policies between the two deployments. This commit adds such a check

We only check for policy diff if SELinux is enabled

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>

composefs: Refactor

Add doc comments for StagedDeployment struct
Use `serde_json::to_writer` to prevent intermediate string allocation

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>

composefs/selinux: More refactor

Move SELinux realted oprations to a separate module
Minor refactoring and add some comments

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2026-01-23 13:17:31 -05:00
Pragyan Poudyal
d8347297bf composefs/update: Handle --download-only flag
When `--download-only` is passed, only download the image into the
composefs repository but don't finalize it.

Conver the /run/composefs/staged-deployment to a JSON file and Add a
finalization_locked field depending upon which the finalize service will
either finalize the staged deployment or leave it as is for garbage
collection (even though GC is not fully implemented right now).

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2026-01-23 13:17:31 -05:00
Pragyan Poudyal
653a1da6ca composefs/export: Update image digest query format
After bootc/commit/49d753f996747a9b1f531abf35ba4e207cf4f020,
composefs-rs saves config in the format `oci-config-sha256:`.

Update to match the same

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2026-01-23 13:17:31 -05:00
Pragyan Poudyal
e4d4a96f37 composefs: Don't soft-reboot automatically
Aligning with ostree API, now we only initiate soft-reboot if `--apply`
is passed to `bootc update`, `bootc switch`, else we only prepare the
soft reboot

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2026-01-23 13:17:31 -05:00
Pragyan Poudyal
7dd3683034 composefs: Add option to reset soft reboot state
Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2026-01-23 13:17:31 -05:00
jbtrystram
4c22d1664e install: Allow root and boot mount-specs in config
Allow configuring the root and boot filesystem mount
specs via the install configuration file under [install].

As for other options, CLI arguments take precedence.

For the to-existing-root flow, mount specs from config are ignored.
Example configuration:
```
[install]
root-mount-spec = "LABEL=rootfs"
boot-mount-spec = "UUID=abcd-1234"
```

Fixes https://github.com/bootc-dev/bootc/issues/1939

Assisted-by: Opencode (Claude Opus 4.5)
Signed-off-by: jbtrystram <jbtrystram@redhat.com>
2026-01-23 11:45:13 -05:00
jbtrystram
a17413c979 install: Allow setting ostree stateroot in install config
Support for configuring the stateroot name through the install
configuration file under `[install.ostree]`.
The CLI flag will override config file values, as for other options.

Partial fix for https://github.com/bootc-dev/bootc/issues/1939

Assisted-by: Opencode (Claude Opus 4.5)
Signed-off-by: jbtrystram <jbtrystram@redhat.com>
2026-01-23 11:45:13 -05:00
Joel Capitao
b901498d44 install: support configuring sysroot.bls-append-except-default
Add a new [install.ostree] configuration section to allow setting the
ostree sysroot.bls-append-except-default option during installation.

Closes: https://github.com/bootc-dev/bootc/issues/1710

Signed-off-by: Joel Capitao <jcapitao@redhat.com>
Co-authored-by: Jean-Baptiste Trystram <jbtrystram@redhat.com>
Assisted-by: Claude (Sonnet 4)
2026-01-22 07:37:59 -05:00
Colin Walters
efa510a90e Update composefs-rs to merged PR #209
The composefs-rs PR 209 has been merged to main. This updates
bootc to use the containers/composefs-rs repository at the
merge commit.

Key API changes:
- Directory::default() -> Directory::new(Stat::uninitialized())
- read_filesystem() no longer takes stat_root parameter
- New read_container_root() for OCI containers (propagates /usr metadata to root)
- stat_root CLI flag renamed to no_propagate_usr_to_root with inverted logic

See https://github.com/containers/composefs-rs/pull/209

Signed-off-by: Colin Walters <walters@verbum.org>
2026-01-21 19:15:05 -05:00
Pragyan Poudyal
f92bf5701f etc-merge: Create directory in new_etc if deleted
If a directory is modified/added in the current etc, but deleted in the
new etc, we'd want it in the new etc. This case prior to this commit
resulted in a panic as we were not taking it into account

Fixes: https://github.com/bootc-dev/bootc/issues/1924

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2026-01-21 03:59:51 -05:00
Colin Walters
d5c6515e23 lints: Factor out walk_configuration() helper
Add a helper function that returns WalkConfiguration with noxdev()
enabled by default. This ensures consistent behavior across all
filesystem walks in the linting code.

The doc comment clarifies that noxdev skips directory mount points
(to avoid descending into bind mounts, tmpfs, etc.) but non-directory
mount points like bind-mounted regular files will still be visited.

Assisted-by: OpenCode (Opus 4.5)
Signed-off-by: Colin Walters <walters@verbum.org>
2026-01-16 12:13:14 -05:00
Colin Walters
eecf5ae15c lints: Add nonempty-run-tmp warning for runtime-only directories
Add a lint that warns when /run or /tmp contain any content. These
directories are tmpfs at runtime and should be empty in container images.

Common causes of content in these directories include:
- podman/buildah's RUN --mount leaving directory stubs
- Build tools leaving temporary files

This is particularly important for bootc with composefs because content
in these directories can cause digest mismatches between build-time
(mounted filesystem) and install-time (OCI tar layers) views, leading
to sealed boot failures.

The lint uses the walk API with noxdev() to automatically skip mount
points, and filters out content injected by container runtimes
(.containerenv, secrets, packages).

Assisted-by: OpenCode (Opus 4.5)
Signed-off-by: Colin Walters <walters@verbum.org>
2026-01-16 12:13:14 -05:00
Chaser Huang
d5999a2af0 composefs: Fix is_image_pulled check
Upstream composefs-oci now writes manifest stream as oci-config-sha256:<sha256 checksum>

Signed-off-by: Chaser Huang <huangkangjing@gmail.com>
2026-01-16 08:17:18 +05:30
bootc-bot[bot]
9bb976d540 Release 1.12.1
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-01-15 19:53:46 -05:00
Colin Walters
3b0f38aa19 utils: Always print status to stderr
If we were waiting on a lock as part of `bootc status --format=json`
this information message would end up in stderr, corrupting the output.

Signed-off-by: Colin Walters <walters@verbum.org>
2026-01-14 16:45:50 -05:00
ckyrouac
40c5216a37 install: Fix bug in mount point check
This fixes a regression from https://github.com/bootc-dev/bootc/pull/1727
by removing the unnecessary mount point check prior to the recursive
function call. Also adds some tracing statements and updates the
integration test to validate the mount check works for this scenario:

/boot/efi mounted with contents in /boot/efi/EFI/firmware/foo

Signed-off-by: ckyrouac <ckyrouac@redhat.com>
2026-01-14 13:10:01 -05:00
Colin Walters
49d753f996 various: Update to latest composefs-rs API
Update composefs-rs from rev b636e0e9 to e9008489, adapting to API changes:

- merge_splitstream now takes 4 arguments instead of 3
- import_layer takes digest as string directly
- pull/seal return (digest, verity) as (String, ObjectID)
- SplitStreamWriter::new and write_stream have new signatures
- initialize_composefs_repository returns String instead of Sha256Digest

Co-authored-by: Allison Karlitskaya <allison.karlitskaya@redhat.com>
Assisted-by: OpenCode (Claude claude-sonnet-4-20250514)
Signed-off-by: Colin Walters <walters@verbum.org>
2026-01-12 19:52:34 +01:00
Daniele Guarascio
13d5db68aa Update workspace to Rust edition 2024
Migrate all crates from edition 2021 to 2024. This includes
updating Cargo.toml files and fixing code compatibility issues.

The MSRV is bumped to 1.85.0 to support edition 2024.

Note: global_init() requires #[allow(unsafe_code)] for
std::env::set_var which is now unsafe in edition 2024.
This is safe because the function is called early in main()
before any threads are spawned.

Closes: #1414

Signed-off-by: Daniele Guarascio <guarascio.daniele@gmail.com>
2026-01-12 17:38:26 +01:00
Shion Tanaka
ab78a79487 fix: Use unicode-width for accurate display width calculation
- status.rs: Use UnicodeWidthStr::width() for correct display alignment
- container.rs: Use as_bytes().len() for hex string length verification
- Add unicode-width dependency (already a transitive dep via comfy-table)

Assisted-by: Cursor (Auto)
Signed-off-by: Shion Tanaka <shtanaka@redhat.com>
2026-01-09 20:17:58 +01:00
Chaser Huang
4cb64bb996 nit: Fix typo and improve readability
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: Chaser Huang <huangkangjing@gmail.com>
2026-01-09 14:57:25 +05:30
Chaser Huang
1670cdc8ae composefs/status: resolve rollback entry correctly
Previous implementation had undefined behavior and was coincidentally correct under conditions where no rollback was performed, see #1887

Matches deployment entries in composefs deploy folder that are neither staged nor booted against entires defined in /boot to find out rollback entry.

Fixes #1887

Signed-off-by: Chaser Huang <huangkangjing@gmail.com>
2026-01-09 14:57:25 +05:30
Shion Tanaka
d2eb1b69e2 cli: Add shell completion generation command
- Add completion subcommand supporting bash, zsh, and fish

Assisted-by: Cursor (Auto)
Signed-off-by: Shion Tanaka <shtanaka@redhat.com>
2026-01-09 00:11:15 +01:00
Pragyan Poudyal
fd7f1b6ec4 copy-to-storage: Fix deadlock in ostree path
The sysroot lock was being taken by `get_host` before it was released by
the caller. Move the `get_host` function up the stack of calls

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2026-01-08 14:38:18 +01:00
Pragyan Poudyal
7f8565ed0a copy-to-storage: Refactor tar parsing
Inline the tar parsing/unpacking
Check for two NULL 512 blocks instead of just one
Share source image and target image generating code between composefs
and ostree

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2026-01-08 14:38:18 +01:00
Pragyan Poudyal
9f5c491a24 composefs/export: Use ocidir for creating OCI compliant directory
Instead of handling the history,metadata,annotations ourselves, delegate
them to `ocidir` crate. Also take into account the source and target
image references

Finally call `skopeo::copy` to copy to containers-storage

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2026-01-08 14:38:18 +01:00
Pragyan Poudyal
64a82e5794 composefs: Implement bootc image copy-to-storage
Export a composefs repository as an OCI image. In this iteration the
outputted files are in OCI Directory format and are plain TARs, i.e. not
compressed

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2026-01-08 14:38:18 +01:00
bootc-bot[bot]
0ee9b2276d Release 1.12.0
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-01-06 20:19:44 +01:00
Huijing Hei
1d7b73d24b install: mount esp in clean_boot_directories()
On FCOS, esp is not mounted after booted, need to find esp and
mount before cleaning, or `/boot/efi` will be removed.

Signed-off-by: Huijing Hei <hhei@redhat.com>
2026-01-06 17:17:18 +01:00
Huijing Hei
b9ac902709 install: should remove the empty dir under /boot
Fix what we did in
92d9d38494

Signed-off-by: Huijing Hei <hhei@redhat.com>
2026-01-06 17:17:18 +01:00
Huijing Hei
bf89a7dd11 install: add target_root_path for RootSetup
When running `install to-filesystem` on ostree OS, should use
`target_root_path` for bootupctl to install bootloader.

Signed-off-by: Huijing Hei <hhei@redhat.com>
2026-01-06 17:17:18 +01:00
Huijing Hei
19534d148e install: empty /boot & /boot/efi
Get pointer from Colin's comment
https://github.com/bootc-dev/bootc/pull/1752#issuecomment-3532953293
- Empty the complete ESP
- On ostree OS, empty `/boot` but preserve `/boot/loader`
- On none ostree OS, the loader is directory that needs to be
removed.

Signed-off-by: Huijing Hei <hhei@redhat.com>
2026-01-06 17:17:18 +01:00
Colin Walters
d5dd1af815 container inspect: Add human-readable and yaml output formats
The container inspect command previously only supported JSON output.
This extends it to support human-readable output (now the default)
and YAML, matching the output format options available in other
bootc commands like status.

The --json flag provides backward compatibility for scripts that
expect JSON output, while --format allows explicit selection of
any supported format.

Assisted-by: OpenCode (Sonnet 4)
Signed-off-by: Colin Walters <walters@verbum.org>
2025-12-29 12:40:36 +01:00
Colin Walters
fd83c659a8 cli: Extend bootc container inspect with kernel info
The container-inspect command previously only reported kernel arguments.
Extend it to also report kernel information, including whether the image
contains a traditional kernel or a Unified Kernel Image (UKI).

This consolidates UKI detection logic previously in bootc_composefs::boot
into a new kernel module that can find kernels via either the traditional
/usr/lib/modules/<version>/vmlinuz path or UKI files in /boot/EFI/Linux/.

The ContainerInspect output now includes a "kernel" field with version
and unified (boolean) properties, enabling tooling to determine the
boot method before installation.

Assisted-by: OpenCode (Claude Opus 4.5)
Signed-off-by: Colin Walters <walters@verbum.org>
2025-12-29 12:40:36 +01:00
Chaser Huang
bd9026997b composefs/state: Copy /var from image to fresh installations
Signed-off-by: Chaser Huang <huangkangjing@gmail.com>
2025-12-29 15:29:00 +05:30
Pragyan Poudyal
0aae35a434 composefs/state: Fix imgref format in origin file
On `UpdateAction::UpdateOrigin` the origin for the container image used
was not properly formatted. Fixed it

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2025-12-22 16:06:52 +05:30
Pragyan Poudyal
d12d763de7 composefs/soft-reboot: Handle soft reboot for UKIs
Similar to soft reboots for Type1 entries, we compute the SHA256Sum of
.linux + .initrd sections in the UKI, and compare them to check for
kernel skew

Next, compare the .cmdline section skipping the `composefs=` parameter
as that will always be different

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2025-12-22 16:06:52 +05:30
Pragyan Poudyal
13113d8c8f composefs/uki: Save boot digest
Similar to what we do with Type1 entries, we save the SHA256Sum of
.linux + .initrd sections of the UKI under `boot_digest` key in the
origin file

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2025-12-22 16:06:52 +05:30
Pragyan Poudyal
969dfd438e composefs: Soft Reboot after update/switch if specified
Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2025-12-22 16:06:52 +05:30
Pragyan Poudyal
33e3b745ad composefs: Handle bootc status after a soft reboot
After a soft reboot the kernel cmdline doesn't change so we can't rely
on the `composefs=` parameter in the cmdline. Instead, we check the
source of the root mount point

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2025-12-22 16:06:52 +05:30
Pragyan Poudyal
f9931d13e8 composefs: Implement soft reboot
Add an internal command for soft rebooting the system. Similar to how
it's done for ostree, we only allow soft reboot if the other deployment
has the same kernel state, i.e. the SHASum of kernel + initrd is the
same as that of the current deployment.

soft reboot is not possible in case of UKI deployment

Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
2025-12-22 16:06:52 +05:30