04 June 2013

FreeBSD にはあまり興味はなかったのですが、仕事の都合で FreeBSDをインストールすることになりました。

というわけで、 Linux の知識はあれども、FreeBSD の知識は皆無な状態からスタートして、インストールや環境設定などやっていきます。

今回はインストールするところまでやってみます。

インストールメディア入手

現時点では 9.1 が最新。
以下からインストールメディアを入手できる。
http://www.freebsd.org/ja/

FreeBSD-9.1-RELEASE-amd64-dvd1.iso をダウンロードしてきた。
(やたらと時間かかった。BitTorrentとかないのかね。)

入門中といいつつ、通常のインストーラーをいきなり無視します。(笑)
理由は RootFileSystem をZFSにしたいから。

やり方は以下のサイトで詳しく書かれているので、参考になります。
FreeBSD 9.1-RELEASE で ZFS Root FileSystem 環境を構築する

このサイトをかなり参考にしているのですが、自分は HDD 4台で RAID-Z (いわゆるRAID 5) で組んでみました。
HDD 1台だと ZFS を使う意味の大半がなくなってしまいますから。。

それから、不要な手順をいくつかはしょって自分流にアレンジしてます。

マシン(VirtualBox) 設定

マシンですが、VirtualBox を使っています。

SATA に HDDを4台、IDE に CD/DVDドライブを1台つなぎました。
CD/DVDドライブ も SATAにすると、インストールメディアからブートできませんでしたので。

VirtualBox settings

さらに、設定 → システム で 「ハードウェアクロックをUTCにする」にチェックを入れておきます。
FreeBSD は UTC で運用するので、これをチェックしておかないと、時刻が9時間ずれます。

以下の説明では、セットアップするマシンのホスト名は ernie とします。
余談ですが、自分の家ではホスト名に elmo, cookie, bigbird, oscar, zoe などと Sesame Street のキャラクター名を付けていっています。
一定のネーミングルールを決めておくと、ホスト名がどんどん増えても名前に困りません。

インストール開始

インストールメディアからブートさせます。

Welcome to FreeBSD の画面で 「1. Boot (Enter)」を選択。

インストーラーが起動するので

パーティションテーブル作成

シェルに入るので、ここからインストーラー無視して、自分でセットアップします。

/dev を見るとハードディスクは /dev/ada0, /dev/ada1, /dev/ada2, /dev/ada3 として認識されています。

この4台にパーティションを作るところから始めます。

以下のように、GUIDパーティションテーブルを作る。

# gpart create -s gpt ada0
ada0 created
# gpart create -s gpt ada1
ada1 created
# gpart create -s gpt ada2
ada2 created
# gpart create -s gpt ada3
ada3 created

パーティション作成

ブートパーティション、スワップ領域、ZFS領域を作成します。
raidz (いわゆる RAID5)にするので、4台とも同じ構造でパーティション作るのがわかりやすそうです。
ラベル名はかぶらないようにしましょう。

# gpart add -s 122 -t freebsd-boot -l ernie0_boot ada0
ada0p1 added
# gpart add -s 122 -t freebsd-boot -l ernie1_boot ada1
ada1p1 added
# gpart add -s 122 -t freebsd-boot -l ernie2_boot ada2
ada2p1 added
# gpart add -s 122 -t freebsd-boot -l ernie3_boot ada3
ada3p1 added
# gpart add -s 512m -t freebsd-swap -l ernie0_swap ada0
ada0p2 added
# gpart add -s 512m -t freebsd-swap -l ernie1_swap ada1
ada1p2 added
# gpart add -s 512m -t freebsd-swap -l ernie2_swap ada2
ada2p2 added
# gpart add -s 512m -t freebsd-swap -l ernie3_swap ada3
ada3p2 added
# gpart add -t freebsd-zfs -l ernie0_root ada0
ada0p3 added
# gpart add -t freebsd-zfs -l ernie1_root ada1
ada1p3 added
# gpart add -t freebsd-zfs -l ernie2_root ada2
ada2p3 added
# gpart add -t freebsd-zfs -l ernie3_root ada3
ada3p3 added
# gpart show
=>      34  33554365  ada0  GPT  (16G)
        34       122     1  freebsd-boot  (61k)
       156   1048576     2  freebsd-swap  (512M)
   1048732  32505667     3  freebsd-zfs  (15G)

=>      34  33554365  ada1  GPT  (16G)
        34       122     1  freebsd-boot  (61k)
       156   1048576     2  freebsd-swap  (512M)
   1048732  32505667     3  freebsd-zfs  (15G)

=>      34  33554365  ada2  GPT  (16G)
        34       122     1  freebsd-boot  (61k)
       156   1048576     2  freebsd-swap  (512M)
   1048732  32505667     3  freebsd-zfs  (15G)

=>      34  33554365  ada3  GPT  (16G)
        34       122     1  freebsd-boot  (61k)
       156   1048576     2  freebsd-swap  (512M)
   1048732  32505667     3  freebsd-zfs  (15G)

# gpart show -l
=>      34  33554365  ada0  GPT  (16G)
        34       122     1  ernie0_boot  (61k)
       156   1048576     2  ernie0_swap  (512M)
   1048732  32505667     3  ernie0_root  (15G)

=>      34  33554365  ada1  GPT  (16G)
        34       122     1  ernie1_boot  (61k)
       156   1048576     2  ernie1_swap  (512M)
   1048732  32505667     3  ernie1_root  (15G)

=>      34  33554365  ada2  GPT  (16G)
        34       122     1  ernie2_boot  (61k)
       156   1048576     2  ernie2_swap  (512M)
   1048732  32505667     3  ernie2_root  (15G)

=>      34  33554365  ada3  GPT  (16G)
        34       122     1  ernie3_boot  (61k)
       156   1048576     2  ernie3_swap  (512M)
   1048732  32505667     3  ernie3_root  (15G)

間違いがないことを確認して次に進みます。

ブートコードインストール

各ドライブの1番目のパーティション(freebsd-boot)にブートコードをインストール。
とりあえず全ドライブにブートコードを書いておけば、どれかぶっ壊れても起動できると思う。

# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
bootcode written to ada0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
bootcode written to ada1
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada2
bootcode written to ada2
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada3
bootcode written to ada3

ZFS 作成

zpool を作ります。 altroot は一時的なマウントポイントで、再起動するとこの情報は持ち越されない。

また、 /dev/ada0p2 のようにパーティションを指定すると、マウント順でドライブ番号が変わる可能性があるので、 一意に決まるラベルで指定するのがよいです。

cachefile を一時保存する領域を設けるため、 tmpfs をマウントしておく。

# mount -t tmpfs tmpfs /tmp
# zpool create -f -o altroot=/media -o cachefile=/tmp/zpool.cache rpool raidz \
/dev/gpt/ernie0_root /dev/gpt/ernie1_root /dev/gpt/ernie2_root /dev/gpt/ernie3_root
ZFS filesystem version 5
ZFS storage pool version 28
# zfs create rpool/root
# zfs create rpool/root/var
# zfs create rpool/root/home
# zpool set bootfs=rpool/root rpool
# zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
rpool             306K  45.3G  44.9K  /media
rpool/root        133K  45.3G  46.4K  /media/root
rpool/root/home  43.4K  45.3G  43.4K  /media/root/home
rpool/root/var   43.4K  45.3G  43.4K  /media/root/var

ちなみに、 zpool コマンドを実行した時に

ZFS filesystem version 5
ZFS storage pool version 28

というメッセージが出ていますが、これは zfs module が自動的にロードされているからです。

pool 直下にもファイルは作れるが、やらないほうがいいそうです。
なので、以下のようにする。

# zfs set mountpoint=none rpool
# zfs set mountpoint=/ rpool/root
# zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
rpool             317K  45.3G  44.9K  none
rpool/root        133K  45.3G  46.4K  /media
rpool/root/home  43.4K  45.3G  43.4K  /media/home
rpool/root/var   43.4K  45.3G  43.4K  /media/var

インストールメディアから展開

# tar xzpf /usr/freebsd-dist/base.txz -C /media/
# tar xzpf /usr/freebsd-dist/kernel.txz -C /media/
# tar xzpf /usr/freebsd-dist/ports.txz -C /media/
# tar xzpf /usr/freebsd-dist/src.txz -C /media/
# tar xzpf /usr/freebsd-dist/doc.txz -C /media/

設定ファイル作成

自力で設定ファイルを作っていきます。 vi などで以下のように記述します。

/media/boot/loader.confを作って以下のように記載

zfs_load="YES"
vfs.root.mountfrom="zfs:rpool/root"

/media/etc/rc.confを作って以下のように記載

zfs_enable="YES"
keymap="jp.106.kbd"

/media/etc/fstabを作って以下のように記載

# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/ada0p2     none            swap    sw      0       0
/dev/ada1p2     none            swap    sw      0       0
/dev/ada2p2     none            swap    sw      0       0

キャッシュファイルをコピー

# cp /tmp/zpool.cache /media/boot/zfs/
# zpool set cachefile="" rpool

最終チェック(いちおう)

ZFSで起動できるかチェックするスクリプトがあるらしいので、インストールして実行する。

# cd /media/usr/src/tools/tools/zfsboottest
# make
# make DESTDIR=/media install
install -s -o root -g wheel -m 555   zfsboottest /media/usr/bin
install -o root  -g wheel -m 555  zfsboottest.sh  /media/usr/bin/zfsboottest.sh
# env PATH=$PATH:/media/usr/bin zfsboottest.sh rpool
The "mountpoint" property of dataset "rpool/root" should be set to "legacy".

どうも、 rpool/root のマウントポイントを / から legacy に変更せよ、と言っています。
ZFS は標準では、 /etc/fstab を使わないのですが、 legacy というのは、従来通り /etc/fstab で管理するモードのこと。

で、せっかくの忠告ですが、無視します。(笑)
最初は忠告にしたがって、 zfs set mountpoint=legacy rpool/root とかやっていたのですが、別にやらなくても問題なく起動できることがわかったので。
忠告無視して、そのまま電源OFFします。

# sync
# halt -p

インストール完了、そして再起動

CD/DVDドライブからインストールメディアを取り除いて、起動します。
さて、本当に起動するか、ドキドキですが。。無事起動しました。

ZFS が期待通りか確認。

# zfs get mountpoint
NAME             PROPERTY    VALUE      SOURCE
rpool            mountpoint  none       local
rpool/root       mountpoint  /          local
rpool/root/home  mountpoint  /home      inherited from rpool/root
rpool/root/var   mountpoint  /var       inherited from rpool/root
# zfs get mounted
NAME             PROPERTY  VALUE      SOURCE
rpool            mounted   no        -
rpool/root       mounted   yes/       -
rpool/root/home  mounted   yes        -
rpool/root/var   mounted   yes        -

swap 領域を確認してみる。

# pstat -s
Device          1K-blocks     Used    Avail Capacity
/dev/ada0p2        524288        0   524288     0%
/dev/ada1p2        524288        0   524288     0%
/dev/ada2p2        524288        0   524288     0%
Total             1572864        0  1572864     0%

大丈夫そう。

次回、設定をしていきます。



blog comments powered by Disqus