[[diary/Kojima]]

・xorriso(その2)

xorrisoのドキュメントを読んでみると,xorrisoはcdrtools/mkisofsを参考にしてはいるものの,
独自のSCSI操作用ライブラリを利用するcdrtoolsとは異なり,
[[libburniaプロジェクト:http://libburnia-project.org/]]が開発した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を引き継ぐような形に設定したのであった.
- データアーカイブ用途に,ブートしないisoを作って焼くユーザなら,現状のcdrtoolsパッケージで必要十分だし,cdrtoolsパッケージには,iso9660イメージをダンプ・検証するコマンドもあるので,cdrtoolsパッケージを残したまま,xorrisoパッケージを追加して,両パッケージを共存させたいところ。cdrtoolsパッケージのコマンドをバックエンドとして利用しているソフトウェアもありそう。xorrisoパッケージが,cdrtoolsパッケージのコマンドを包含して,上位互換になっているなら,パッケージを交換するので良いでしょうけど,そうはなってないようなので。 -- [[tamu]] &new{2016-07-29 (金) 21:44:12};
- xorriso -as cdrecord(= xorrecord) とか xorriso -as mkisofs みたいなオプションがあるので、上位互換になってるように思ふ > xorriso -- [[kojima]] &new{2016-07-30 (土) 12:40:32};
- ほほう,そういうオプションがあるんですね。上手くエイリアスを仕込めば,cdrtoolsパッケージのコマンドと共存できるかも。 -- [[tamu]] &new{2016-07-30 (土) 14:28:18};
- cdrtoolsはビルドシステムに癖がありすぎだし、sg.oモジュールをインストールしないと動作しないとかあれこれ面倒なんで、使わずに済むならそうしたかったんだよなぁ。元々がSolaris用のSCSIライブラリ由来のせいか、最近のソフトウェアとは考え方も作りもだいぶ違うので。 -- [[kojima]] &new{2016-07-30 (土) 19:42:18};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS