From 42a6ff3286804854c1c21a7e62158f09e19a9b09 Mon Sep 17 00:00:00 2001 From: tranch Date: Sun, 12 Jul 2026 23:33:44 +0800 Subject: Add live installer build workflow Add a Bazzite-style installer payload, CI workflow, and local\nPodman commands for building and testing the live ISO.\n\nFix stale disk image configuration references and installer targets. --- installer/Containerfile | 15 ++++++ installer/build.sh | 60 ++++++++++++++++++++++ installer/iso.yaml | 10 ++++ .../remove_root_password_prompt.tmpl | 1 + installer/lorax_templates/set_default_user.tmpl | 1 + 5 files changed, 87 insertions(+) create mode 100644 installer/Containerfile create mode 100755 installer/build.sh create mode 100644 installer/iso.yaml create mode 100644 installer/lorax_templates/remove_root_password_prompt.tmpl create mode 100644 installer/lorax_templates/set_default_user.tmpl (limited to 'installer') diff --git a/installer/Containerfile b/installer/Containerfile new file mode 100644 index 0000000..fa817b6 --- /dev/null +++ b/installer/Containerfile @@ -0,0 +1,15 @@ +# Build the live installer payload from a desktop Bazzite runtime. +# The image installed to disk is supplied separately as INSTALL_IMAGE_PAYLOAD. + +ARG BASE_IMAGE=ghcr.io/ublue-os/bazzite:stable +ARG INSTALL_IMAGE_PAYLOAD=ghcr.io/AeroCore-IO/aerocore-bazzite-image:stable + +FROM ${BASE_IMAGE} + +ARG BASE_IMAGE +ARG INSTALL_IMAGE_PAYLOAD + +RUN --mount=type=bind,source=.,target=/src \ + env BASE_IMAGE="${BASE_IMAGE}" \ + INSTALL_IMAGE_PAYLOAD="${INSTALL_IMAGE_PAYLOAD}" \ + /src/installer/build.sh diff --git a/installer/build.sh b/installer/build.sh new file mode 100755 index 0000000..7532df8 --- /dev/null +++ b/installer/build.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +set -euxo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BASE_IMAGE=${BASE_IMAGE:?} +INSTALL_IMAGE_PAYLOAD=${INSTALL_IMAGE_PAYLOAD:?} + +# The installer is a live KDE environment. Keep the installed system payload +# separate: it is the AeroCore image, while BASE_IMAGE provides the live UI. +dnf install -y \ + anaconda-live \ + libblockdev-btrfs \ + libblockdev-dm \ + libblockdev-lvm \ + dracut-live \ + livesys-scripts \ + grub2-efi-x64-cdboot + +# Apply the same AeroCore overlay to the live session where possible. +if [[ -d /src/system_files ]]; then + cp -a /src/system_files/. / +fi + +# Make the install payload available to Anaconda. When the build is running +# with the host container store mounted, this avoids a second registry pull. +if mountpoint -q /usr/lib/containers/storage; then + podman save --format oci-archive "${INSTALL_IMAGE_PAYLOAD}" | \ + podman load --storage-opt additionalimagestore='' +else + podman pull "${INSTALL_IMAGE_PAYLOAD}" +fi + +# Tell Anaconda to install the bootc container that was loaded above. +mkdir -p /var/lib/rpm-state +cat >> /usr/share/anaconda/interactive-defaults.ks </dev/null; then + cp -a /usr/lib/efi/*/*/EFI /boot/efi/ +fi + +systemd-firstboot --timezone UTC +dnf clean all diff --git a/installer/iso.yaml b/installer/iso.yaml new file mode 100644 index 0000000..8e6bd73 --- /dev/null +++ b/installer/iso.yaml @@ -0,0 +1,10 @@ +label: "AeroCore-Live" +grub2: + timeout: 3 + entries: + - name: "Launch AeroCore Installer" + linux: "/images/pxeboot/vmlinuz quiet rhgb root=live:CDLABEL=AeroCore-Live enforcing=0 rd.live.image" + initrd: "/images/pxeboot/initrd.img" + - name: "Launch AeroCore Installer (Basic Graphics Mode)" + linux: "/images/pxeboot/vmlinuz quiet rhgb root=live:CDLABEL=AeroCore-Live enforcing=0 rd.live.image nomodeset" + initrd: "/images/pxeboot/initrd.img" diff --git a/installer/lorax_templates/remove_root_password_prompt.tmpl b/installer/lorax_templates/remove_root_password_prompt.tmpl new file mode 100644 index 0000000..3bd0342 --- /dev/null +++ b/installer/lorax_templates/remove_root_password_prompt.tmpl @@ -0,0 +1 @@ +append etc/anaconda/profile.d/fedora-kinoite.conf "\\n[User Interface]\\nhidden_spokes =\\n PasswordSpoke" diff --git a/installer/lorax_templates/set_default_user.tmpl b/installer/lorax_templates/set_default_user.tmpl new file mode 100644 index 0000000..b4cf2c8 --- /dev/null +++ b/installer/lorax_templates/set_default_user.tmpl @@ -0,0 +1 @@ +append usr/share/anaconda/interactive-defaults.ks "\\nuser --name=aerocore --password=aerocore --plaintext --groups=wheel" -- cgit v1.2.3 From 04b8dcbbc3d5707f488c9b67ba96ce88ccd15181 Mon Sep 17 00:00:00 2001 From: tranch Date: Fri, 17 Jul 2026 06:56:56 +0800 Subject: Fix live installer ISO build Build the live installer from the requested local AeroCore image, use a separate Fedora live base, pass the payload through rootful container storage, and write reproducible checksum entries without host paths. --- installer/Containerfile | 4 ++++ installer/build.sh | 13 +++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) (limited to 'installer') diff --git a/installer/Containerfile b/installer/Containerfile index fa817b6..50579e6 100644 --- a/installer/Containerfile +++ b/installer/Containerfile @@ -3,13 +3,17 @@ ARG BASE_IMAGE=ghcr.io/ublue-os/bazzite:stable ARG INSTALL_IMAGE_PAYLOAD=ghcr.io/AeroCore-IO/aerocore-bazzite-image:stable +ARG INSTALL_IMAGE_PAYLOAD_ARCHIVE=/install-payload.oci FROM ${BASE_IMAGE} ARG BASE_IMAGE ARG INSTALL_IMAGE_PAYLOAD +ARG INSTALL_IMAGE_PAYLOAD_ARCHIVE RUN --mount=type=bind,source=.,target=/src \ + --mount=type=bind,source=output/install-payload.oci,target=/install-payload.oci,ro \ env BASE_IMAGE="${BASE_IMAGE}" \ INSTALL_IMAGE_PAYLOAD="${INSTALL_IMAGE_PAYLOAD}" \ + INSTALL_IMAGE_PAYLOAD_ARCHIVE="${INSTALL_IMAGE_PAYLOAD_ARCHIVE}" \ /src/installer/build.sh diff --git a/installer/build.sh b/installer/build.sh index 7532df8..033fe9b 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -5,10 +5,14 @@ set -euxo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BASE_IMAGE=${BASE_IMAGE:?} INSTALL_IMAGE_PAYLOAD=${INSTALL_IMAGE_PAYLOAD:?} +INSTALL_IMAGE_PAYLOAD_ARCHIVE=${INSTALL_IMAGE_PAYLOAD_ARCHIVE:-} # The installer is a live KDE environment. Keep the installed system payload # separate: it is the AeroCore image, while BASE_IMAGE provides the live UI. -dnf install -y \ +# Bazzite excludes some base packages from normal transactions. The live +# installer needs Anaconda's exact NetworkManager dependencies, so clear the +# excludes only for this dependency install. +dnf --setopt=excludepkgs= install -y \ anaconda-live \ libblockdev-btrfs \ libblockdev-dm \ @@ -22,9 +26,10 @@ if [[ -d /src/system_files ]]; then cp -a /src/system_files/. / fi -# Make the install payload available to Anaconda. When the build is running -# with the host container store mounted, this avoids a second registry pull. -if mountpoint -q /usr/lib/containers/storage; then +# Make the install payload available to Anaconda. +if [[ -n "${INSTALL_IMAGE_PAYLOAD_ARCHIVE}" && -f "${INSTALL_IMAGE_PAYLOAD_ARCHIVE}" ]]; then + podman load --storage-opt additionalimagestore='' < "${INSTALL_IMAGE_PAYLOAD_ARCHIVE}" +elif mountpoint -q /usr/lib/containers/storage; then podman save --format oci-archive "${INSTALL_IMAGE_PAYLOAD}" | \ podman load --storage-opt additionalimagestore='' else -- cgit v1.2.3 From 33ccd0f64b93bb615a771b6f246bcdb4cb3969f1 Mon Sep 17 00:00:00 2001 From: tranch Date: Fri, 24 Jul 2026 08:18:08 +0800 Subject: Fix live installer EFI fallback Copy Fedora grubx64.efi to the fallback EFI path expected by bootc-image-builder. --- installer/build.sh | 3 +++ 1 file changed, 3 insertions(+) (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index 033fe9b..921e628 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -61,5 +61,8 @@ if compgen -G '/usr/lib/efi/*/*/EFI' >/dev/null; then cp -a /usr/lib/efi/*/*/EFI /boot/efi/ fi +# bootc-image-builder needs the Fedora live ISO fallback EFI loader. +cp -v /boot/efi/EFI/fedora/grubx64.efi /boot/efi/EFI/BOOT/fbx64.efi + systemd-firstboot --timezone UTC dnf clean all -- cgit v1.2.3 From 986e450e1ab476e35012370d97b7e4526e113d88 Mon Sep 17 00:00:00 2001 From: tranch Date: Fri, 24 Jul 2026 09:17:07 +0800 Subject: Fix live installer GRUB EFI fallback Install the full EFI GRUB package and create the fallback directory. --- installer/build.sh | 2 ++ 1 file changed, 2 insertions(+) (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index 921e628..6f1561f 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -19,6 +19,7 @@ dnf --setopt=excludepkgs= install -y \ libblockdev-lvm \ dracut-live \ livesys-scripts \ + grub2-efi-x64 \ grub2-efi-x64-cdboot # Apply the same AeroCore overlay to the live session where possible. @@ -62,6 +63,7 @@ if compgen -G '/usr/lib/efi/*/*/EFI' >/dev/null; then fi # bootc-image-builder needs the Fedora live ISO fallback EFI loader. +mkdir -p /boot/efi/EFI/BOOT cp -v /boot/efi/EFI/fedora/grubx64.efi /boot/efi/EFI/BOOT/fbx64.efi systemd-firstboot --timezone UTC -- cgit v1.2.3 From 2de184fb8db64a900ed2e64e292fd7b77f3deae4 Mon Sep 17 00:00:00 2001 From: tranch Date: Fri, 24 Jul 2026 09:39:33 +0800 Subject: Find live installer EFI files robustly Avoid assuming the Fedora EFI directory layout when creating fbx64.efi. --- installer/build.sh | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index 6f1561f..2f8a26b 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -58,13 +58,21 @@ sed -i 's/^livesys_session=.*/livesys_session=kde/' /etc/sysconfig/livesys systemctl enable livesys.service livesys-late.service mkdir -p /boot/efi -if compgen -G '/usr/lib/efi/*/*/EFI' >/dev/null; then - cp -a /usr/lib/efi/*/*/EFI /boot/efi/ +efi_dir="$(find /usr/lib/efi -type d -name EFI -print -quit 2>/dev/null || true)" +if [[ -n "${efi_dir}" ]]; then + cp -a "${efi_dir}" /boot/efi/ fi # bootc-image-builder needs the Fedora live ISO fallback EFI loader. +grubx64="$(find /usr/lib/efi /boot/efi -type f \ + -path '*/EFI/fedora/grubx64.efi' -print -quit 2>/dev/null || true)" +if [[ -z "${grubx64}" ]]; then + echo "grubx64.efi was not found in the installed EFI tree" >&2 + find /usr/lib/efi /boot/efi -type f -path '*/EFI/*' -print >&2 || true + exit 1 +fi mkdir -p /boot/efi/EFI/BOOT -cp -v /boot/efi/EFI/fedora/grubx64.efi /boot/efi/EFI/BOOT/fbx64.efi +cp -v "${grubx64}" /boot/efi/EFI/BOOT/fbx64.efi systemd-firstboot --timezone UTC dnf clean all -- cgit v1.2.3 From e41af95f56d4cbfee68081f82dd329ee68486267 Mon Sep 17 00:00:00 2001 From: tranch Date: Fri, 24 Jul 2026 09:44:48 +0800 Subject: Restore EFI GRUB files in Kinoite build Reinstall EFI packages so missing payload files are materialized. --- installer/build.sh | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index 2f8a26b..efce782 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -22,6 +22,12 @@ dnf --setopt=excludepkgs= install -y \ grub2-efi-x64 \ grub2-efi-x64-cdboot +# Kinoite can carry the EFI packages in the RPM database without their files +# materialized in the container filesystem. Restore the files for the ISO. +dnf --setopt=excludepkgs= reinstall -y \ + grub2-efi-x64 \ + grub2-efi-x64-cdboot + # Apply the same AeroCore overlay to the live session where possible. if [[ -d /src/system_files ]]; then cp -a /src/system_files/. / -- cgit v1.2.3 From 1d0659a9f5ac7e18639a88b772f0766afa3910db Mon Sep 17 00:00:00 2001 From: tranch Date: Fri, 24 Jul 2026 13:34:08 +0800 Subject: Add standard UEFI fallback loader Include BOOTX64.EFI alongside the bootc-image-builder fbx64.efi so removable-media UEFI firmware can boot the live installer ISO. --- installer/build.sh | 2 ++ 1 file changed, 2 insertions(+) (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index efce782..3ee1744 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -78,6 +78,8 @@ if [[ -z "${grubx64}" ]]; then exit 1 fi mkdir -p /boot/efi/EFI/BOOT +# UEFI removable-media fallback; keep fbx64.efi for bootc-image-builder. +cp -v "${grubx64}" /boot/efi/EFI/BOOT/BOOTX64.EFI cp -v "${grubx64}" /boot/efi/EFI/BOOT/fbx64.efi systemd-firstboot --timezone UTC -- cgit v1.2.3 From d3698fbc897c39cdc723cb85b5e03daf3e1bbc31 Mon Sep 17 00:00:00 2001 From: tranch Date: Fri, 24 Jul 2026 16:58:29 +0800 Subject: Brand live installer sidebar Copy installer branding assets into Anaconda's pixmaps directory after the shared live-session overlay so AeroCore resources take precedence. Ignore local .DS_Store files to keep macOS metadata out of commits. --- installer/branding/sidebar-bg.png | Bin 0 -> 163156 bytes installer/branding/sidebar-logo.png | Bin 0 -> 4425 bytes installer/build.sh | 6 ++++++ 3 files changed, 6 insertions(+) create mode 100644 installer/branding/sidebar-bg.png create mode 100644 installer/branding/sidebar-logo.png (limited to 'installer') diff --git a/installer/branding/sidebar-bg.png b/installer/branding/sidebar-bg.png new file mode 100644 index 0000000..f957fec Binary files /dev/null and b/installer/branding/sidebar-bg.png differ diff --git a/installer/branding/sidebar-logo.png b/installer/branding/sidebar-logo.png new file mode 100644 index 0000000..0f47606 Binary files /dev/null and b/installer/branding/sidebar-logo.png differ diff --git a/installer/build.sh b/installer/build.sh index 3ee1744..f9eb210 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -33,6 +33,12 @@ if [[ -d /src/system_files ]]; then cp -a /src/system_files/. / fi +BRANDING_DIR="${SCRIPT_DIR}/branding" +if [[ -d "${BRANDING_DIR}" ]]; then + mkdir -p /usr/share/anaconda/pixmaps + cp -a "${BRANDING_DIR}/." /usr/share/anaconda/pixmaps/ +fi + # Make the install payload available to Anaconda. if [[ -n "${INSTALL_IMAGE_PAYLOAD_ARCHIVE}" && -f "${INSTALL_IMAGE_PAYLOAD_ARCHIVE}" ]]; then podman load --storage-opt additionalimagestore='' < "${INSTALL_IMAGE_PAYLOAD_ARCHIVE}" -- cgit v1.2.3 From 4dd41315acaa07112864a3833dfb7775d9b44274 Mon Sep 17 00:00:00 2001 From: tranch Date: Fri, 24 Jul 2026 17:29:04 +0800 Subject: Rename live installer to installer ISO Use installer ISO terminology across Just, workflows, scripts, docs, and image payloads while preserving compatibility aliases for existing commands. --- installer/Containerfile | 2 +- installer/iso.yaml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'installer') diff --git a/installer/Containerfile b/installer/Containerfile index 50579e6..34c5e28 100644 --- a/installer/Containerfile +++ b/installer/Containerfile @@ -1,4 +1,4 @@ -# Build the live installer payload from a desktop Bazzite runtime. +# Build the installer ISO payload from a desktop Bazzite runtime. # The image installed to disk is supplied separately as INSTALL_IMAGE_PAYLOAD. ARG BASE_IMAGE=ghcr.io/ublue-os/bazzite:stable diff --git a/installer/iso.yaml b/installer/iso.yaml index 8e6bd73..4b9fd2c 100644 --- a/installer/iso.yaml +++ b/installer/iso.yaml @@ -1,10 +1,10 @@ -label: "AeroCore-Live" +label: "AeroCore-Installer" grub2: timeout: 3 entries: - name: "Launch AeroCore Installer" - linux: "/images/pxeboot/vmlinuz quiet rhgb root=live:CDLABEL=AeroCore-Live enforcing=0 rd.live.image" + linux: "/images/pxeboot/vmlinuz quiet rhgb root=live:CDLABEL=AeroCore-Installer enforcing=0 rd.live.image" initrd: "/images/pxeboot/initrd.img" - name: "Launch AeroCore Installer (Basic Graphics Mode)" - linux: "/images/pxeboot/vmlinuz quiet rhgb root=live:CDLABEL=AeroCore-Live enforcing=0 rd.live.image nomodeset" + linux: "/images/pxeboot/vmlinuz quiet rhgb root=live:CDLABEL=AeroCore-Installer enforcing=0 rd.live.image nomodeset" initrd: "/images/pxeboot/initrd.img" -- cgit v1.2.3 From 73b0f172a531359872739aa708e8794aae2dcd5a Mon Sep 17 00:00:00 2001 From: tranch Date: Fri, 24 Jul 2026 18:58:16 +0800 Subject: Lock installer default account password --- installer/lorax_templates/set_default_user.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'installer') diff --git a/installer/lorax_templates/set_default_user.tmpl b/installer/lorax_templates/set_default_user.tmpl index b4cf2c8..c20736f 100644 --- a/installer/lorax_templates/set_default_user.tmpl +++ b/installer/lorax_templates/set_default_user.tmpl @@ -1 +1 @@ -append usr/share/anaconda/interactive-defaults.ks "\\nuser --name=aerocore --password=aerocore --plaintext --groups=wheel" +append usr/share/anaconda/interactive-defaults.ks "\\nuser --name=aerocore --lock --groups=wheel" -- cgit v1.2.3 From c008e52494fd3e350d4231bb7c229d576a17d800 Mon Sep 17 00:00:00 2001 From: tranch Date: Sat, 25 Jul 2026 04:41:50 +0800 Subject: Use target var tmp during installer deploy Bind the live installer's /var/tmp to the mounted target system in the pre-install phase so ostreecontainer can stage image layers on target disk space instead of the tiny LiveOS rootfs. --- installer/lorax_templates/use_target_var_tmp.tmpl | 1 + 1 file changed, 1 insertion(+) create mode 100644 installer/lorax_templates/use_target_var_tmp.tmpl (limited to 'installer') diff --git a/installer/lorax_templates/use_target_var_tmp.tmpl b/installer/lorax_templates/use_target_var_tmp.tmpl new file mode 100644 index 0000000..2d099d1 --- /dev/null +++ b/installer/lorax_templates/use_target_var_tmp.tmpl @@ -0,0 +1 @@ +append usr/share/anaconda/interactive-defaults.ks "\n%pre-install --log=/tmp/aerocore-var-tmp.log\nset -eux\ntarget_tmp=\nfor root in /mnt/sysimage /mnt/sysroot /var/mnt/sysimage; do\n if mountpoint -q ${root}; then\n target_tmp=${root}/var/tmp\n break\n fi\ndone\nif [ x${target_tmp} = x ]; then\n echo No mounted target system found for /var/tmp bind mount >&2\n exit 1\nfi\nmkdir -p ${target_tmp}\nchmod 1777 ${target_tmp}\nmount --bind ${target_tmp} /var/tmp\ndf -h /var/tmp ${target_tmp}\n%end" -- cgit v1.2.3 From 4bf6f276a7c616ebb7797952c5f33e5f282fb2c8 Mon Sep 17 00:00:00 2001 From: tranch Date: Sat, 25 Jul 2026 04:55:42 +0800 Subject: Brand installer live session icons Install AeroCore icon aliases for the live KDE launcher and replace Anaconda's installer icon in the hicolor theme. --- installer/build.sh | 39 ++++++++++++++++++++++ .../apps/org.fedoraproject.AnacondaInstaller.svg | 33 ++++++++++++++++++ .../apps/org.fedoraproject.AnacondaInstaller.svg | 33 ++++++++++++++++++ ...rg.fedoraproject.AnacondaInstaller-symbolic.svg | 13 ++++++++ 4 files changed, 118 insertions(+) create mode 100644 installer/system_files/overrides/usr/share/icons/hicolor/48x48/apps/org.fedoraproject.AnacondaInstaller.svg create mode 100644 installer/system_files/overrides/usr/share/icons/hicolor/scalable/apps/org.fedoraproject.AnacondaInstaller.svg create mode 100644 installer/system_files/overrides/usr/share/icons/hicolor/symbolic/apps/org.fedoraproject.AnacondaInstaller-symbolic.svg (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index f9eb210..c8ac830 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -39,6 +39,45 @@ if [[ -d "${BRANDING_DIR}" ]]; then cp -a "${BRANDING_DIR}/." /usr/share/anaconda/pixmaps/ fi +# Installer-only overrides, kept separate from the installed AeroCore payload. +if [[ -d "${SCRIPT_DIR}/system_files/overrides" ]]; then + cp -a "${SCRIPT_DIR}/system_files/overrides/." / +fi + +# Plasma's live-session launcher defaults to start-here, and Fedora keeps +# LOGO=fedora-logo-icon in the base live environment. +for size in 16x16 22x22 24x24 32x32 36x36 48x48 64x64 96x96 128x128 256x256; do + icon_dir="/usr/share/icons/hicolor/${size}" + if [[ -f "${icon_dir}/bazzite-logo-icon.png" ]]; then + mkdir -p "${icon_dir}/apps" "${icon_dir}/places" + cp -f "${icon_dir}/bazzite-logo-icon.png" "${icon_dir}/apps/fedora-logo-icon.png" + cp -f "${icon_dir}/bazzite-logo-icon.png" "${icon_dir}/places/start-here.png" + fi +done + +if [[ -f /usr/share/icons/hicolor/scalable/places/distributor-logo.svg ]]; then + mkdir -p /usr/share/icons/hicolor/scalable/apps /usr/share/icons/hicolor/scalable/places + cp -f /usr/share/icons/hicolor/scalable/places/distributor-logo.svg \ + /usr/share/icons/hicolor/scalable/apps/start-here.svg + cp -f /usr/share/icons/hicolor/scalable/places/distributor-logo.svg \ + /usr/share/icons/hicolor/scalable/places/start-here.svg +fi + +sed -i 's/^LOGO=.*/LOGO=distributor-logo/' /usr/lib/os-release + +for desktop_file in \ + /usr/share/applications/liveinst.desktop \ + /usr/share/applications/org.fedoraproject.AnacondaInstaller.desktop \ + /usr/share/applications/anaconda.desktop; do + if [[ -f "${desktop_file}" ]]; then + sed -i 's/^Icon=.*/Icon=org.fedoraproject.AnacondaInstaller/' "${desktop_file}" + fi +done + +if command -v gtk-update-icon-cache >/dev/null 2>&1; then + gtk-update-icon-cache -f /usr/share/icons/hicolor || true +fi + # Make the install payload available to Anaconda. if [[ -n "${INSTALL_IMAGE_PAYLOAD_ARCHIVE}" && -f "${INSTALL_IMAGE_PAYLOAD_ARCHIVE}" ]]; then podman load --storage-opt additionalimagestore='' < "${INSTALL_IMAGE_PAYLOAD_ARCHIVE}" diff --git a/installer/system_files/overrides/usr/share/icons/hicolor/48x48/apps/org.fedoraproject.AnacondaInstaller.svg b/installer/system_files/overrides/usr/share/icons/hicolor/48x48/apps/org.fedoraproject.AnacondaInstaller.svg new file mode 100644 index 0000000..04454b7 --- /dev/null +++ b/installer/system_files/overrides/usr/share/icons/hicolor/48x48/apps/org.fedoraproject.AnacondaInstaller.svg @@ -0,0 +1,33 @@ + + + aerocore-installer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/installer/system_files/overrides/usr/share/icons/hicolor/scalable/apps/org.fedoraproject.AnacondaInstaller.svg b/installer/system_files/overrides/usr/share/icons/hicolor/scalable/apps/org.fedoraproject.AnacondaInstaller.svg new file mode 100644 index 0000000..04454b7 --- /dev/null +++ b/installer/system_files/overrides/usr/share/icons/hicolor/scalable/apps/org.fedoraproject.AnacondaInstaller.svg @@ -0,0 +1,33 @@ + + + aerocore-installer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/installer/system_files/overrides/usr/share/icons/hicolor/symbolic/apps/org.fedoraproject.AnacondaInstaller-symbolic.svg b/installer/system_files/overrides/usr/share/icons/hicolor/symbolic/apps/org.fedoraproject.AnacondaInstaller-symbolic.svg new file mode 100644 index 0000000..f8dedad --- /dev/null +++ b/installer/system_files/overrides/usr/share/icons/hicolor/symbolic/apps/org.fedoraproject.AnacondaInstaller-symbolic.svg @@ -0,0 +1,13 @@ + + + aerocore-installer-symbolic + + + + + + + + + + -- cgit v1.2.3 From 981dde9ceed99c6b0a9dde1bce74e6100f0593d2 Mon Sep 17 00:00:00 2001 From: tranch Date: Sat, 25 Jul 2026 07:14:05 +0800 Subject: Apply var tmp fix in installer payload Write the pre-install /var/tmp bind mount hook from installer/build.sh so both Titanoboa CI builds and local ISO builds carry the fix. The previous lorax template path was only wired through the local helper and did not affect GitHub Actions. --- installer/build.sh | 19 +++++++++++++++++++ installer/lorax_templates/use_target_var_tmp.tmpl | 1 - 2 files changed, 19 insertions(+), 1 deletion(-) delete mode 100644 installer/lorax_templates/use_target_var_tmp.tmpl (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index c8ac830..aa30f42 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -91,6 +91,25 @@ fi # Tell Anaconda to install the bootc container that was loaded above. mkdir -p /var/lib/rpm-state cat >> /usr/share/anaconda/interactive-defaults.ks <&2 + exit 1 +fi +mkdir -p \${target_tmp} +chmod 1777 \${target_tmp} +mount --bind \${target_tmp} /var/tmp +df -h /var/tmp \${target_tmp} +%end + ostreecontainer --url=${INSTALL_IMAGE_PAYLOAD} --transport=containers-storage --no-signature-verification EOF diff --git a/installer/lorax_templates/use_target_var_tmp.tmpl b/installer/lorax_templates/use_target_var_tmp.tmpl deleted file mode 100644 index 2d099d1..0000000 --- a/installer/lorax_templates/use_target_var_tmp.tmpl +++ /dev/null @@ -1 +0,0 @@ -append usr/share/anaconda/interactive-defaults.ks "\n%pre-install --log=/tmp/aerocore-var-tmp.log\nset -eux\ntarget_tmp=\nfor root in /mnt/sysimage /mnt/sysroot /var/mnt/sysimage; do\n if mountpoint -q ${root}; then\n target_tmp=${root}/var/tmp\n break\n fi\ndone\nif [ x${target_tmp} = x ]; then\n echo No mounted target system found for /var/tmp bind mount >&2\n exit 1\nfi\nmkdir -p ${target_tmp}\nchmod 1777 ${target_tmp}\nmount --bind ${target_tmp} /var/tmp\ndf -h /var/tmp ${target_tmp}\n%end" -- cgit v1.2.3 From db108b8b23c86ba39a2ba289fc6129a6325f045f Mon Sep 17 00:00:00 2001 From: tranch Date: Sat, 25 Jul 2026 09:57:45 +0800 Subject: Normalize installer payload and host naming Use a formal local installer image tag and set aerocore-os as the default hostname in both the live image and installed target system. --- installer/Containerfile | 2 +- installer/build.sh | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) (limited to 'installer') diff --git a/installer/Containerfile b/installer/Containerfile index 34c5e28..fa5d731 100644 --- a/installer/Containerfile +++ b/installer/Containerfile @@ -2,7 +2,7 @@ # The image installed to disk is supplied separately as INSTALL_IMAGE_PAYLOAD. ARG BASE_IMAGE=ghcr.io/ublue-os/bazzite:stable -ARG INSTALL_IMAGE_PAYLOAD=ghcr.io/AeroCore-IO/aerocore-bazzite-image:stable +ARG INSTALL_IMAGE_PAYLOAD=ghcr.io/AeroCore-IO/aerocore-os:stable ARG INSTALL_IMAGE_PAYLOAD_ARCHIVE=/install-payload.oci FROM ${BASE_IMAGE} diff --git a/installer/build.sh b/installer/build.sh index aa30f42..c119dcc 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -111,6 +111,22 @@ df -h /var/tmp \${target_tmp} %end ostreecontainer --url=${INSTALL_IMAGE_PAYLOAD} --transport=containers-storage --no-signature-verification + +%post --nochroot --log=/tmp/aerocore-hostname.log +set -eux +target_root= +for root in /mnt/sysroot /mnt/sysimage /var/mnt/sysimage; do + if mountpoint -q \${root}; then + target_root=\${root} + break + fi +done +if [ x\${target_root} = x ]; then + echo No mounted target system found for hostname setup >&2 + exit 1 +fi +systemd-firstboot --root=\${target_root} --hostname=aerocore-os +%end EOF mkdir -p /usr/lib/bootc-image-builder @@ -146,5 +162,5 @@ mkdir -p /boot/efi/EFI/BOOT cp -v "${grubx64}" /boot/efi/EFI/BOOT/BOOTX64.EFI cp -v "${grubx64}" /boot/efi/EFI/BOOT/fbx64.efi -systemd-firstboot --timezone UTC +systemd-firstboot --hostname aerocore-os --timezone UTC dnf clean all -- cgit v1.2.3 From 0ebf76e160c1e45d537e24d145fed47a38d8d99d Mon Sep 17 00:00:00 2001 From: tranch Date: Sat, 25 Jul 2026 22:49:06 +0800 Subject: Route installer updates through OSTREE_IMAGE_REF Use the configured ref for ISO boot origins and derive GHCR fallbacks from the current repository instead of hardcoding the image path. --- installer/Containerfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'installer') diff --git a/installer/Containerfile b/installer/Containerfile index fa5d731..cf20e4f 100644 --- a/installer/Containerfile +++ b/installer/Containerfile @@ -2,12 +2,16 @@ # The image installed to disk is supplied separately as INSTALL_IMAGE_PAYLOAD. ARG BASE_IMAGE=ghcr.io/ublue-os/bazzite:stable -ARG INSTALL_IMAGE_PAYLOAD=ghcr.io/AeroCore-IO/aerocore-os:stable +ARG IMAGE_VENDOR=AeroCore-IO +ARG IMAGE_NAME=aerocore-os +ARG INSTALL_IMAGE_PAYLOAD=ghcr.io/${IMAGE_VENDOR}/${IMAGE_NAME}:stable ARG INSTALL_IMAGE_PAYLOAD_ARCHIVE=/install-payload.oci FROM ${BASE_IMAGE} ARG BASE_IMAGE +ARG IMAGE_VENDOR +ARG IMAGE_NAME ARG INSTALL_IMAGE_PAYLOAD ARG INSTALL_IMAGE_PAYLOAD_ARCHIVE -- cgit v1.2.3 From db976362b9e8f96ed3f0974ba5d36af859b00dc3 Mon Sep 17 00:00:00 2001 From: tranch Date: Sun, 26 Jul 2026 11:00:21 +0800 Subject: Hide GRUB menu after installer deployment Configure target GRUB during Anaconda post-install. Preserve Bazzite menu controls and dual-boot recovery. --- installer/build.sh | 23 ++++++++++ installer/configure-target-grub.sh | 89 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100755 installer/configure-target-grub.sh (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index c119dcc..a382bcf 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -44,6 +44,13 @@ if [[ -d "${SCRIPT_DIR}/system_files/overrides" ]]; then cp -a "${SCRIPT_DIR}/system_files/overrides/." / fi +# The target system is an upstream-built bootc image. Keep this installer-only +# helper out of the installed image and invoke it after Anaconda mounts the +# target rootfs. +install -Dm0755 \ + "${SCRIPT_DIR}/configure-target-grub.sh" \ + /usr/libexec/aerocore-configure-target-grub + # Plasma's live-session launcher defaults to start-here, and Fedora keeps # LOGO=fedora-logo-icon in the base live environment. for size in 16x16 22x22 24x24 32x32 36x36 48x48 64x64 96x96 128x128 256x256; do @@ -127,6 +134,22 @@ if [ x\${target_root} = x ]; then fi systemd-firstboot --root=\${target_root} --hostname=aerocore-os %end + +%post --nochroot --log=/tmp/aerocore-grub.log +set -eux +target_root= +for root in /mnt/sysroot /mnt/sysimage /var/mnt/sysimage; do + if mountpoint -q \${root}; then + target_root=\${root} + break + fi +done +if [ x\${target_root} = x ]; then + echo No mounted target system found for GRUB configuration >&2 + exit 1 +fi +/usr/libexec/aerocore-configure-target-grub \${target_root} +%end EOF mkdir -p /usr/lib/bootc-image-builder diff --git a/installer/configure-target-grub.sh b/installer/configure-target-grub.sh new file mode 100755 index 0000000..2f16692 --- /dev/null +++ b/installer/configure-target-grub.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash + +set -euo pipefail + +target_root=${1:?usage: configure-target-grub.sh TARGET_ROOT} + +if [[ ! -d "${target_root}/etc" || ! -d "${target_root}/usr" ]]; then + echo "Invalid target root: ${target_root}" >&2 + exit 1 +fi + +grub_defaults="${target_root}/etc/default/grub" +mkdir -p "$(dirname "${grub_defaults}")" + +if [[ -f "${grub_defaults}" ]] && grep -q '^GRUB_TIMEOUT=' "${grub_defaults}"; then + sed -i 's/^GRUB_TIMEOUT=.*/GRUB_TIMEOUT=0/' "${grub_defaults}" +else + printf 'GRUB_TIMEOUT=0\n' >> "${grub_defaults}" +fi + +grub_editenv="" +for candidate in \ + "${target_root}/usr/bin/grub2-editenv" \ + "${target_root}/usr/sbin/grub2-editenv"; do + if [[ -x "${candidate}" ]]; then + grub_editenv="${candidate#"${target_root}"}" + break + fi +done + +grub_mkconfig="" +for candidate in \ + "${target_root}/usr/bin/grub2-mkconfig" \ + "${target_root}/usr/sbin/grub2-mkconfig"; do + if [[ -x "${candidate}" ]]; then + grub_mkconfig="${candidate#"${target_root}"}" + break + fi +done + +if [[ -z "${grub_editenv}" || -z "${grub_mkconfig}" ]]; then + echo "The target image does not contain the required GRUB tools" >&2 + exit 1 +fi + +mounted_paths=() +cleanup() { + local path + for path in "${mounted_paths[@]}"; do + umount -R "${path}" 2>/dev/null || true + done +} +trap cleanup EXIT + +bind_runtime_tree() { + local source=$1 + local destination="${target_root}/${source#/}" + + mkdir -p "${destination}" + if mountpoint -q "${destination}"; then + return 0 + fi + + mount --rbind "${source}" "${destination}" + mount --make-rslave "${destination}" + mounted_paths+=("${destination}") +} + +# grub2-mkconfig invokes grub-probe and needs the installer's device and EFI +# views while it runs inside the installed image. +bind_runtime_tree /dev +bind_runtime_tree /proc +bind_runtime_tree /sys + +chroot "${target_root}" "${grub_editenv}" - set menu_auto_hide=1 + +if [[ -e "${target_root}/etc/grub2-efi.cfg" || -L "${target_root}/etc/grub2-efi.cfg" ]]; then + grub_config=/etc/grub2-efi.cfg +elif [[ -e "${target_root}/etc/grub2.cfg" || -L "${target_root}/etc/grub2.cfg" ]]; then + grub_config=/etc/grub2.cfg +elif [[ -d /sys/firmware/efi ]]; then + grub_config=/etc/grub2-efi.cfg +else + grub_config=/etc/grub2.cfg +fi + +chroot "${target_root}" "${grub_mkconfig}" -o "${grub_config}" + +echo "Configured target GRUB: GRUB_TIMEOUT=0, menu_auto_hide=1, ${grub_config}" -- cgit v1.2.3 From 2c3854b1baf375421c4b53f7ff82ba94948b3bd1 Mon Sep 17 00:00:00 2001 From: tranch Date: Mon, 27 Jul 2026 23:03:06 +0800 Subject: fix: sync branding and suspend audio --- installer/branding/sidebar-logo.png | Bin 4425 -> 4105 bytes .../apps/org.fedoraproject.AnacondaInstaller.svg | 4 ++-- .../apps/org.fedoraproject.AnacondaInstaller.svg | 4 ++-- .../org.fedoraproject.AnacondaInstaller-symbolic.svg | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) (limited to 'installer') diff --git a/installer/branding/sidebar-logo.png b/installer/branding/sidebar-logo.png index 0f47606..bd877c4 100644 Binary files a/installer/branding/sidebar-logo.png and b/installer/branding/sidebar-logo.png differ diff --git a/installer/system_files/overrides/usr/share/icons/hicolor/48x48/apps/org.fedoraproject.AnacondaInstaller.svg b/installer/system_files/overrides/usr/share/icons/hicolor/48x48/apps/org.fedoraproject.AnacondaInstaller.svg index 04454b7..c28ad47 100644 --- a/installer/system_files/overrides/usr/share/icons/hicolor/48x48/apps/org.fedoraproject.AnacondaInstaller.svg +++ b/installer/system_files/overrides/usr/share/icons/hicolor/48x48/apps/org.fedoraproject.AnacondaInstaller.svg @@ -26,8 +26,8 @@ - - + + diff --git a/installer/system_files/overrides/usr/share/icons/hicolor/scalable/apps/org.fedoraproject.AnacondaInstaller.svg b/installer/system_files/overrides/usr/share/icons/hicolor/scalable/apps/org.fedoraproject.AnacondaInstaller.svg index 04454b7..c28ad47 100644 --- a/installer/system_files/overrides/usr/share/icons/hicolor/scalable/apps/org.fedoraproject.AnacondaInstaller.svg +++ b/installer/system_files/overrides/usr/share/icons/hicolor/scalable/apps/org.fedoraproject.AnacondaInstaller.svg @@ -26,8 +26,8 @@ - - + + diff --git a/installer/system_files/overrides/usr/share/icons/hicolor/symbolic/apps/org.fedoraproject.AnacondaInstaller-symbolic.svg b/installer/system_files/overrides/usr/share/icons/hicolor/symbolic/apps/org.fedoraproject.AnacondaInstaller-symbolic.svg index f8dedad..f9db423 100644 --- a/installer/system_files/overrides/usr/share/icons/hicolor/symbolic/apps/org.fedoraproject.AnacondaInstaller-symbolic.svg +++ b/installer/system_files/overrides/usr/share/icons/hicolor/symbolic/apps/org.fedoraproject.AnacondaInstaller-symbolic.svg @@ -7,7 +7,7 @@ - - + + -- cgit v1.2.3 From 3a066cbf78aabf2e2e013e5a9a911ba7f37eed27 Mon Sep 17 00:00:00 2001 From: tranch Date: Mon, 27 Jul 2026 13:34:03 +0800 Subject: Preserve GRUB selection timeout Hide the target GRUB menu through menu_auto_hide while keeping the image-provided timeout. This leaves users time to choose rollback or other boot entries when they explicitly reveal the menu. Verified with bash -n and git diff --check. --- installer/configure-target-grub.sh | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) (limited to 'installer') diff --git a/installer/configure-target-grub.sh b/installer/configure-target-grub.sh index 2f16692..a0aa756 100755 --- a/installer/configure-target-grub.sh +++ b/installer/configure-target-grub.sh @@ -9,15 +9,6 @@ if [[ ! -d "${target_root}/etc" || ! -d "${target_root}/usr" ]]; then exit 1 fi -grub_defaults="${target_root}/etc/default/grub" -mkdir -p "$(dirname "${grub_defaults}")" - -if [[ -f "${grub_defaults}" ]] && grep -q '^GRUB_TIMEOUT=' "${grub_defaults}"; then - sed -i 's/^GRUB_TIMEOUT=.*/GRUB_TIMEOUT=0/' "${grub_defaults}" -else - printf 'GRUB_TIMEOUT=0\n' >> "${grub_defaults}" -fi - grub_editenv="" for candidate in \ "${target_root}/usr/bin/grub2-editenv" \ @@ -86,4 +77,6 @@ fi chroot "${target_root}" "${grub_mkconfig}" -o "${grub_config}" -echo "Configured target GRUB: GRUB_TIMEOUT=0, menu_auto_hide=1, ${grub_config}" +# Preserve the target image's GRUB timeout so users have time to choose an +# entry after explicitly showing the otherwise hidden menu. +echo "Configured target GRUB: menu_auto_hide=1, ${grub_config}" -- cgit v1.2.3 From 301945ffb4db538ff25cece94a66acf80223340a Mon Sep 17 00:00:00 2001 From: tranch Date: Wed, 29 Jul 2026 00:28:49 +0800 Subject: Allow live user to launch installer Authorize only the local active liveuser session for Anaconda's specific polkit action, avoiding the transient password prompt. Validate installer polkit rule syntax in the pull request workflow. --- .../overrides/etc/polkit-1/rules.d/10-aerocore-liveinst.rules | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 installer/system_files/overrides/etc/polkit-1/rules.d/10-aerocore-liveinst.rules (limited to 'installer') diff --git a/installer/system_files/overrides/etc/polkit-1/rules.d/10-aerocore-liveinst.rules b/installer/system_files/overrides/etc/polkit-1/rules.d/10-aerocore-liveinst.rules new file mode 100644 index 0000000..0ebcfdd --- /dev/null +++ b/installer/system_files/overrides/etc/polkit-1/rules.d/10-aerocore-liveinst.rules @@ -0,0 +1,10 @@ +// The installer action is privileged by design. Allow only the local, +// active Live ISO session to launch it without a transient password prompt. +polkit.addRule(function(action, subject) { + if (action.id === "org.fedoraproject.pkexec.liveinst" && + subject.user === "liveuser" && + subject.local === true && + subject.active === true) { + return polkit.Result.YES; + } +}); -- cgit v1.2.3 From b4f22ddbba57a9283a9c377d16db6043d7b36505 Mon Sep 17 00:00:00 2001 From: tranch Date: Wed, 29 Jul 2026 00:48:06 +0800 Subject: Fix weak password handling in Live installer Keep the Live CD account locked and enforce strict user/root password validation so weak passwords remain on the form instead of aborting the Anaconda installation. --- installer/lorax_templates/remove_root_password_prompt.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'installer') diff --git a/installer/lorax_templates/remove_root_password_prompt.tmpl b/installer/lorax_templates/remove_root_password_prompt.tmpl index 3bd0342..5e5b60d 100644 --- a/installer/lorax_templates/remove_root_password_prompt.tmpl +++ b/installer/lorax_templates/remove_root_password_prompt.tmpl @@ -1 +1 @@ -append etc/anaconda/profile.d/fedora-kinoite.conf "\\n[User Interface]\\nhidden_spokes =\\n PasswordSpoke" +append etc/anaconda/profile.d/fedora-kinoite.conf "\\n[User Interface]\\nhidden_spokes =\\n PasswordSpoke\\npassword_policies =\\n root (quality 1, length 6, strict)\\n user (quality 1, length 6, empty, strict)\\n luks (quality 1, length 6)" -- cgit v1.2.3 From 52379b8b287353eaa139baacc1063ef2b8a7b28f Mon Sep 17 00:00:00 2001 From: tranch Date: Wed, 29 Jul 2026 00:51:24 +0800 Subject: Brand the Live installer as AeroCore OS Update the Live ISO product metadata and system release label while preserving the Fedora version and Kinoite variant. --- installer/build.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index a382bcf..0cc1b8a 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -70,7 +70,12 @@ if [[ -f /usr/share/icons/hicolor/scalable/places/distributor-logo.svg ]]; then /usr/share/icons/hicolor/scalable/places/start-here.svg fi -sed -i 's/^LOGO=.*/LOGO=distributor-logo/' /usr/lib/os-release +live_version_id="$(awk -F= '$1 == "VERSION_ID" { gsub(/\"/, "", $2); print $2; exit }' /usr/lib/os-release)" +live_product_name="AeroCore OS" +sed -i "s/^NAME=.*/NAME=\"${live_product_name}\"/" /usr/lib/os-release +sed -i "s/^PRETTY_NAME=.*/PRETTY_NAME=\"${live_product_name} ${live_version_id} (Kinoite)\"/" /usr/lib/os-release +sed -i "s/^LOGO=.*/LOGO=distributor-logo/" /usr/lib/os-release +printf '%s release %s (Kinoite)\n' "${live_product_name}" "${live_version_id}" > /etc/system-release for desktop_file in \ /usr/share/applications/liveinst.desktop \ -- cgit v1.2.3 From 26848f158c30f700258f4eab5df6e3a448a8d35c Mon Sep 17 00:00:00 2001 From: tranch Date: Wed, 29 Jul 2026 08:23:02 +0800 Subject: Fix installer update origin Rewrite installed bootc origins to the configured signed registry reference. --- installer/Containerfile | 6 ++++++ installer/build.sh | 11 +++++++++++ 2 files changed, 17 insertions(+) (limited to 'installer') diff --git a/installer/Containerfile b/installer/Containerfile index cf20e4f..32b327e 100644 --- a/installer/Containerfile +++ b/installer/Containerfile @@ -6,6 +6,8 @@ ARG IMAGE_VENDOR=AeroCore-IO ARG IMAGE_NAME=aerocore-os ARG INSTALL_IMAGE_PAYLOAD=ghcr.io/${IMAGE_VENDOR}/${IMAGE_NAME}:stable ARG INSTALL_IMAGE_PAYLOAD_ARCHIVE=/install-payload.oci +ARG INSTALL_IMAGE_TAG=latest +ARG OSTREE_IMAGE_REF=ostree-image-signed:docker://ghcr.io/${IMAGE_VENDOR}/${IMAGE_NAME} FROM ${BASE_IMAGE} @@ -14,10 +16,14 @@ ARG IMAGE_VENDOR ARG IMAGE_NAME ARG INSTALL_IMAGE_PAYLOAD ARG INSTALL_IMAGE_PAYLOAD_ARCHIVE +ARG INSTALL_IMAGE_TAG +ARG OSTREE_IMAGE_REF RUN --mount=type=bind,source=.,target=/src \ --mount=type=bind,source=output/install-payload.oci,target=/install-payload.oci,ro \ env BASE_IMAGE="${BASE_IMAGE}" \ INSTALL_IMAGE_PAYLOAD="${INSTALL_IMAGE_PAYLOAD}" \ INSTALL_IMAGE_PAYLOAD_ARCHIVE="${INSTALL_IMAGE_PAYLOAD_ARCHIVE}" \ + INSTALL_IMAGE_TAG="${INSTALL_IMAGE_TAG}" \ + OSTREE_IMAGE_REF="${OSTREE_IMAGE_REF}" \ /src/installer/build.sh diff --git a/installer/build.sh b/installer/build.sh index 0cc1b8a..3093dcc 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -6,6 +6,9 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BASE_IMAGE=${BASE_IMAGE:?} INSTALL_IMAGE_PAYLOAD=${INSTALL_IMAGE_PAYLOAD:?} INSTALL_IMAGE_PAYLOAD_ARCHIVE=${INSTALL_IMAGE_PAYLOAD_ARCHIVE:-} +INSTALL_IMAGE_TAG=${INSTALL_IMAGE_TAG:?} +OSTREE_IMAGE_REF=${OSTREE_IMAGE_REF:?} +ostree_origin_ref="${OSTREE_IMAGE_REF}:${INSTALL_IMAGE_TAG}" # The installer is a live KDE environment. Keep the installed system payload # separate: it is the AeroCore image, while BASE_IMAGE provides the live UI. @@ -124,6 +127,14 @@ df -h /var/tmp \${target_tmp} ostreecontainer --url=${INSTALL_IMAGE_PAYLOAD} --transport=containers-storage --no-signature-verification +# The local containers-storage deployment is intentionally unverified because +# the payload is loaded from an OCI archive. Point future bootc updates at the +# signed registry reference configured for the image instead. +%post --erroronfail --log=/tmp/aerocore-origin.log +set -eux +sed -i 's|container-image-reference=.*|container-image-reference=${ostree_origin_ref}|' /ostree/deploy/default/deploy/*.origin +%end + %post --nochroot --log=/tmp/aerocore-hostname.log set -eux target_root= -- cgit v1.2.3 From d8983c361705874558a20328ce3355852208c178 Mon Sep 17 00:00:00 2001 From: tranch Date: Wed, 29 Jul 2026 17:05:41 +0800 Subject: Fix weak password crash in Live installer Restore the Cockpit force-password behavior embedded in Fedora 43's Anaconda WebUI bundle. Apply strict password policy through conf.d so weak passwords remain a form validation error instead of aborting the installer. --- installer/build.sh | 5 +++ installer/patch-anaconda-webui.sh | 47 ++++++++++++++++++++++ .../etc/anaconda/conf.d/99-aerocore-password.conf | 5 +++ 3 files changed, 57 insertions(+) create mode 100755 installer/patch-anaconda-webui.sh create mode 100644 installer/system_files/overrides/etc/anaconda/conf.d/99-aerocore-password.conf (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index 3093dcc..4535113 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -31,6 +31,11 @@ dnf --setopt=excludepkgs= reinstall -y \ grub2-efi-x64 \ grub2-efi-x64-cdboot +# Fedora 43's anaconda-webui bundle embeds a Cockpit password helper from +# before cockpit-project/cockpit@900c13f. Restore that upstream fix so a weak +# pwscore result is returned as score 0 instead of rejecting the WebUI promise. +"${SCRIPT_DIR}/patch-anaconda-webui.sh" + # Apply the same AeroCore overlay to the live session where possible. if [[ -d /src/system_files ]]; then cp -a /src/system_files/. / diff --git a/installer/patch-anaconda-webui.sh b/installer/patch-anaconda-webui.sh new file mode 100755 index 0000000..2f61516 --- /dev/null +++ b/installer/patch-anaconda-webui.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +set -euo pipefail + +bundle="${1:-/usr/share/cockpit/anaconda-webui/index.js.gz}" +broken='n===0?r(new Error(X2("Password is too weak"))):o(' +fixed='n===0&&!e?r(new Error(X2("Password is too weak"))):o(' +fixed_sed='n===0\&\&!e?r(new Error(X2("Password is too weak"))):o(' + +if [[ ! -f "${bundle}" ]]; then + echo "Anaconda WebUI bundle not found: ${bundle}" >&2 + exit 1 +fi + +webui_js="$(mktemp)" +patched_js="$(mktemp)" +patched_bundle="$(mktemp)" +trap 'rm -f "${webui_js}" "${patched_js}" "${patched_bundle}"' EXIT + +gzip -dc "${bundle}" > "${webui_js}" + +fixed_count="$( (grep -oF "${fixed}" "${webui_js}" || true) | wc -l | tr -d ' ')" +if [[ "${fixed_count}" == "1" ]]; then + echo "Anaconda WebUI weak-password handling is already fixed" + exit 0 +fi + +broken_count="$( (grep -oF "${broken}" "${webui_js}" || true) | wc -l | tr -d ' ')" +if [[ "${broken_count}" != "1" ]]; then + echo "Unexpected Anaconda WebUI password helper; refusing an unsafe patch" >&2 + echo "Expected one weak-password rejection, found ${broken_count}" >&2 + exit 1 +fi + +sed "s|${broken}|${fixed_sed}|" "${webui_js}" > "${patched_js}" + +fixed_count="$( (grep -oF "${fixed}" "${patched_js}" || true) | wc -l | tr -d ' ')" +if [[ "${fixed_count}" != "1" ]] || grep -Fq "${broken}" "${patched_js}"; then + echo "Failed to patch Anaconda WebUI weak-password handling" >&2 + exit 1 +fi + +gzip -n -9 -c "${patched_js}" > "${patched_bundle}" +chmod 0644 "${patched_bundle}" +mv -f "${patched_bundle}" "${bundle}" + +echo "Patched Anaconda WebUI weak-password handling" diff --git a/installer/system_files/overrides/etc/anaconda/conf.d/99-aerocore-password.conf b/installer/system_files/overrides/etc/anaconda/conf.d/99-aerocore-password.conf new file mode 100644 index 0000000..3105934 --- /dev/null +++ b/installer/system_files/overrides/etc/anaconda/conf.d/99-aerocore-password.conf @@ -0,0 +1,5 @@ +[User Interface] +password_policies = + root (quality 1, length 6, strict) + user (quality 1, length 6, empty, strict) + luks (quality 1, length 6) -- cgit v1.2.3 From 80cde14b9c368f58e8f16ad121396ce2f1a50f44 Mon Sep 17 00:00:00 2001 From: tranch Date: Fri, 21 Aug 2026 08:42:38 +0800 Subject: Adapt to Bazzite 44 Update Deck identity matching for the new upstream scripts and add fixture coverage for patch idempotence. Move the live installer base to Fedora 44 while retaining the Fedora 43 Anaconda workaround for explicit legacy builds. --- installer/build.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index 4535113..3d6659f 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -9,6 +9,7 @@ INSTALL_IMAGE_PAYLOAD_ARCHIVE=${INSTALL_IMAGE_PAYLOAD_ARCHIVE:-} INSTALL_IMAGE_TAG=${INSTALL_IMAGE_TAG:?} OSTREE_IMAGE_REF=${OSTREE_IMAGE_REF:?} ostree_origin_ref="${OSTREE_IMAGE_REF}:${INSTALL_IMAGE_TAG}" +live_version_id="$(awk -F= '$1 == "VERSION_ID" { gsub(/\"/, "", $2); print $2; exit }' /usr/lib/os-release)" # The installer is a live KDE environment. Keep the installed system payload # separate: it is the AeroCore image, while BASE_IMAGE provides the live UI. @@ -32,9 +33,11 @@ dnf --setopt=excludepkgs= reinstall -y \ grub2-efi-x64-cdboot # Fedora 43's anaconda-webui bundle embeds a Cockpit password helper from -# before cockpit-project/cockpit@900c13f. Restore that upstream fix so a weak -# pwscore result is returned as score 0 instead of rejecting the WebUI promise. -"${SCRIPT_DIR}/patch-anaconda-webui.sh" +# before cockpit-project/cockpit@900c13f. Fedora 44 already carries the fix; +# retain the workaround only for explicitly requested Fedora 43 live images. +if [[ "${live_version_id}" == "43" ]]; then + "${SCRIPT_DIR}/patch-anaconda-webui.sh" +fi # Apply the same AeroCore overlay to the live session where possible. if [[ -d /src/system_files ]]; then @@ -78,7 +81,6 @@ if [[ -f /usr/share/icons/hicolor/scalable/places/distributor-logo.svg ]]; then /usr/share/icons/hicolor/scalable/places/start-here.svg fi -live_version_id="$(awk -F= '$1 == "VERSION_ID" { gsub(/\"/, "", $2); print $2; exit }' /usr/lib/os-release)" live_product_name="AeroCore OS" sed -i "s/^NAME=.*/NAME=\"${live_product_name}\"/" /usr/lib/os-release sed -i "s/^PRETTY_NAME=.*/PRETTY_NAME=\"${live_product_name} ${live_version_id} (Kinoite)\"/" /usr/lib/os-release -- cgit v1.2.3 From 6cb356d3837ef5a9637c2f6df1de7ef85196c280 Mon Sep 17 00:00:00 2001 From: tranch Date: Wed, 26 Aug 2026 10:41:01 +0800 Subject: fix(installer): configure the GPT auto-root type Resolve Anaconda target mounts to their backing partition before marking it as the bootc GPT auto-root partition. --- installer/build.sh | 25 +++++++++++++++++++++ installer/configure-target-gpt-root.sh | 40 ++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100755 installer/configure-target-gpt-root.sh (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index 3d6659f..205f18c 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -23,6 +23,7 @@ dnf --setopt=excludepkgs= install -y \ libblockdev-lvm \ dracut-live \ livesys-scripts \ + gdisk \ grub2-efi-x64 \ grub2-efi-x64-cdboot @@ -62,6 +63,10 @@ install -Dm0755 \ "${SCRIPT_DIR}/configure-target-grub.sh" \ /usr/libexec/aerocore-configure-target-grub +install -Dm0755 \ + "${SCRIPT_DIR}/configure-target-gpt-root.sh" \ + /usr/libexec/aerocore-configure-target-gpt-root + # Plasma's live-session launcher defaults to start-here, and Fedora keeps # LOGO=fedora-logo-icon in the base live environment. for size in 16x16 22x22 24x24 32x32 36x36 48x48 64x64 96x96 128x128 256x256; do @@ -132,6 +137,26 @@ mount --bind \${target_tmp} /var/tmp df -h /var/tmp \${target_tmp} %end +# bootc relies on systemd's GPT auto-root discovery on the first boot. Anaconda +# can leave the installed root partition with the generic Linux filesystem +# type, which makes /dev/gpt-auto-root unavailable even though the filesystem +# itself is healthy. Normalize the type before ostreecontainer deployment. +%pre-install --erroronfail --log=/tmp/aerocore-gpt-root.log +set -eux +target_root= +for root in /mnt/sysroot /mnt/sysimage /var/mnt/sysroot /var/mnt/sysimage; do + if mountpoint -q \${root}; then + target_root=\${root} + break + fi +done +if [ x\${target_root} = x ]; then + echo No mounted target system found for GPT root configuration >&2 + exit 1 +fi +/usr/libexec/aerocore-configure-target-gpt-root \${target_root} +%end + ostreecontainer --url=${INSTALL_IMAGE_PAYLOAD} --transport=containers-storage --no-signature-verification # The local containers-storage deployment is intentionally unverified because diff --git a/installer/configure-target-gpt-root.sh b/installer/configure-target-gpt-root.sh new file mode 100755 index 0000000..470821e --- /dev/null +++ b/installer/configure-target-gpt-root.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +set -euo pipefail + +target_root=${1:?usage: configure-target-gpt-root.sh TARGET_ROOT} + +source_device="$(findmnt --nofsroot -no SOURCE --target "${target_root}")" +# For a Btrfs subvolume, findmnt decorates the backing device with the +# subvolume path (for example, /dev/vda3[/root]). lsblk and the partition +# validation below require the undecorated block-device path. +source_device="${source_device%%\[*}" +# Anaconda can bind-mount the target at /mnt/sysroot. In that case findmnt's +# human-readable SOURCE is "root", even though the mounted filesystem still +# has the real target partition's device number. Resolve that number through +# lsblk before requiring a partition-backed source. +if [[ ! "${source_device}" =~ ^/dev/ ]]; then + source_maj_min="$(findmnt -no MAJ:MIN --target "${target_root}")" + source_device="$(lsblk -nrpo NAME,MAJ:MIN | awk -v wanted="${source_maj_min}" '$2 == wanted { print $1; exit }')" +fi + +case "${source_device}" in + /dev/*[0-9]) ;; + *) + echo "Could not resolve a partition-backed target root: ${source_device}" >&2 + exit 1 + ;; +esac + +parent_device="$(lsblk -no PKNAME "${source_device}")" +partition_number="$(lsblk -no PARTN "${source_device}")" +if [[ -z "${parent_device}" || -z "${partition_number}" ]]; then + echo "Could not resolve parent disk and partition number for ${source_device}" >&2 + exit 1 +fi + +disk="/dev/${parent_device}" +root_type_guid="4f68bce3-e8cd-4db1-96e7-fbcaf984b709" +echo "Setting ${source_device} (partition ${partition_number} on ${disk}) to GPT root-x86-64 type ${root_type_guid}" +sgdisk --typecode="${partition_number}:${root_type_guid}" "${disk}" +partprobe "${disk}" || true -- cgit v1.2.3 From cc2a2c630120627d8d89e6fec90fdeeb04ca1a51 Mon Sep 17 00:00:00 2001 From: tranch Date: Wed, 26 Aug 2026 10:41:53 +0800 Subject: fix(installer): restore interactive account setup Use an AeroCore Anaconda profile so the live installer keeps the accounts page that Fedora KDE hides. --- installer/build.sh | 1 + .../overrides/etc/anaconda/profile.d/aerocore.conf | 36 ++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 installer/system_files/overrides/etc/anaconda/profile.d/aerocore.conf (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index 205f18c..937d324 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -89,6 +89,7 @@ fi live_product_name="AeroCore OS" sed -i "s/^NAME=.*/NAME=\"${live_product_name}\"/" /usr/lib/os-release sed -i "s/^PRETTY_NAME=.*/PRETTY_NAME=\"${live_product_name} ${live_version_id} (Kinoite)\"/" /usr/lib/os-release +sed -i 's/^ID=.*/ID=aerocore/' /usr/lib/os-release sed -i "s/^LOGO=.*/LOGO=distributor-logo/" /usr/lib/os-release printf '%s release %s (Kinoite)\n' "${live_product_name}" "${live_version_id}" > /etc/system-release diff --git a/installer/system_files/overrides/etc/anaconda/profile.d/aerocore.conf b/installer/system_files/overrides/etc/anaconda/profile.d/aerocore.conf new file mode 100644 index 0000000..0dd8f41 --- /dev/null +++ b/installer/system_files/overrides/etc/anaconda/profile.d/aerocore.conf @@ -0,0 +1,36 @@ +# Anaconda configuration for the AeroCore live installer. +# +# This deliberately does not inherit the Fedora KDE profile: that profile +# hides the accounts screen, which would leave an interactive bootc install +# without a user account. Keep the account page available so the installer +# creates the user's requested login during installation. + +[Profile] +profile_id = aerocore + +[Profile Detection] +os_id = aerocore + +[Network] +default_on_boot = FIRST_WIRED_WITH_LINK + +[Bootloader] +efi_dir = fedora +menu_auto_hide = True + +[Storage] +default_scheme = BTRFS +btrfs_compression = zstd:1 +default_partitioning = + / (min 1 GiB, max 70 GiB) + /home (min 500 MiB, free 50 GiB) + /var (btrfs) + +[User Interface] +# Leave anaconda-screen-accounts visible. The user account is configured in +# the WebUI rather than via an unused Lorax template. +hidden_webui_pages = + network + +[Localization] +use_geolocation = False -- cgit v1.2.3 From 99c47421bdb444e2eb799c1db1fe11a8ea91dee3 Mon Sep 17 00:00:00 2001 From: tranch Date: Tue, 25 Aug 2026 09:51:14 +0800 Subject: Document local live ISO reproduction path --- installer/build.sh | 18 ++++++++++++++++++ installer/configure-target-gpt-root.sh | 1 - 2 files changed, 18 insertions(+), 1 deletion(-) (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index 205f18c..dda0706 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -157,6 +157,24 @@ fi /usr/libexec/aerocore-configure-target-gpt-root \${target_root} %end +# Do not let stale Fedora boot files from an earlier installation collide with +# the bootc payload being installed. This matches the upstream Bazzite +# installer behavior; other vendor EFI directories are left untouched. +%pre-install --erroronfail --log=/tmp/aerocore-efi-cleanup.log +set -eux +efi_root= +for root in /mnt/sysroot /mnt/sysimage /var/mnt/sysroot /var/mnt/sysimage; do + if mountpoint -q \${root}/boot/efi; then + efi_root=\${root}/boot/efi + break + fi +done +if [ x\${efi_root} = x ]; then + echo No mounted EFI system partition found for cleanup >&2 + exit 1 +fi +rm -rf \${efi_root}/EFI/fedora +%end ostreecontainer --url=${INSTALL_IMAGE_PAYLOAD} --transport=containers-storage --no-signature-verification # The local containers-storage deployment is intentionally unverified because diff --git a/installer/configure-target-gpt-root.sh b/installer/configure-target-gpt-root.sh index 470821e..6c1a2d1 100755 --- a/installer/configure-target-gpt-root.sh +++ b/installer/configure-target-gpt-root.sh @@ -17,7 +17,6 @@ if [[ ! "${source_device}" =~ ^/dev/ ]]; then source_maj_min="$(findmnt -no MAJ:MIN --target "${target_root}")" source_device="$(lsblk -nrpo NAME,MAJ:MIN | awk -v wanted="${source_maj_min}" '$2 == wanted { print $1; exit }')" fi - case "${source_device}" in /dev/*[0-9]) ;; *) -- cgit v1.2.3 From ed4bd0d089d41c5d95fe74937acc2a779c6de6d4 Mon Sep 17 00:00:00 2001 From: tranch Date: Tue, 25 Aug 2026 10:44:18 +0800 Subject: fix(installer): validate ISO payload metadata Rewrite system-release atomically and reject stale or NUL-bearing payload metadata before it reaches Anaconda bootupd. --- installer/build.sh | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index dda0706..dd7b7f5 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -115,6 +115,33 @@ else podman pull "${INSTALL_IMAGE_PAYLOAD}" fi +# Refuse to build an ISO with a payload that still carries Bazzite release +# bytes. bootupd derives its EFI label from system-release during installation; +# a trailing NUL there makes efibootmgr fail before Anaconda can run %post. +podman run --rm --entrypoint /usr/bin/bash "${INSTALL_IMAGE_PAYLOAD}" -ceu ' + system_release=/etc/system-release + system_release_target=$(readlink -f "$system_release") + + if od -An -v -tx1 "$system_release_target" | awk '\''{ for (i = 1; i <= NF; i++) if ($i == "00") found = 1 } END { exit(found ? 0 : 1) }'\''; then + echo "Install payload has a NUL byte in ${system_release_target}" >&2 + od -An -v -tx1 "$system_release_target" >&2 + exit 1 + fi + + expected_prefix="AeroCore OS release $(rpm -E %fedora) (" + system_release_value=$(<"$system_release_target") + case "$system_release_value" in + "$expected_prefix"*) ;; + *) + echo "Install payload has an unexpected system-release: ${system_release_value@Q}" >&2 + exit 1 + ;; + esac + + jq -e '\''.["image-name"] == "aerocore-os" and .["image-vendor"] == "aerocore-io"'\'' \ + /usr/share/ublue-os/image-info.json >/dev/null +' + # Tell Anaconda to install the bootc container that was loaded above. mkdir -p /var/lib/rpm-state cat >> /usr/share/anaconda/interactive-defaults.ks < Date: Tue, 25 Aug 2026 11:41:20 +0800 Subject: fix(installer): validate payload on build host Move payload inspection out of the nested Podman build so local ISO builds do not require /dev/fuse. Normalize local registry references. --- installer/Containerfile | 2 +- installer/build.sh | 27 --------------------------- 2 files changed, 1 insertion(+), 28 deletions(-) (limited to 'installer') diff --git a/installer/Containerfile b/installer/Containerfile index 32b327e..a7f1d3b 100644 --- a/installer/Containerfile +++ b/installer/Containerfile @@ -2,7 +2,7 @@ # The image installed to disk is supplied separately as INSTALL_IMAGE_PAYLOAD. ARG BASE_IMAGE=ghcr.io/ublue-os/bazzite:stable -ARG IMAGE_VENDOR=AeroCore-IO +ARG IMAGE_VENDOR=aerocore-io ARG IMAGE_NAME=aerocore-os ARG INSTALL_IMAGE_PAYLOAD=ghcr.io/${IMAGE_VENDOR}/${IMAGE_NAME}:stable ARG INSTALL_IMAGE_PAYLOAD_ARCHIVE=/install-payload.oci diff --git a/installer/build.sh b/installer/build.sh index dd7b7f5..dda0706 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -115,33 +115,6 @@ else podman pull "${INSTALL_IMAGE_PAYLOAD}" fi -# Refuse to build an ISO with a payload that still carries Bazzite release -# bytes. bootupd derives its EFI label from system-release during installation; -# a trailing NUL there makes efibootmgr fail before Anaconda can run %post. -podman run --rm --entrypoint /usr/bin/bash "${INSTALL_IMAGE_PAYLOAD}" -ceu ' - system_release=/etc/system-release - system_release_target=$(readlink -f "$system_release") - - if od -An -v -tx1 "$system_release_target" | awk '\''{ for (i = 1; i <= NF; i++) if ($i == "00") found = 1 } END { exit(found ? 0 : 1) }'\''; then - echo "Install payload has a NUL byte in ${system_release_target}" >&2 - od -An -v -tx1 "$system_release_target" >&2 - exit 1 - fi - - expected_prefix="AeroCore OS release $(rpm -E %fedora) (" - system_release_value=$(<"$system_release_target") - case "$system_release_value" in - "$expected_prefix"*) ;; - *) - echo "Install payload has an unexpected system-release: ${system_release_value@Q}" >&2 - exit 1 - ;; - esac - - jq -e '\''.["image-name"] == "aerocore-os" and .["image-vendor"] == "aerocore-io"'\'' \ - /usr/share/ublue-os/image-info.json >/dev/null -' - # Tell Anaconda to install the bootc container that was loaded above. mkdir -p /var/lib/rpm-state cat >> /usr/share/anaconda/interactive-defaults.ks < Date: Thu, 27 Aug 2026 23:00:51 +0800 Subject: fix: replace About System logo symlink Ensure KDE About System uses the AeroCore asset in both payload and live installer builds. --- installer/build.sh | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index e027bd6..1920085 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -45,6 +45,15 @@ if [[ -d /src/system_files ]]; then cp -a /src/system_files/. / fi +# The live base can already contain this About System asset as a symlink. +# Replace the link itself so the installer UI also renders AeroCore branding. +if [[ -f /src/system_files/usr/share/pixmaps/system-logo-white.png ]]; then + rm -f /usr/share/pixmaps/system-logo-white.png + install -Dm0644 \ + /src/system_files/usr/share/pixmaps/system-logo-white.png \ + /usr/share/pixmaps/system-logo-white.png +fi + BRANDING_DIR="${SCRIPT_DIR}/branding" if [[ -d "${BRANDING_DIR}" ]]; then mkdir -p /usr/share/anaconda/pixmaps -- cgit v1.2.3 From 115f7475e2716410fa5603114d3ec8c3211b9ca3 Mon Sep 17 00:00:00 2001 From: tranch Date: Sat, 12 Sep 2026 15:51:39 +0800 Subject: Fix LiveISO root path initialization Create the /root symlink target before early-boot services run. This avoids systemd-tmpfiles failures that delay Anaconda startup. --- installer/build.sh | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'installer') diff --git a/installer/build.sh b/installer/build.sh index 1920085..34c55b7 100755 --- a/installer/build.sh +++ b/installer/build.sh @@ -11,6 +11,10 @@ OSTREE_IMAGE_REF=${OSTREE_IMAGE_REF:?} ostree_origin_ref="${OSTREE_IMAGE_REF}:${INSTALL_IMAGE_TAG}" live_version_id="$(awk -F= '$1 == "VERSION_ID" { gsub(/\"/, "", $2); print $2; exit }' /usr/lib/os-release)" +# The live image may ship /root as a symlink. Ensure its target exists before +# systemd-tmpfiles and other early-boot services process root-owned paths. +mkdir -p "$(realpath /root)" + # The installer is a live KDE environment. Keep the installed system payload # separate: it is the AeroCore image, while BASE_IMAGE provides the live UI. # Bazzite excludes some base packages from normal transactions. The live -- cgit v1.2.3