diff options
| author | tranch <tranch.xiao@gmail.com> | 2026-08-26 10:41:10 +0800 |
|---|---|---|
| committer | tranch <tranch.xiao@gmail.com> | 2026-08-26 10:41:10 +0800 |
| commit | c7a47b2ba1cfc17348e729c1b7a6689bd5c9c95d (patch) | |
| tree | 2c4cb3d437f311e3f0256540af735709a77e5990 /installer/configure-target-gpt-root.sh | |
| parent | 0a25c4e957f98df15c5e914fd647c3cd6de54456 (diff) | |
| parent | 6cb356d3837ef5a9637c2f6df1de7ef85196c280 (diff) | |
| download | AeroCore-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-x | installer/configure-target-gpt-root.sh | 40 |
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 |
