summaryrefslogtreecommitdiff
path: root/installer/configure-target-gpt-root.sh
diff options
context:
space:
mode:
authortranch <tranch.xiao@gmail.com>2026-08-26 10:41:10 +0800
committertranch <tranch.xiao@gmail.com>2026-08-26 10:41:10 +0800
commitc7a47b2ba1cfc17348e729c1b7a6689bd5c9c95d (patch)
tree2c4cb3d437f311e3f0256540af735709a77e5990 /installer/configure-target-gpt-root.sh
parent0a25c4e957f98df15c5e914fd647c3cd6de54456 (diff)
parent6cb356d3837ef5a9637c2f6df1de7ef85196c280 (diff)
downloadAeroCore-OS-c7a47b2ba1cfc17348e729c1b7a6689bd5c9c95d.tar.gz
AeroCore-OS-c7a47b2ba1cfc17348e729c1b7a6689bd5c9c95d.zip
Merge GPT auto-root installer fix
* fix/f44-installer-gpt-root: fix(installer): configure the GPT auto-root type
Diffstat (limited to 'installer/configure-target-gpt-root.sh')
-rwxr-xr-xinstaller/configure-target-gpt-root.sh40
1 files changed, 40 insertions, 0 deletions
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