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に接続したセクションは、承認されたハードウェアメーカーが新しいハードウェア展開に使用できるツールの1つにすぎません。 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/

関連情報