diff options
author | Gabin-CC <gabin.laurent@rte-international.com> | 2025-06-06 20:54:03 +0200 |
---|---|---|
committer | Gabin-CC <gabin.laurent@rte-international.com> | 2025-06-06 20:59:22 +0200 |
commit | 02c2e306228a3de24623946499923604341884d3 (patch) | |
tree | 8aedf6b18cce6a19e229661ff9392098ae770ea4 /scripts/image-build/raw_image.py | |
parent | 1cda2d42bb5064868c6435c14a5d3e4b047500d8 (diff) | |
download | vyos-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.py | 27 |
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) |