dshimizu/blog

アルファ版

第15回 FreeBSD勉強会へ行ってきました

はじめに

第15回FreeBSD勉強会へ行ってきましたのでそのまとめです。
理解できていなかった部分や聞き取れなかった部分等は後で調べたりして記載していますが、誤りなどがあれば申し訳ありません。

勉強会の概要

FreeBSDに限った話ではないと思いますが、Unix/Linux系OSの多くはインストーラを利用してインストールを行うことが多いと思います。インストーラはディスクのパーティショニング、kernel等各種ファイルの展開,その他基本的な初期設定などを代替で行ってくれるものですが、その裏ではコマンドを実行してこれらの処理を実行しているだけであり,インストーラを使わなくてもFreeBSDをインストールすることができます。
今回の勉強会では、FreeBSDインストーラが実施している内容やブートの仕組みについての解説、実際にインストーラを使わない方法でのFreeBSDのインストールを実演していただき、FreeBSDのインストールの仕組みを理解しよう、というものでした。

インストーラとその役割

まずは、FreeBSDのboot(起動)処理の仕組みについてのお話でした。

FreeBSDインストーラ

FreeBSDインストーラには以下の2つがあります。

インストーラの役割

インストーラは以下のことを実行するための手助けをしてくれます。これらは処理としては設定を行うためのコマンドが裏で実行されているだけです。

  • インストールメディアから、OSを起動するためのプログラムをディスクの決められた場所に配置する
  • ファイルシステムを作成する
  • ファイルシステムに必要な配布物/ソフトウェア類をコピーする
  • その他必要なOS初期設定を行う
FreeBSDのboot処理

FreeBSDのboot処理についてのお話です。

MBRによるboot処理

  1. BIOSがboot0を読み込む。
    • HWに搭載されているBIOSと呼ばれるプログラムがHDDの先頭512バイトを読み込んで実行する。
    • HDDの先頭512バイトはboot0と呼ばれるブートローダプログラムが書き込まれており、これが呼び出される。MBRに相当する。
  2. boot0はboot1を読み込む。
    • boot0はboot1を検索し実行するためのプログラム。boot1/2はファイルシステムの外のディスクの決まった位置にあるためboot0はそこを読みに行く。
  3. boot1はboot2を読み込む。
    • boot1はboot2を検索し実行するためのプログラム。boot1は512バイトのサイズである必要があるという制約があり、boot2と分かれている。
  4. boot2はloaderを起動する。
    • boot2はUFS上の/boot/loaderを検索して起動するプログラム。UFSファイルシステムを認識することができる。
  5. loaderは起動オプションに従ってkernelをロードする。
  6. kernelはデバイスやドライバの認識/初期化し、デバイスツリーを作成する。
  7. initを実行する。

  8. BIOSMBR(boot0) → boot1 → boot2 → /boot/loader → kernel → init
    ---- ---------- -------------- ------------------------------
    BIOS MBR 起動セクタ UFSパーティション
    ※boot0/1/2はファイルシステムの外側にある

GPTとUEFIの特徴とFreeBSDの対応

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によるboot処理

  1. BIOSがpmbrを読み込む。
  2. pmbrはFreebsd-bootパーティションを読み込み、そこにあるgptbootを実行する。
  3. gptbootはfreebsd-ufsパーティションを読み込み、UFSファイルシステム上の/boot/loaderを実行する。

  4. BIOS → pmbr → gptboot → /boot/loader → kernel → init
    ---- ---- ------------ ------------------------------
    BIOS GPT freebsd-boot freebsd-ufs
  5. loaderは起動オプションに従ってkernelをロードする。
  6. kernelはデバイスやドライバの認識/初期化し、デバイスツリーを作成する。
  7. initを実行する。

PMBR(Protective Master Boot Record)

インストーラとコマンドの対応

インストーラが裏で実際に行っていることは、以下のように設定に必要なコマンドを実行しているだけであり、インストーラを使わずともコマンドを実行していくことで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
  • ダンプデータの保存先をswapデバイスに設定
  • % printf 'dumpdev="AUTO"\n' >> /etc/rc.conf
    % dumpon /dev/ada0p3
    % ln -sf /dev/ada0p3 /dev/dumpdev

これらインストーラと同じ処理を行うコマンドを利用することで、インストール処理をスクリプトで自動化できるということです。
また、上記でechoではなくprintfを利用しているのは、echoはPOSIXに準拠されていないためのようで、移植性を考えるとprintfを利用した方が良いとのことです。

その他

おわりに

次回のFreeBSD勉強会では今回の内容を絡めた内容となるようですね。

初心者向けということでインストーラについてやboot処理、インストール処理の大枠は理解できたような気がしていますが、もっと実際にいろいろ触ってみたりマニュアルページに目を通したり以下の本を読み込むなどして理解を深めたいと思います。

最後になりましたが、関係者の皆様、このような機会を提供いただきまして誠にありがとうございました。