From 35b5288b004bbd03e198c7f1715e59f7ad24bd46 Mon Sep 17 00:00:00 2001 From: Aether Date: Sat, 10 Oct 2026 18:31:57 +0100 Subject: [PATCH] feat: add Fedora support --- .../dracut/90ryoku-snapshot/module-setup.sh | 26 + .../ryoku-snapshot-preview.sh | 44 ++ .../ryoku-snapshot-restore.sh | 60 ++ fedora/bootmenu/grub/42_ryoku_snapshots | 13 + fedora/bootmenu/grub/ryoku-grub-menu | 96 +++ fedora/bootmenu/grub/theme/background.png | Bin 0 -> 73 bytes fedora/bootmenu/grub/theme/theme.txt | 50 ++ fedora/bootmenu/ryoku-snapshot-menu.path | 12 + fedora/bootmenu/ryoku-snapshot-menu.service | 17 + .../bootmenu/ryoku-snapshot-restored.service | 16 + fedora/bootmenu/snapper/50-ryoku-boot-menu | 17 + fedora/install.sh | 78 +++ fedora/packages/rpm/README.md | 72 ++ fedora/packages/rpm/build-rpm-repo.sh | 37 + fedora/packages/rpm/dependency-coprs | 6 + fedora/packages/rpm/enable-dependencies.sh | 13 + .../rpm/patches/0001-host-dnf-support.patch | 657 ++++++++++++++++++ fedora/packages/rpm/payload/fedora.tsv | 7 + fedora/packages/rpm/payload/ryogami.sh | 61 ++ fedora/packages/rpm/payload/ryoku-blobs.sh | 38 + .../rpm/payload/ryoku-desktop-hyprland.sh | 56 ++ .../rpm/payload/ryoku-desktop-niri.sh | 57 ++ fedora/packages/rpm/payload/ryoku-desktop.sh | 516 ++++++++++++++ fedora/packages/rpm/payload/ryoku-hub.sh | 30 + .../rpm/payload/ryoku-palette-bridge.sh | 23 + fedora/packages/rpm/payload/ryoku-rashin.sh | 44 ++ fedora/packages/rpm/payload/ryoku-shell.sh | 56 ++ fedora/packages/rpm/payload/ryoku.sh | 31 + fedora/packages/rpm/prepare-srpms.sh | 98 +++ fedora/packages/rpm/rebuild-srpms.sh | 26 + fedora/packages/rpm/ryogami.spec | 45 ++ fedora/packages/rpm/ryoku-blobs.spec | 37 + .../packages/rpm/ryoku-desktop-hyprland.spec | 34 + fedora/packages/rpm/ryoku-desktop-niri.spec | 34 + fedora/packages/rpm/ryoku-desktop.spec | 205 ++++++ fedora/packages/rpm/ryoku-extras.spec | 42 ++ fedora/packages/rpm/ryoku-hub.spec | 29 + fedora/packages/rpm/ryoku-palette-bridge.spec | 32 + fedora/packages/rpm/ryoku-rashin.spec | 32 + fedora/packages/rpm/ryoku-shell.spec | 38 + fedora/packages/rpm/ryoku.spec | 30 + fedora/packages/rpm/sddm-theme-ryoku.spec | 27 + fedora/packages/rpm/source-owners | 6 + fedora/packages/rpm/stage-package.sh | 39 ++ fedora/system/extras/ryoku-install-extra | 160 +++++ fedora/system/hardware/drivers/common.sh | 42 ++ .../network/ryoku-wifi-regdom.service | 12 + fedora/system/hardware/power/ryoku-inhibitors | 10 + fedora/tests/fedora-extras.py | 109 +++ 49 files changed, 3220 insertions(+) create mode 100644 fedora/bootmenu/dracut/90ryoku-snapshot/module-setup.sh create mode 100644 fedora/bootmenu/dracut/90ryoku-snapshot/ryoku-snapshot-preview.sh create mode 100644 fedora/bootmenu/dracut/90ryoku-snapshot/ryoku-snapshot-restore.sh create mode 100755 fedora/bootmenu/grub/42_ryoku_snapshots create mode 100755 fedora/bootmenu/grub/ryoku-grub-menu create mode 100644 fedora/bootmenu/grub/theme/background.png create mode 100644 fedora/bootmenu/grub/theme/theme.txt create mode 100644 fedora/bootmenu/ryoku-snapshot-menu.path create mode 100644 fedora/bootmenu/ryoku-snapshot-menu.service create mode 100644 fedora/bootmenu/ryoku-snapshot-restored.service create mode 100755 fedora/bootmenu/snapper/50-ryoku-boot-menu create mode 100755 fedora/install.sh create mode 100644 fedora/packages/rpm/README.md create mode 100755 fedora/packages/rpm/build-rpm-repo.sh create mode 100644 fedora/packages/rpm/dependency-coprs create mode 100755 fedora/packages/rpm/enable-dependencies.sh create mode 100644 fedora/packages/rpm/patches/0001-host-dnf-support.patch create mode 100644 fedora/packages/rpm/payload/fedora.tsv create mode 100644 fedora/packages/rpm/payload/ryogami.sh create mode 100644 fedora/packages/rpm/payload/ryoku-blobs.sh create mode 100644 fedora/packages/rpm/payload/ryoku-desktop-hyprland.sh create mode 100644 fedora/packages/rpm/payload/ryoku-desktop-niri.sh create mode 100644 fedora/packages/rpm/payload/ryoku-desktop.sh create mode 100644 fedora/packages/rpm/payload/ryoku-hub.sh create mode 100644 fedora/packages/rpm/payload/ryoku-palette-bridge.sh create mode 100644 fedora/packages/rpm/payload/ryoku-rashin.sh create mode 100644 fedora/packages/rpm/payload/ryoku-shell.sh create mode 100644 fedora/packages/rpm/payload/ryoku.sh create mode 100755 fedora/packages/rpm/prepare-srpms.sh create mode 100755 fedora/packages/rpm/rebuild-srpms.sh create mode 100644 fedora/packages/rpm/ryogami.spec create mode 100644 fedora/packages/rpm/ryoku-blobs.spec create mode 100644 fedora/packages/rpm/ryoku-desktop-hyprland.spec create mode 100644 fedora/packages/rpm/ryoku-desktop-niri.spec create mode 100644 fedora/packages/rpm/ryoku-desktop.spec create mode 100644 fedora/packages/rpm/ryoku-extras.spec create mode 100644 fedora/packages/rpm/ryoku-hub.spec create mode 100644 fedora/packages/rpm/ryoku-palette-bridge.spec create mode 100644 fedora/packages/rpm/ryoku-rashin.spec create mode 100644 fedora/packages/rpm/ryoku-shell.spec create mode 100644 fedora/packages/rpm/ryoku.spec create mode 100644 fedora/packages/rpm/sddm-theme-ryoku.spec create mode 100644 fedora/packages/rpm/source-owners create mode 100755 fedora/packages/rpm/stage-package.sh create mode 100755 fedora/system/extras/ryoku-install-extra create mode 100644 fedora/system/hardware/drivers/common.sh create mode 100644 fedora/system/hardware/network/ryoku-wifi-regdom.service create mode 100755 fedora/system/hardware/power/ryoku-inhibitors create mode 100644 fedora/tests/fedora-extras.py diff --git a/fedora/bootmenu/dracut/90ryoku-snapshot/module-setup.sh b/fedora/bootmenu/dracut/90ryoku-snapshot/module-setup.sh new file mode 100644 index 0000000000..0191a0e2c3 --- /dev/null +++ b/fedora/bootmenu/dracut/90ryoku-snapshot/module-setup.sh @@ -0,0 +1,26 @@ +#!/usr/bin/bash +# +# dracut module: boots a snapper snapshot from the "Ryoku snapshots" GRUB +# menu, read-only or restored. It runs after dracut has unlocked LUKS, so an +# encrypted disk restores the same way as a plain one. Only the images +# `ryoku boot-menu sync` builds for the snapshot entries carry it (dracut +# --add ryoku-snapshot); Fedora's own initramfs images stay as they are. + +check() { + return 255 +} + +depends() { + echo btrfs +} + +installkernel() { + hostonly='' instmods overlay +} + +# shellcheck disable=SC2154 # dracut sets moddir +install() { + inst_multiple mkdir mount umount mv date ln + inst_hook pre-mount 90 "$moddir/ryoku-snapshot-restore.sh" + inst_hook pre-pivot 10 "$moddir/ryoku-snapshot-preview.sh" +} diff --git a/fedora/bootmenu/dracut/90ryoku-snapshot/ryoku-snapshot-preview.sh b/fedora/bootmenu/dracut/90ryoku-snapshot/ryoku-snapshot-preview.sh new file mode 100644 index 0000000000..0a9d0b10ab --- /dev/null +++ b/fedora/bootmenu/dracut/90ryoku-snapshot/ryoku-snapshot-preview.sh @@ -0,0 +1,44 @@ +#!/usr/bin/bash +# +# pre-pivot hook. rd.ryoku.preview= boots that +# read-only snapshot for a look: the snapshot is the lower layer of an overlay +# whose writes go to RAM, so the system runs normally and nothing on disk +# changes. sysroot.mount has already mounted the snapshot read-only (the +# entry's rootflags name it); the overlay is stacked on top of /sysroot, and +# its lower layer is a second mount under /run, which switch-root carries +# into the booted system. fstab's options for / name a btrfs subvolume, which +# the overlay refuses on remount, so systemd-remount-fs is masked for this +# boot only (/run). +# +# dracut sources hooks, so this returns and never exits. + +# shellcheck source=/dev/null +type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh + +ryoku_snapshot_preview() { + local snap dev run="${RYOKU_RUN:-/run}" newroot="${NEWROOT:-/sysroot}" + local base="$run/ryoku/preview" + snap=$(getarg rd.ryoku.preview=) || return 0 + case "$snap" in + "" | /* | *..* | *[!A-Za-z0-9._/-]*) warn "ryoku: refusing snapshot path '$snap'"; return 0 ;; + esac + dev=$(label_uuid_to_dev "$(getarg root=)") + mkdir -p "$base/lower" "$base/rw" + if ! mount -t btrfs -o "ro,subvol=$snap" "$dev" "$base/lower"; then + warn "ryoku: cannot mount $snap; booting it read-only as it is" + return 0 + fi + mount -t tmpfs -o mode=0755 ryoku-preview "$base/rw" + mkdir -p "$base/rw/upper" "$base/rw/work" + if ! mount -t overlay ryoku-preview \ + -o "lowerdir=$base/lower,upperdir=$base/rw/upper,workdir=$base/rw/work" "$newroot"; then + warn "ryoku: overlay failed; booting $snap read-only as it is" + umount "$base/rw" "$base/lower" + return 0 + fi + mkdir -p "$run/systemd/system" + ln -sf /dev/null "$run/systemd/system/systemd-remount-fs.service" + info "ryoku: previewing $snap; changes stay in RAM" +} + +ryoku_snapshot_preview diff --git a/fedora/bootmenu/dracut/90ryoku-snapshot/ryoku-snapshot-restore.sh b/fedora/bootmenu/dracut/90ryoku-snapshot/ryoku-snapshot-restore.sh new file mode 100644 index 0000000000..202fe2bcc6 --- /dev/null +++ b/fedora/bootmenu/dracut/90ryoku-snapshot/ryoku-snapshot-restore.sh @@ -0,0 +1,60 @@ +#!/usr/bin/bash +# +# pre-mount hook. rd.ryoku.restore= makes that +# snapshot the root subvolume again before it is mounted: the current root is +# renamed to .broken-