mkisofs를 사용하여 cdboot.efi 대신 cdboot_noprompt.efi를 사용하도록 Windows ISO의 부팅 항목을 변경합니다.

mkisofs를 사용하여 cdboot.efi 대신 cdboot_noprompt.efi를 사용하도록 Windows ISO의 부팅 항목을 변경합니다.

Windows 10 ISO를 부팅하면 다음과 같은 잘못된 프롬프트가 표시됩니다. 여기에 이미지 설명을 입력하세요. 왜 오해의 소지가 있습니까? 이 메시지는 Windows ISO에서 실제로 부팅한 후 Windows ISO 자체에서 발생하기 때문입니다. 이 프롬프트는 실수로 Windows 이미지를 부팅하는 것을 방지하기 위해 설계된 기능입니다.

이제 이 메시지가 UEFI 기반 Windows 10 VM을 자동으로 생성 및 설치하지 못하게 하는 매우 구체적인 사용 사례가 있습니다.

noprompt그래서 몇 가지 조사를 했고 Windows에서는 다음과 같이 부팅 항목에 이미지를 지정하여 메시지를 표시하지 않고 Windows ISO를 만들 수 있습니다.

$setfsboot="C:\01_TEMP\ISO\etfsboot.com"
$sefisys ="C:\01_TEMP\ISO\efisys_noprompt.bin"
Oscdimg -bootdata:2#p0,eb$setfsboot#pEF,e,b$sefisys -u1 
-udfver102 C:\winpe_amd64\media C:\winpe_amd64\winpeamd64.iso

빠른 설명

-bootdata:2#p0,eb$setfsboot#pEF,e,b$sefisys

  • 2시작 항목이 2개 있음을 나타냅니다.
  • #분할기
  • p0,eb$setfsboot기본 시작 항목입니다(이전 BIOS 시작의 경우).
  • #분할기
  • pEF,e,b$sefisys대체 부팅 항목입니다(UEFI 부팅용).

OSCdimg 문서

이제 mkisofs를 사용하여 Linux에서 동일한 작업을 수행하려고 합니다. 이는 UEFI 부팅 가능 Windows ISO를 만들려면 업스트림 버전이 필요하기 때문에 매우 까다롭습니다 mkisofs(참조).이 기사는 mkey가 작성했습니다.) (사용 가능여기.) Linux 배포판과 함께 제공되는 버전에는 mkisofs분명히 일부 기능이 부족하고 수정되지 않은 오래된 버그가 있었습니다.

ISO를 속이기 위해 삭제 efi/microsoft/boot/cdboot.efi한 다음 이름을 바꾸려고 시도했지만 불행히도 이 방법은 작동하지 않았습니다.efi/microsoft/boot/cdboot_noprompt.efiefi/microsoft/boot/cdboot.efi

현재 다음 코드를 사용하여 ISO에서 직접 부팅 이미지를 추출합니다.

BOOT_LOAD_SEG="$(dumpet -i "${WIN10_IMG}" | grep "Media load segment: " | cut -d ':' -f2 | cut -d ' ' -f2)"
BOOT_LOAD_SIZE="$(dumpet -i "${WIN10_IMG}" | grep "Load Sectors: " | grep -o "[^:]*$" | cut -d ' ' -f2 | head -1)"

EFI_STARTING_SECTOR="$(dumpet -i "${WIN10_IMG}" | grep "Load LBA: " | grep -o "[^:]*$" | cut -d ' ' -f2 | tail -1)"
echo "EFI_STARTING_SECTOR: $EFI_STARTING_SECTOR"

sudo dd if="${WIN10_IMG}" of="${TMP}/efi.dmp" bs=2048 count=1 skip="${EFI_STARTING_SECTOR}"
EFI_BOOT_LOAD_SIZE="$(file "${TMP}/efi.dmp" | grep -oP 'sectors (\d+)' | cut -d ' ' -f2)"
echo "EFI_BOOT_LOAD_SIZE: ${EFI_BOOT_LOAD_SIZE}"

sudo dd if="${WIN10_IMG}" of="${ISO_FILES}/efi/win_efi_boot.img" bs=2048 count="${EFI_BOOT_LOAD_SIZE}" skip="${EFI_STARTING_SECTOR}"

위의 마지막 명령에서 추출된 이미지는 ISO에서 추출된 파일이 포함된 폴더에 배치됩니다.

-eltorito-boot "efi/win_efi_boot.img"그런 다음 플래그를 사용하여 mkisofs시작 항목으로 사용하도록 지시합니다.

나는 지금 내가 있는 곳으로 가는 데 필요한 모든 것을 자동으로 설정하는 스크립트를 작성했습니다. 스크립트를 보면 STEP 5파일명을 바꾸려고 하는 걸 알 수 있는데, 해야 할 것 같은데 STEP 4어떻게 해야 할지 모르겠어요.

#!/usr/bin/env bash

#You might have to install a few dependencies for schily tools to compile.
#On Fedora this did the trick for me: `sudo dnf install e2fsprogs-devel imake gcc-c++`

############ STEP 1 download Windows 10 ISO from Microsoft ##############
WIN10_IMG="$(pwd)/windows10.iso" 
WIN10_IMG_ARCH="x64"

if [ ! -f "$WIN10_IMG" ]; then # if the windows10.iso has not been downloaded yet
    if [[ "$WIN10_IMG_ARCH" == "x86" ]] || [[ "$WIN10_IMG_ARCH" == "i386" ]] ; then
        echo "Retrieving the x86 Windows 10 iso URL..."
        WINDOWS_10_ISO_URL=$(curl -LsI -o /dev/null -w %{url_effective} "https://tb.rg-adguard.net/dl.php?go=7e583fea") # This strange looking URL actually redirects to a legit software-download.microsoft.com URL 
    else
        echo "Retrieving the x64 Windows 10 iso URL..."
        WINDOWS_10_ISO_URL=$(curl -LsI -o /dev/null -w %{url_effective} "https://tb.rg-adguard.net/dl.php?go=3dd1ce66") # This strange looking URL actually redirects to a legit software-download.microsoft.com URL 
    fi

    echo "Download URL: $WINDOWS_10_ISO_URL"
    echo "Making sure the URL comes from a trusted Microsoft domain..."
    if [[ $WINDOWS_10_ISO_URL == https://software-download.microsoft.com/* ]] ; then
        echo "Downloading the Windows 10 installation iso..."
        wget "$WINDOWS_10_ISO_URL" -O "$WIN10_IMG"
    else
        echo "URL validation failed. Please download the Windows 10 iso manually."
        exit 1
    fi
fi
#########################################################################


############## STEP 2 download and build the schily tools ###############

SCHILY_VERSION="2021-06-07"
SCHILY_ARCHIVE="schily-${SCHILY_VERSION}.tar.bz2"
SCHILY_DIR="./schily-tools"

if [ ! -f "${SCHILY_DIR}/mkisofs/OBJ/x86_64-linux-gcc/mkisofs" ]; then # if the mkisofs of Schily Tools has not been built yet
    sudo rm -rf "${SCHILY_DIR}"
    wget "https://altushost-swe.dl.sourceforge.net/project/schilytools/${SCHILY_ARCHIVE}" -O "${SCHILY_ARCHIVE}"
    tar -xf "${SCHILY_ARCHIVE}"
    rm "${SCHILY_ARCHIVE}"
    mv "schily-${SCHILY_VERSION}" "${SCHILY_DIR}"
    cd "${SCHILY_DIR}"
    ./Gmake.linux
    cd ..
    if [ ! -f "${SCHILY_DIR}/mkisofs/OBJ/x86_64-linux-gcc/mkisofs" ]; then
        echo "Building Schily Tools failed"
        exit 1
    fi
fi
#########################################################################


################# STEP 3 Extract the files from the ISO #################
TMP="./tmp"
ISO_FILES="${TMP}/iso-files"
ISO_MP="${TMP}/iso-mountpoint"
if [ ! -f "${ISO_FILES}/setup.exe" ]; then # If the Windows ISO hasn't been extracted yet
    sudo rm -rf "${TMP}"
    mkdir -p "${ISO_FILES}"
    mkdir -p "${ISO_MP}"
    sudo mount -t udf "${WIN10_IMG}" "${ISO_MP}"
    sudo cp -Rva ${ISO_MP}/* "${ISO_FILES}"
    sudo umount "${ISO_MP}"
fi
#########################################################################


################## STEP 4 Extract the EFI boot image ####################
# Extract boot load segment address and size
BOOT_LOAD_SEG="$(dumpet -i "${WIN10_IMG}" | grep "Media load segment: " | cut -d ':' -f2 | cut -d ' ' -f2)"
BOOT_LOAD_SIZE="$(dumpet -i "${WIN10_IMG}" | grep "Load Sectors: " | grep -o "[^:]*$" | cut -d ' ' -f2 | head -1)"

EFI_STARTING_SECTOR="$(dumpet -i "${WIN10_IMG}" | grep "Load LBA: " | grep -o "[^:]*$" | cut -d ' ' -f2 | tail -1)"
echo "EFI_STARTING_SECTOR: $EFI_STARTING_SECTOR"

sudo dd if="${WIN10_IMG}" of="${TMP}/efi.dmp" bs=2048 count=1 skip="${EFI_STARTING_SECTOR}"
EFI_BOOT_LOAD_SIZE="$(file "${TMP}/efi.dmp" | grep -oP 'sectors (\d+)' | cut -d ' ' -f2)"
echo "EFI_BOOT_LOAD_SIZE: ${EFI_BOOT_LOAD_SIZE}"

sudo dd if="${WIN10_IMG}" of="${ISO_FILES}/efi/win_efi_boot.img" bs=2048 count="${EFI_BOOT_LOAD_SIZE}" skip="${EFI_STARTING_SECTOR}"
#########################################################################


######## STEP 5 Make changes to the files extracted from the ISO ########
# Make some arbitrary changes to the iso files
#sudo rm -rf "${ISO_FILES}/efi/microsoft/boot/cdboot.efi"
#sudo mv "${ISO_FILES}/efi/microsoft/boot/cdboot_noprompt.efi" "${ISO_FILES}/efi/microsoft/boot/cdboot.efi"
#sudo rm -rf "${ISO_FILES}/efi/microsoft/boot/efisys.bin"
#sudo mv "${ISO_FILES}/efi/microsoft/boot/efisys_noprompt.bin" "${ISO_FILES}/efi/microsoft/boot/efisys.bin"
#########################################################################


###### STEP 6 Build a new ISO using the extracted/modified files ########
sudo rm -f "${WIN10_IMG}.tmp.iso"
sudo "${SCHILY_DIR}/mkisofs/OBJ/x86_64-linux-gcc/mkisofs" \
  -no-emul-boot \
  -b boot/etfsboot.com \
  -boot-load-seg "${BOOT_LOAD_SEG}" \
  -boot-load-size "${BOOT_LOAD_SIZE}" \
  -eltorito-alt-boot \
  -no-emul-boot \
  -eltorito-boot "efi/win_efi_boot.img" \
  -boot-load-size 1 \
  -iso-level 4 \
  -UDF \
  -o "${WIN10_IMG}.tmp.iso" \
  "${ISO_FILES}"
#########################################################################


############ STEP 7 Remove the files exxtracted from the ISO ############
#sudo rm -f "${TMP}"
#########################################################################

답변1

다음과 같이 메시지를 표시하지 않고 iso를 efi-boot로 수정할 수 있습니다.

7z x windows.iso -oiso-unpack

mkisofs -b boot/etfsboot.com -no-emul-boot -c BOOT.CAT -iso-level 4 -J -l -D -N -joliet-long -relaxed-filenames -v -V "Custom" -udf -boot-info-table -eltorito-alt-boot -eltorito-boot efi/microsoft/boot/efisys_noprompt.bin -no-emul-boot -o install.iso -allow-limited-size iso-unpack

참고: 이를 위해서는 schilytools의 mkisofs(라이센스 문제로 인해 대부분의 배포판에 패키지되지 않음) 또는 genisoimage의 대체 바이너리(대부분의 배포판에 패키지됨)가 필요합니다. 대체 바이너리 xorriso는 UDF를 지원하지 않으므로 사용할 수 없습니다.

답변2

시도가 실패한 위치/방법에 대한 오류 메시지를 공유하지 않았습니다.

UEFI 부팅 프로세스를 방해하기 위해 수행하고 있는 작업은 수행하려는 작업과는 거리가 먼 것 같습니다.

대규모 VM 배포를 수행하는 대부분의 장소에서는 새로운 Windows 10 인스턴스를 생성하기 위해 복제되는 일종의 사전 구축되고 검증된 템플릿 이미지를 사용하거나 OEM 스타일을 수행합니다.무인 설치Windows PE를 사용하여 .WIM환경을 구축하고 옵션을 선택하는 파일을 만듭니다.

OSCdimg에 연결한 섹션은 승인된 하드웨어 제조업체가 새 하드웨어 배포를 위해 사용할 수 있는 도구 중 하나일 뿐입니다. ISO 이미지를 다시 생성하는 것 외에도 Linux의 efibootmgr과 유사한 기능을 수행할 것으로 확신합니다. 그 기능의 일부는 생성된 파일에 서명하는 것인데, MS가 네트워크 액세스 없이 바이너리에 대한 서명 확인을 허용하는 공개 인증서 파일을 해당 디렉토리에 포함시키는 이유를 이해할 수 없습니다.

부록:EFI 사양 중 일부를 읽어보십시오(당신도 읽어보십시오). mkisofs에게 사용하라고 말하는 것에 대해 생각해 보셨나요? -eltorito-boot efi\microsoft\boot\cdboot_noprompt.efi uefi가 디렉토리 구분 기호를 어떤 방식으로 원하는지 잘 모르겠습니다. 사양에 따르면 FAT를 지원해야 하고 제가 가지고 있는 편집기에서 ISO를 보면 UDF 파티션이 있습니다. 이것이 제가 얻은 것입니다. 그 길이 어디에 있는지.

나는 다음으로부터 몇 가지 훌륭한 통찰력을 얻었습니다. https://www.happyassassin.net/posts/2014/01/25/uefi-boot-how-does-that-actually-work-then/

관련 정보