From 304904dbb65106e0f21391cb2fa20c2f2156256a Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 8 Apr 2026 13:55:47 +0100 Subject: [PATCH] [cloud] Fix architecture detection for partitioned disk images Allow the UEFI CPU architecture to be detected for the partitioned disk images generated by genfsimg as of commit 2c84b68 ("[build] Use a partition table in generated USB disk images"). Signed-off-by: Michael Brown --- contrib/cloud/ali-import | 13 ++++++++++--- contrib/cloud/aws-import | 12 ++++++++++-- contrib/cloud/gce-import | 13 ++++++++++--- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/contrib/cloud/ali-import b/contrib/cloud/ali-import index 995db956e..1792208a3 100755 --- a/contrib/cloud/ali-import +++ b/contrib/cloud/ali-import @@ -10,6 +10,7 @@ import io import json from pathlib import Path import subprocess +import tempfile import time from uuid import uuid4 import zipfile @@ -105,13 +106,19 @@ Image = namedtuple('Image', ['path', 'family', 'name', 'arch', 'mode']) def image(filename, basefamily, basename): """Construct image description""" + with tempfile.NamedTemporaryFile(mode='w+t') as mtoolsrc: + mtoolsrc.writelines([ + 'drive D:', f'file="{filename}"', + 'drive P:', f'file="{filename}"', 'partition=4', + ]) + mtoolsrc.flush() + mdir = subprocess.run(['mdir', '-b', 'D:/EFI/BOOT', 'P:/EFI/BOOT'], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + check=False, env={'MTOOLSRC': mtoolsrc.name}) mapping = { b'BOOTX64.EFI': 'x86_64', b'BOOTAA64.EFI': 'arm64', } - mdir = subprocess.run(['mdir', '-b', '-i', filename, '::/EFI/BOOT'], - stdout=subprocess.PIPE, stderr=subprocess.PIPE, - check=False) uefi = [v for k, v in mapping.items() if k in mdir.stdout] suffix = ('-uefi-%s' % uefi[0].replace('_', '-') if len(uefi) == 1 else '-uefi-multi' if uefi else '') diff --git a/contrib/cloud/aws-import b/contrib/cloud/aws-import index f6aded8f3..2b0602f5b 100755 --- a/contrib/cloud/aws-import +++ b/contrib/cloud/aws-import @@ -8,6 +8,7 @@ from hashlib import sha256 from itertools import count import os.path import subprocess +import tempfile import boto3 @@ -17,8 +18,15 @@ EMPTY_CHECKSUM = b64encode(sha256(b'\0' * BLOCKSIZE).digest()).decode() def detect_architecture(image): """Detect CPU architecture""" - mdir = subprocess.run(['mdir', '-b', '-i', image, '::/EFI/BOOT'], - stdout=subprocess.PIPE, stderr=subprocess.PIPE) + with tempfile.NamedTemporaryFile(mode='w+t') as mtoolsrc: + mtoolsrc.writelines([ + 'drive D:', f'file="{image}"', + 'drive P:', f'file="{image}"', 'partition=4', + ]) + mtoolsrc.flush() + mdir = subprocess.run(['mdir', '-b', 'D:/EFI/BOOT', 'P:/EFI/BOOT'], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + check=False, env={'MTOOLSRC': mtoolsrc.name}) if any(b'BOOTAA64.EFI' in x for x in mdir.stdout.splitlines()): return 'arm64' return 'x86_64' diff --git a/contrib/cloud/gce-import b/contrib/cloud/gce-import index 555031c7b..0a2f31565 100755 --- a/contrib/cloud/gce-import +++ b/contrib/cloud/gce-import @@ -6,6 +6,7 @@ from datetime import date import io import subprocess import tarfile +import tempfile from uuid import uuid4 from google.cloud import compute @@ -58,9 +59,15 @@ def upload_blob(bucket, image): def detect_uefi(image): """Identify UEFI CPU architecture(s)""" - mdir = subprocess.run(['mdir', '-b', '-i', image, '::/EFI/BOOT'], - stdout=subprocess.PIPE, stderr=subprocess.PIPE, - check=False) + with tempfile.NamedTemporaryFile(mode='w+t') as mtoolsrc: + mtoolsrc.writelines([ + 'drive D:', f'file="{image}"', + 'drive P:', f'file="{image}"', 'partition=4', + ]) + mtoolsrc.flush() + mdir = subprocess.run(['mdir', '-b', 'D:/EFI/BOOT', 'P:/EFI/BOOT'], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + check=False, env={'MTOOLSRC': mtoolsrc.name}) mapping = { b'BOOTX64.EFI': 'x86_64', b'BOOTAA64.EFI': 'arm64',