2016-10-07

FreeBSD-10.3-RELEASE-i386-memstick.imgの構造

dynabook SS SX/15AがUSBメモリから起動できることが分かりましたが、そうであるならFreeBSD/i386のイメージをUSBメモリに書いたものが起動できないのは何故なのでしょうか。FreeBSD-10.3-RELEASE-i386-memstick.imgの構造を著名なバイナリエディタであるHxDで調べてみました。

このイメージはGPTでパーティションを切ったディスクイメージになっていることが分かりました。
  • 最初のセクタはMBRとの互換性があります。MBRの4つのパーティションのうちGPTでは1つだけ使って残りを未使用としておくのが流儀のようです。
  • パーティションタイプにEE(GPT protective MBR)が入っており、パーティションのセクタ数は1,350,917だったので659MBという事になります。
  • セクタ1はGPTヘッダ情報です。パーティションの1エントリあたりのバイト数は128でした。ということは、1セクタには4エントリが格納できます。よく言われているのが「GPTでは128エントリまで扱える(だからMBRの4エントリよりも圧倒的に多い)」 ということですが、このディスクイメージは汎用性を求める必要はないと割り切っており、パーティションエントリ数には4が指定されていました。これによりパーティションエントリに必要なセクタ数は1つだけで済みます。
  • セクタ2にパーティションエントリが格納されいて、実際に使われているのは3つでした。
  • 最初にエントリはFreeBSD Boot partitionのGUIDが指定されていて、割り当てられている容量は16Kでした。
  • 2番目のエントリはFreeBSD UFS partitionで、容量は674,416Kでした。
  • 3番目のエントリはFreeBSD Swap partitionで、容量は1,024Kとなっていました。

従来のMBRを使った場合のFreeBSDのブートプロセスでは、MBRにあるboot0がboot1を呼び出し、さらにboot2からloaderへと制御が移っていきます。ところがGPTを使うとMBRにはpmbrが格納されます。pmbrはFreeBSD Boot partitionを探し、そこに入っているファイルを(内容の確認をせず)メモリにロードして制御を移そうとします。インストールができていれば、そこにはgptboot(8)があるはずですが、細かいことを言うとpmbrではその確認をしていません。

FreeBSD Handbookでは「12.2. FreeBSD Boot Process」で次のように書かれています。
 Note:  FreeBSD provides for booting from both the older MBR standard, and the newer GUID Partition Table (GPT). GPT partitioning is often found on computers with the Unified Extensible Firmware Interface (UEFI). However, FreeBSD can boot from GPT partitions even on machines with only a legacy BIOS with gptboot(8). Work is under way to provide direct UEFI booting.
将来的にはUEFIなマシンでGPT起動をおこなう方向のようですが、現時点ではBIOSしかない旧いPCの存在を無視できないと思うので、そのようなマシンでもGPTで起動できるような仕組みにしているようです。

以上の調査により、このイメージをUSBメモリに書き込めばdynabook SS SX/15AでもFreeBSD/i386が起動できるはずだと思います。ところが起動できずエラーになってしまうわけなので、何が障害になっているのか調べてみようと思います。

調査してみれば、その過程の中で多くの知見が得られるでしょう。そしてFreeBSD/i386のインストールができるようになれば万々歳です。反対に意外に手強く解決には至らなかったとしたら、従来どおりMBRでパーティションを切ってbsdlabelでディスクを構成すれば良いでしょう。

0 件のコメント:

コメントを投稿