・xorriso(その2)
xorrisoのドキュメントを読んでみると,xorrisoはcdrtools/mkisofsを参考にしてはいるものの, 独自のSCSI操作用ライブラリを利用するcdrtoolsとは異なり, libburniaプロジェクトが開発したlibisofsやlibburn,libisoburnといった 光学ディスク操作用のライブラリを利用しているらしい.
そう言えば,cdrtoolsはもともとSolaris用に開発したSCSI操作用ライブラリを元にしていて, デバイス名の指定方法に癖があったなぁ,,と思いつつドキュメントを読んでいくと, syslinuxが提供するMBRデータを利用して, EFI用のシステムパーティションを仮想的なパーティションとして作成するような機能があった.
そう言えばArch Linuxのインストーラをベタ書きしたUSBメモリも, fdiskで見ると2つの仮想的なパーティションが見えていたので,この機能を使っているのかも,, と思いつつ指定方法を確認.
ドキュメントを見ると --isohybrid-mbr で syslinux 由来の /usr/share/syslinux/isohdpfx.bin を指定する (このMBRイメージは,パーティションを持つHDDの動作をISOイメージに持たせるものっぽい)ことと, EFI用のシステムパーティションのイメージを -e オプションで指定することがキモっぽい.
そのため,まずはEFIシステムパーティションをファイルとして作っておく.
# dd if=/dev/zero of=efiboot.img bs=1M count=30 # mkfs.vfat -F32 efiboot.img # mount efiboot.img /loop -o loop # cp -a EFI /loop # sync ; umount /loop
ちなみにEFI以下にはBOOTディレクトリがあって,その下に64ビット,32ビットそれぞれのブートローダと,grub.cfgが置いてある.
$ ls -R EFI EFI: BOOT/ EFI/BOOT: BOOTx64.efi bootia32.efi grub.cfg
実際にxorrisoに含まれているxorrisofsを使ってDVDイメージを作る際のオプションはこんな感じ.
xorrisofs -o ${ver}_${arch}_${dt}_dvd.iso \ -exclude-list plamo6-exclude-list \ -isohybrid-mbr /usr/share/syslinux/isohdpfx.bin \ -c isolinux/boot.cat \ -b isolinux/isolinux.bin \ -no-emul-boot \ -boot-load-size 4 \ -boot-info-table \ -eltorito-alt-boot \ -e efiboot.img \ -no-emul-boot \ -isohybrid-gpt-basdat \ -append_partition 2 0xef ./Plamo-6.x/${arch}/efiboot.img \ Plamo-6.x/${arch}
多くのオプションがmkisofsと同じだけれど,-isohybrid-mbrとか-e efibootimg とか -isohybrid-gpt-basdat とか --append_partition 2 0xef... あたりがツボっぽい.
特に --appenend_partition オプションが,DVDイメージのパーティションテーブルを操作して, 仮想的なUEFIシステムパーティションを作成するための指定で,これを指定することでDVDイメージをベタ書きしたUSBメモリからの起動でも, UEFI BIOSは仮想的なUEFIシステムパーティションを認識して,そこにあるブートローダを起動する,という流れになるらしい.
こうして作成したDVDイメージをUSBメモリにcatやddコマンドでベタ書きして, そのUSBメモリをfdisk -l すると,確かに仮想的なパーティションテーブルが見える.
$ sudo fdisk -l /dev/sdb ディスク /dev/sdb: 3.8 GiB, 4016046080 バイト, 7843840 セクタ 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト ディスクラベルのタイプ: dos ディスク識別子: 0x396eb5c0 デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ /dev/sdb1 * 0 6848511 6848512 3.3G 0 空 /dev/sdb2 6848512 6909951 61440 30M ef EFI (FAT-12/16/32)
ちなみに -append_partitionオプションで指定した0xefがパーティションIDの指定で, efというのがUEFI System partitionの意味らしい.
どうやら xorrisofs コマンドは -isohybrid-mbr オプションで指定する isohdpfx.bin と,-append_partitionの指定で,本来はISOイメージには存在しないパーティションを仮想的に設定し, そこにESPを置くことでUSBメモリにベタ書きしたDVDイメージからのUEFIブートを可能にしているらしい.
このあたりを確認して,これからはcdrtoolsではなくxorrisoだなぁ,,と, cdrtoolsのパッケージを削除してxorrisoのパッケージを追加し, get_pkginfo用のデータもxorrisoがcdrtoolsを引き継ぐような形に設定したのであった.