はじめに
第15回FreeBSD勉強会へ行ってきましたのでそのまとめです。
理解できていなかった部分や聞き取れなかった部分等は後で調べたりして記載していますが、誤りなどがあれば申し訳ありません。
勉強会の概要
FreeBSDに限った話ではないと思いますが、Unix/Linux系OSの多くはインストーラを利用してインストールを行うことが多いと思います。インストーラはディスクのパーティショニング、kernel等各種ファイルの展開,その他基本的な初期設定などを代替で行ってくれるものですが、その裏ではコマンドを実行してこれらの処理を実行しているだけであり,インストーラを使わなくてもFreeBSDをインストールすることができます。
今回の勉強会では、FreeBSDのインストーラが実施している内容やブートの仕組みについての解説、実際にインストーラを使わない方法でのFreeBSDのインストールを実演していただき、FreeBSDのインストールの仕組みを理解しよう、というものでした。
インストーラとその役割
まずは、FreeBSDのboot(起動)処理の仕組みについてのお話でした。
インストーラの役割
インストーラは以下のことを実行するための手助けをしてくれます。これらは処理としては設定を行うためのコマンドが裏で実行されているだけです。
- インストールメディアから、OSを起動するためのプログラムをディスクの決められた場所に配置する
- ファイルシステムを作成する
- ファイルシステムに必要な配布物/ソフトウェア類をコピーする
- その他必要なOS初期設定を行う
FreeBSDのboot処理
FreeBSDのboot処理についてのお話です。
MBRによるboot処理
- BIOSがboot0を読み込む。
- HWに搭載されているBIOSと呼ばれるプログラムがHDDの先頭512バイトを読み込んで実行する。
- HDDの先頭512バイトはboot0と呼ばれるブートローダプログラムが書き込まれており、これが呼び出される。MBRに相当する。
- boot0はboot1を読み込む。
- boot0はboot1を検索し実行するためのプログラム。boot1/2はファイルシステムの外のディスクの決まった位置にあるためboot0はそこを読みに行く。
- boot1はboot2を読み込む。
- boot1はboot2を検索し実行するためのプログラム。boot1は512バイトのサイズである必要があるという制約があり、boot2と分かれている。
- boot2はloaderを起動する。
- boot2はUFS上の/boot/loaderを検索して起動するプログラム。UFSファイルシステムを認識することができる。
- loaderは起動オプションに従ってkernelをロードする。
- kernelはデバイスやドライバの認識/初期化し、デバイスツリーを作成する。
- initを実行する。
BIOS → MBR(boot0) → boot1 → boot2 → /boot/loader → kernel → init
---- ---------- -------------- ------------------------------
BIOS MBR 起動セクタ UFSパーティション
※boot0/1/2はファイルシステムの外側にある
MBRでは2TBを越えるディスクを管理できない(HDDの1セクタ512バイトの場合(512バイト×4バイト(=2の32乗(LBA(Logical Block Addressing)でアクセスできるセクタ数の上限)))という問題があり、昨今の大容量化するディスクに対応できません。そこで新たな規格としてGPTが出てきました。
さらに、FreeBSDではFreeBSD 9.0からGPTが正式にサポートされました。そのため、今後ブートの規格はMBRではなくGPTへ移行され、GPT化に伴って、従来のBIOSからGPTをサポートしている新しいBIOSであるUEFI(Unified Extensible Firmware Interface)へ移行される予定とのことです。
- GPTでは、最大8ZB迄の領域を管理できる。
- MBRは512Bの領域を必要とする。4パーティションまでしか扱えない。GPTは17kBの領域を必要とする。128パーティションまで扱える。
- GPTヘッダーとパーティションテーブルはディスクの先頭と最後部の両方に書き込まれている。
- UEFIはFreeBSDではまだ未対応であり、今後開発が進められていく予定(UFS2に対応できていない)
※補足
GPTによるboot処理
- BIOSがpmbrを読み込む。
- pmbrはFreebsd-bootパーティションを読み込み、そこにあるgptbootを実行する。
- gptbootはfreebsd-ufsパーティションを読み込み、UFSファイルシステム上の/boot/loaderを実行する。
- loaderは起動オプションに従ってkernelをロードする。
- kernelはデバイスやドライバの認識/初期化し、デバイスツリーを作成する。
- initを実行する。
BIOS → pmbr → gptboot → /boot/loader → kernel → init
---- ---- ------------ ------------------------------
BIOS GPT freebsd-boot freebsd-ufs
PMBR(Protective Master Boot Record)
- GPTで利用されるブートローダ。BIOS/UEFIから実行可能。現在のFreeBSDではBIOSからboot0/1/2と同じような形で必要なファイルを読み込み、起動している。
- freebsd-bootパーティションを探し出し、gptbootを実行する。
- MBRの場合と比べて起動時の処理が一つ減る。
インストーラとコマンドの対応
インストーラが裏で実際に行っていることは、以下のように設定に必要なコマンドを実行しているだけであり、インストーラを使わずともコマンドを実行していくことでFreeBSDをインストールすることができます。実演された内容の一部を記載します。
- キーマップの選択
% kbdmap = printf 'keymap="jp.106.kbd"\n' >> /etc/rc.conf
※単にkbdmapコマンドを実行すると、キーボード設定用のコンソール画面が起動して設定できるので便利とのことでした。
GPTパーティション作成
% gpart create -s gpt /dev/da0
1番目のスライスにfreebsd-bootパーティション作成
% gpart add -s 64K -b 34 -t freebsd-boot -l /boot/boot0 /dev/da0
3番目のスライスにfreebsd-swapパーティション作成
%gpart add -s 1G -t freebsd-swap -l swap0 /dev/da0
※ディスクフォーマット
% newfs -U /dev/デバイス名
% printf '********' | pw usermod -n root -h 0※adduserなどのインタラクティブなコマンドを使うより、"pw usermod"/"pw useradd"などを使う方がスクリプト化しやすく便利のようです。
% tzsetup Asia/Tokyo
% printf 'dumpdev="AUTO"\n' >> /etc/rc.conf
% dumpon /dev/ada0p3
% ln -sf /dev/ada0p3 /dev/dumpdev
これらインストーラと同じ処理を行うコマンドを利用することで、インストール処理をスクリプトで自動化できるということです。
また、上記でechoではなくprintfを利用しているのは、echoはPOSIXに準拠されていないためのようで、移植性を考えるとprintfを利用した方が良いとのことです。
その他
- AsiaBSDCon 2013
- CloudCore VPS|KDDIウェブコミュニケーションズ
講師の後藤大地様よりAsiaBSDCon 2013のお知らせです。なお、スポンサーとして500万以上出すとG○○gle様より上に名前が載るそうです。
おわりに
次回のFreeBSD勉強会では今回の内容を絡めた内容となるようですね。
カスタマイズした自分だけのFreeBSD LiveUSBメモリスティックを作りたい方は、今回のFreeBSD勉強会の内容も聞いておいた方がよいかと思います atnd.org/events/35877
— Daichi GOTOさん (@daichigoto) 2013年2月22日
初心者向けということでインストーラについてやboot処理、インストール処理の大枠は理解できたような気がしていますが、もっと実際にいろいろ触ってみたりマニュアルページに目を通したり以下の本を読み込むなどして理解を深めたいと思います。 最後になりましたが、関係者の皆様、このような機会を提供いただきまして誠にありがとうございました。