Skip to content

Releases: rocketman-code/atomic-rollback

v0.4.0

14 Apr 06:53

Choose a tag to compare

Added

  • Automatic snapshots use rolling timestamp names in %Y-%m-%d_%H-%M-%S format instead of a fixed root.pre-update. Every RPM transaction creates a new snapshot; the history is no longer overwritten on each upgrade. Closes #9.
  • Snapshot retention: the tool keeps the most recent MAX_SNAPSHOTS automatic snapshots (default 50, configurable in /etc/atomic-rollback.conf) and evicts older ones. User-named snapshots are never counted against the limit and are never evicted; unbounded accumulation of user-named snapshots remains the expected behavior.
  • snapshot list shows a three-column table: btrfs subvolume ID, name, and creation time. Sorted by ID (chronological).
  • rollback [id|name] and snapshot delete <id|name> accept btrfs subvolume IDs (integers) in addition to names. rollback with no arguments defaults to the most recent snapshot (highest ID). The IDs are btrfs filesystem primitives, monotonic and never reused, surfaced as the user-facing handle without any atomic-rollback state.
  • snapshot create output includes the btrfs subvolume ID (e.g. Snapshot 'foo' with ID 123 created.) so the new snapshot can be referenced numerically in subsequent commands without running list first.
  • check and rollback show rollback scope: directories protected by separate btrfs subvolumes are listed as SAFE (unaffected by rollback), directories inside the root subvolume are listed as RISK (will revert on rollback). Derived from fstab subvol= entries and mountpoint checks on top-level directories.
  • --version and -V print the installed version. Output format: atomic-rollback v<version>, one line to stdout, matching the btrfs-progs v6.17 convention.

Changed

  • check output and user-facing documentation use "boot chain" terminology instead of "system bootable." The tool verifies boot chain structural validity (the formal model's scope), not system bootability in the broader sense. Kernel bugs, runtime failures, and other post-boot problems are outside what the tool can prove, and the language now matches.
  • The kernel-install hook is owned by migrate as a migration artifact instead of being installed by the RPM. The hook now persists across atomic-rollback uninstall, so removing the tool on a migrated system does not leave future kernel installs with unbootable BLS entries. Closes #17.

Removed

  • The libdnf5 actions plugin (/etc/dnf/libdnf5-plugins/actions.d/atomic-rollback.actions) is no longer shipped. The RPM C plugin added in 0.3.7 covers every RPM-based frontend (dnf, rpm, PackageKit); keeping both caused duplicate snapshots on dnf5 transactions. Closes #16.

Fixed

  • Systems upgrading from any 0.3.x release have their legacy root.pre-update snapshot renamed to its creation timestamp (in the same %Y-%m-%d_%H-%M-%S format as new automatic snapshots) on upgrade. The renamed snapshot joins the rolling history and becomes eligible for retention; before this release it did not match the auto-name format and was treated as a user-named snapshot, persisting indefinitely on upgraded systems. The btrfs subvolume ID is preserved across the rename, so rollback targets that referenced the numeric ID are unaffected.

v0.3.8

07 Apr 15:37

Choose a tag to compare

Fixed

  • check, setup, and migrate failed at the baseline gate with "Btrfs subvolume 'root' not found" on systems with a non-default root subvolume name (e.g., the openSUSE Timeshift @ layout). The root filesystem check hardcoded "root" instead of reading the subvol= mount option from /etc/fstab. Closes #15.

v0.3.7

05 Apr 05:32

Choose a tag to compare

Added

  • RPM plugin: snapshots are now created before every RPM transaction regardless of frontend (dnf, PackageKit/Discover, bare rpm). Previously only dnf5 transactions triggered snapshots via the libdnf5 actions plugin.

Fixed

  • snapshot no longer prints contradictory "already exists" and "created" messages on the same call. The function returns a typed result and the caller handles messaging.
  • snapshot is now a safe no-op on non-btrfs systems instead of failing and blocking package transactions.

v0.3.6

04 Apr 15:40

Choose a tag to compare

Fixed

  • check, setup, and migrate failed on aarch64 with "shimx64.efi is missing." The EFI boot file check hardcoded x86_64 filenames instead of deriving them from the UEFI architecture suffix.

v0.3.5

04 Apr 03:42

Choose a tag to compare

Typed device references

All device references are now typed. Bare UUIDs, fstab device specs (UUID=, LABEL=, PARTUUID=, PARTLABEL=, ID=, /dev/ paths), resolved device paths, and subvolume names each have distinct types. Passing a bare UUID where a device spec is expected (the bug fixed in 0.3.3) is now a compile error. No behavior changes.

v0.3.4

04 Apr 02:21

Choose a tag to compare

License change

This release relicenses atomic-rollback from MIT OR Apache-2.0 to GPL-3.0-only.

All future versions are licensed under the GNU General Public License v3.0 only (no "or later" clause). Previously published versions (0.3.3 and earlier) remain under their original license.

See LICENSE for the full text.

Other changes

  • Removed scripts/monitor-reddit.sh (one-time utility, not part of the distributed package).

v0.3.3

04 Apr 02:12

Choose a tag to compare

Fixed

  • check failed on vanilla Fedora 43 with "Can't lookup blockdev." The root UUID extracted from BLS boot entries was passed to mount without the UUID= prefix, so mount received a bare UUID string instead of a valid device spec. All stock Fedora installs using UUID= in fstab were affected. Closes #2.
  • Linux-specific syscalls (renameat2, syncfs) gated behind #[cfg(target_os = "linux")] so cargo test runs on macOS for pure-logic tests.

See CHANGELOG.md for details.

v0.3.2

01 Apr 07:41

Choose a tag to compare

Fixed

  • Subvolume names with spaces now parse correctly
  • Verification chain handles all fstab device formats (PARTUUID=, PARTLABEL=, ID=)
  • BLS initrd validation checks all initrd lines (multi-valued per BLS spec)
  • BLS root= parameter check accepts all kernel device formats
  • ESP grub.cfg migration renders from generator template, eliminating double-prefix bug class

Changed

  • Internal: all external tool output parsed through grammar-derived types at the boundary

See CHANGELOG.md for details.

v0.3.1

01 Apr 00:21

Choose a tag to compare

Fixed

  • Kernel-install hook uses full binary path (/usr/bin/atomic-rollback). The bare command was not in RPM's scriptlet PATH, causing exit 127 on kernel upgrades.
  • RPM spec rewritten for COPR vendored builds. The previous spec used %cargo_build which expects Fedora-packaged crates.
  • COPR Makefile builds from cloned source with correct outdir contract.

Changed

  • Installation via COPR is the only supported method. The crate was removed from crates.io (binary alone is insufficient without the hook and plugin).

Install

sudo dnf copr enable rocketman-code/atomic-rollback
sudo dnf install atomic-rollback

v0.3.0

30 Mar 19:26

Choose a tag to compare

Added

  • snapshot create [name] subcommand: explicit snapshot creation with optional name.
  • snapshot list subcommand: shows available snapshots, excluding system subvolumes.
  • snapshot delete <name> subcommand: refuses fstab-referenced system subvolumes. Mounted-subvolume and default-subvolume protection delegated to kernel and btrfs-progs.
  • --help and -h at top level and for snapshot subcommands.

Changed

  • snapshot <name> replaced by snapshot create <name>. Bare snapshot (no args) still creates with the default name. Unrecognized snapshot subcommands are now rejected instead of silently treated as snapshot names.

Fixed

  • Migration step 1 now handles all fstab device reference formats (UUID=, LABEL=, /dev/ paths). Previously only UUID= was supported.