dism等でWindowsインストールイメージにパッチ当てする場合は、一度ISOをファイルシステム上に展開する必要がありますが、
そこから再度ISOファイルを構築する手順は割と面倒で、ブートパラメータ等の資料も乏しいため備忘録的に作成。
なお、本稿は仮想マシンへのインストール、またはあえてDVDからインストールしたい猛者向けです。
実機インストールなら、USBメモリ上に展開しパッチを当てそれから直接ブートしたほうが手っ取り早いです多分。
#準備
Windows上で構築するなら、Windows用にビルドされたmkisofs.exe(と必須ライブラリ)が必要です。
mkisofsのバージョンが古いと
mkisofs: Implementation botch: FS should end at 4294295164 but ends at XXXXX.
とかいう謎のエラーでiso作成に失敗するかもしれません。
今回はこちらのツールに含まれるmkisofs.exeを使わせて頂きました。
http://cdrtfe.sourceforge.net/cdrtfe/index_en.html
mkisofs.exeを入手したら、適度に%PATH%を通すか、直接実行ファイルを指定してください。
ちなみにブートイメージはWindowsディスクに含まれてるのでCD-ROMから抜き取ったりする必要はないようです。
以前は知らずにImgBurnを使って抜き取っていました
#コマンド
Windows ISO を展開したフォルダから実行することを想定してます。他の場所で実行する場合は適度に変更してください。
末尾の"."はカレントフォルダという意味ですので忘れないでください。
###BIOSブートのみ対応
mkisofs -iso-level 4 -udf -R -D -U -b boot/etfsboot.com -no-emul-boot -boot-load-size 8 -boot-load-seg 1984 -o <output.iso> .
###BIOS/UEFIブート両対応
mkisofs -iso-level 4 -udf -R -D -U -b boot/etfsboot.com -no-emul-boot -boot-load-size 8 -boot-load-seg 1984 -eltorito-alt-boot -b efi/microsoft/boot/efisys.bin -no-emul-boot -o <output.iso> .
#パラメーター解説
-b ブートイメージファイルの指定。Windows環境で作成する場合でも、パス区切りは\ではなく/を使わないとエラーか警告になると思われます。
-no-emul-boot 非エミュレーションイメージを指定。イメージ毎に決まってるようですのでこれを指定。
-boot-load-size ブートイメージのサイズ。ファイルサイズをセクタサイズ512で割った値(要はセクタを占める数)を指定するようです。無くても動くっぽい。
-boot-load-seg ブートイメージのロードセグメントアドレスを指定。イメージ毎に決まってるようですのでこれを指定。無くても動くっぽい。
-eltorito-alt-boot 2番目以降のブートイメージを指定する。
boot/etfsboot.comは、BIOSブート用のブートイメージ、同様にefi/microsoft/boot/efisys.binはUEFIブートイメージで、両方共Windowsインストールディスクに含まれています。
なおWindows 7のx64版DVD-ROMには何故かUEFIイメージが含まれていません。wimなどから抽出して統合すると使えるようですが…
その他のパラメータはman mkisofsを参考にしてください。
#バッチファイル
次のバッチファイルを作り、引数にWindows ISOを展開したフォルダを指定して実行すれば一発生成できると思われます。
ISOファイルは展開フォルダが有る場所に.iso拡張子を付加したものが生成されます。
UEFIイメージが無い32bit版でも対応できるよう、ブートイメージの有無で生成されるISOの仕様が変わるようにしてあります。
@echo on
set IMGSRC=%~f1
if not exist "%IMGSRC%\setup.exe" ECHO usage:%~n0 [imagedir] & pause & goto :eof
set BIOSIMG=boot/etfsboot.com
set EFIIMG=efi/microsoft/boot/efisys.bin
if not exist "%IMGSRC%/%BIOSIMG%" echo Not found bootimage & goto :eof
set BOOTOPT=-b "%BIOSIMG%" -no-emul-boot -boot-load-size 8 -boot-load-seg 1984
if exist "%IMGSRC%/%EFIIMG%" set BOOTOPT=%BOOTOPT% -eltorito-alt-boot -b "%EFIIMG%" -no-emul-boot
mkisofs -iso-level 4 -udf -R -D -U -V "%~n0" %BOOTOPT% -o "%IMGSRC%.iso" "%IMGSRC%"
#参考サイト
http://hrn25.sakura.ne.jp/win/mkiso/mkiso.html
http://www.ioss.jp/sohodiy/mkisofs8v2.php