summaryrefslogtreecommitdiff
path: root/scripts/image-build/raw_image.py
diff options
context:
space:
mode:
authorGabin-CC <gabin.laurent@rte-international.com>2025-06-06 20:54:03 +0200
committerGabin-CC <gabin.laurent@rte-international.com>2025-06-06 20:59:22 +0200
commit02c2e306228a3de24623946499923604341884d3 (patch)
tree8aedf6b18cce6a19e229661ff9392098ae770ea4 /scripts/image-build/raw_image.py
parent1cda2d42bb5064868c6435c14a5d3e4b047500d8 (diff)
downloadvyos-build-02c2e306228a3de24623946499923604341884d3.tar.gz
vyos-build-02c2e306228a3de24623946499923604341884d3.zip
T7453: handle dynamic partition mapping in raw image build
Enhanced the raw image creation logic to dynamically detect and assign EFI and root partitions based on the number of partitions created by kpartx. - Supports both 2-partition and 3-partition layouts - Adds debug output for mapped partitions - Avoids hardcoded assumptions about partition order - Improves resilience in cloud-init and containerized build contexts Fixes build failure when /dev/loopXp3 is missing or not mapped properly. Signed-off-by: Gabin-CC <gabin.laurent@rte-international.com>
Diffstat (limited to 'scripts/image-build/raw_image.py')
-rw-r--r--scripts/image-build/raw_image.py27
1 files changed, 21 insertions, 6 deletions
diff --git a/scripts/image-build/raw_image.py b/scripts/image-build/raw_image.py
index 2edfecd6..399bb268 100644
--- a/scripts/image-build/raw_image.py
+++ b/scripts/image-build/raw_image.py
@@ -232,19 +232,34 @@ def create_raw_image(build_config, iso_file, work_dir):
disk_details = parttable_create(con.loop_device, (int(build_config["disk_size"]) - 1) * 1024 * 1024)
# Map partitions using kpartx
+ print("I: Mapping partitions using kpartx...")
cmd(f"kpartx -av {con.loop_device}")
cmd("udevadm settle")
- # Resolve mapper names (example: /dev/mapper/loop0p2)
+ cmd("ls -l /dev/mapper") # debug output
+
+ # Detect mapped partitions
from glob import glob
+ import time
+
mapper_base = os.path.basename(con.loop_device).replace("/dev/", "")
mapped_parts = sorted(glob(f"/dev/mapper/{mapper_base}p*"))
- if len(mapped_parts) < 3:
- raise RuntimeError("E: Expected at least 3 partitions created by kpartx")
-
- disk_details.partition['efi'] = mapped_parts[1]
- disk_details.partition['root'] = mapped_parts[2]
+ if not mapped_parts:
+ raise RuntimeError(f"E: No partitions were found in /dev/mapper for {mapper_base}")
+
+ print(f"I: Found mapped partitions: {mapped_parts}")
+
+ if len(mapped_parts) == 2:
+ # Assume [0] = EFI, [1] = root
+ disk_details.partition['efi'] = mapped_parts[0]
+ disk_details.partition['root'] = mapped_parts[1]
+ elif len(mapped_parts) >= 3:
+ # Common layout: [1] = EFI, [2] = root (skip 0 if it's BIOS boot)
+ disk_details.partition['efi'] = mapped_parts[1]
+ disk_details.partition['root'] = mapped_parts[2]
+ else:
+ raise RuntimeError(f"E: Unexpected partition layout: {mapped_parts}")
con.disk_details = disk_details
mount_image(con)