diary/Kojima

・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を引き継ぐような形に設定したのであった.



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:43