FreeBSD 8.1 on ZFS-boot

前回の記事があまりにも適当だったので、もう少し詳しく書いてみる。


メモリ 8G 積むので、amd64 版の FreeBSD-8.1-RELEASE をインストールすることに。
それ以外の方針としては、

  • /usr/home は root とは違うプールにする
  • プールはすべて mirror で作成
  • xorg-minimal と gnome2-lite を使う
  • 実機にインストールするので Guest Additions は入れない

といったところ。

FreeBSD インストール

インストール disk から起動し、sysinstall が実行されたら国とキーマップを選択する。
Main Menu では、普通にインストールする場合に選ぶ「Standard」ではなく、「Fixit」を選択する。


するとコンソールに切り替わるので FreeBSD Wiki を参考にインストールを行う。


というわけで早速インストール。
参考:http://wiki.freebsd.org/RootOnZFS/GPTZFSBoot/Mirror

ZFS ファイルシステムの作成

まず、ディスクに GPT 領域を作成する。

# gpart create -s gpt ad10
# gpart create -s gpt ad12

自分の場合、ディスクを ad10 と ad12 として認識していたので、これらのディスクに GPT 領域を作成する。
ディスク番号は dmesg の中に出てくるらしいので、「dmesg | grpe ad」なんかで調べられると思う。


次にパーティションを作成する。

# gpart add -b 40 -s 64k -t freebsd-boot ad10
# gpart add -s 16G -t freebsd-swap -l swap0 ad10
# gpart add -s 64G -t freebsd-zfs -l disk00 ad10
# gpart add -t freebsd-zfs -l disk01 ad10

# gpart add -b 40 -s 64k -t freebsd-boot ad12
# gpart add -s 16G -t freebsd-swap -l swap1 ad12
# gpart add -s 64G -t freebsd-zfs -l disk10 ad12
# gpart add -t freebsd-zfs -l disk11 ad12

大容量ディスクの場合、パーティションの開始位置は 8 の倍数にしておかないとパフォーマンスが落ちるというのをどこかで見たので
最初のパーティションは 40 セクタからにした。
GPT 領域のサイズは 34 セクタらしいので、最初のパーティションの開始位置を 40 セクタにしてしまうと微妙に空きができてしまうけど、たかだか数KBをケチる理由もないのでパフォーマンス優先ということで。


スワップはとりあえず物理メモリの 2 倍確保。
「disk?0」は / をマウントするプール用、「disk?1」はホームディレクトリをマウントするプール用にする。


続いて、Protected MBR (pmbr) と gptzfsboot loader をインストールするらしい。
この辺りからしばらく wiki のコピペが続く。

# gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad10
# gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad12


ZFS カーネルモジュールのロード。

# kldload /mnt2/boot/kernel/opensolaris.ko
# kldload /mnt2/boot/kernel/zfs.ko


ようやく zpool の作成。

# mkdir /boot/zfs
# zpool create zroot mirror /dev/gpt/disk00 /dev/gpt/disk10
# zpool set bootfs=zroot zroot

# zpool create tank mirror /dev/gpt/disk01 /dev/gpt/disk11

zroot に / を、tank にホームディレクトリ(/usr/home) をマウントする。

ZFS ファイルシステムFreeBSD インストール

wiki ではチェックサムを fletcher2 から fletcher4 に変更しているのでそれに倣う。

# zfs set checksum=fletcher4 zroot
# zfs set checksum=fletcher4 tank

あとは wiki を見ながら各ディレクトリを作成していく。
ただし、そこまで容量に困っているわけではないので圧縮は有効にしなかった。

# zfs create -o exec=on -o setuid=off zroot/tmp
# chmod 1777 /zroot/tmp
# zfs create zroot/usr
# zfs create tank/usr/home
# cd /zroot
# ln -s /usr/home home

/usr/home を tank に作ることを忘れずに。

# zfs create -o setuid=off zroot/usr/ports
# zfs create -o exec=off -o setuid=off zroot/usr/ports/distfiles
# zfs create -o exec=off -o setuid=off zroot/usr/ports/packages
# zfs create -o exec=off -o setuid=off zroot/usr/src
# zfs create zroot/var
# zfs create -o exec=off -o setuid=off zroot/var/crash
# zfs create -o exec=off -o setuid=off zroot/var/db
# zfs create -o exec=on  -o setuid=off zroot/var/db/pkg
# zfs create -o exec=off -o setuid=off zroot/var/empty
# zfs create -o exec=off -o setuid=off zroot/var/log
# zfs create -o exec=off -o setuid=off zroot/var/mail
# zfs create -o exec=off -o setuid=off zroot/var/run
# zfs create -o exec=on  -o setuid=off zroot/var/tmp
# chmod 1777 /zroot/var/tmp


ディレクトリを作り終わったらようやくインストール。

# cd /dist/8.1-RELEASE
# export DESTDIR=/zroot
# for dir in base catpages dict doc games info lib32 manpages ports; \
    do (cd $dir ; ./install.sh) ; done
# cd src
# ./install.sh all
# cd ../kernels
# ./install.sh generic
# cd /zroot/boot
# cp -Rlp GENERIC/* /zroot/boot/kernel/


なぜかこのタイミングで /var/empty を readonly に。

# zfs set readonly=on zroot/var/empty


zroot に対して設定を行うので chroot

# chroot /zroot


/etc/rc.conf を作成して以下を追加。

zfs_enable="YES"
hostname="beastie.mydomain.local"
ifconfig_re0="DHCP"
keymap="jp.106"
sshd_enable="YES"
sendmail_enable="NONE"

ホスト名は適当に読み替えること。
sendmail はデスクトップ用途ではどうせ使わないので無効に。


/boot/loader.conf を作成して以下を追加。

zfs_load="YES"
vfs.root.mountfrom="zfs:zroot"


root のパスワードとタイムゾーンの変更。

# passwd
# tzsetup


メールは使わないんだけど、とりあえず /etc/mail/aliases.db の作成。

# cd /etc/mail
# make aliases


chroot から脱出。

# exit


できた zpool.cache を zfs ファイルシステムへインストール。

# cp /boot/zfs/zpool.cache /zroot/boot/zfs/
インストール作業の落ち穂拾い

それぞれのディスクに swap 領域を作ったので、今のところ swap が 2 つあることになる。
それを使う方法としては 1. 両方の領域を fstab に指定する、2. gmirror(geom_mirror) を使う の 2 通りがあるらしい。
あまりモジュールをロードしたくなかったので、今回は 1. の方法を取ることにした。

/zroot/etc/fstab を作成して以下を追加。

# Device                       Mountpoint              FStype  Options         Dump    Pass
/dev/gpt/swap0                 none                    swap    sw              0       0
/dev/gpt/swap1                 none                    swap    sw              0       0


マウントポイントを指定。

# export LD_LIBRARY_PATH=/mnt2/lib 
# zfs unmount -a
# zfs set mountpoint=legacy zroot
# zfs set mountpoint=/tmp zroot/tmp
# zfs set mountpoint=/usr zroot/usr
# zfs set mountpoint=/var zroot/var
# zfs set mountpoint=/usr/home tank/home

tank のマウントポイントも忘れずに指定する。


後は Fixit を抜けて再起動すればインストール完了。

# exit

ports 更新

ここは前回同様、/etc/portsnap.conf を以下のように修正。

修正前
  SERVERNAME=portsnap.FreeBSD.org
  …
  #REFUSE arabic chinese french german hebrew hungarian japanese
  #REFUSE korean polish portuguese russian ukrainian vietnamese

修正後
  SERVERNAME=portsnap.allbsd.org
  …
  REFUSE arabic chinese french german hebrew hungarian
  REFUSE korean polish portuguese russian ukrainian vietnamese


そして更新。

# portsnap fetch extract update

portsupgrade インストール

# cd /usr/ports/ports-mgmt/portupgrade
# make install clean

bash インストール

# portinstall shells/bash

root のシェルを変更する。

# chsh -s /usr/local/bin/bash

ここでシェルを bash に切り替えるため、一旦ログアウトして再度ログオン。

# exit

一般ユーザ追加

bash も入れたので、sysintall で一般ユーザを追加する。

# sysintall

[Configure]→[User Management]→[User]

Login ID は適当に。
Group は wheel にしておくと後々楽かも。
Home directory は指定しないと /home/ユーザ名 になるので、/usr/home/ユーザ名 にしておく。
Login Shell は /usr/local/bin/shell にする。


一般ユーザの PATH には sbin 系のディレクトリが含まれていないので、.bashrc でパスに追加する。

/usr/home/ユーザID/.bashrc に以下を追加

export PATH=/sbin:/usr/sbin:/usr/local/sbin:$PATH


いちいち su をするのも面倒なので、sudo を入れることに。

# portinstall security/sudo


sudo を一般ユーザが使えるようにする。

# visudo

「## Uncomment to allow members of group wheel to execute any command」の次の行のコメントアウトを外す。

編集前
## Uncomment to allow members of group wheel to execute any command
# %wheel ALL=(ALL) ALL

編集後
## Uncomment to allow members of group wheel to execute any command
%wheel ALL=(ALL) ALL

Xorg インストール

試しに xorg-minimal を入れてみた。

# export BATCH=yes
# portinstall x11/xorg-minimal


/etc/rc.conf に以下を追加。

hald_enable="YES"
dbus_enable="YES"


Xorgの設定 (X11の設定- FreeBSD ハンドブック)。

# Xorg -configure
# Xorg -config /root/xorg.conf.new -retro

黒とグレーのグリッドと X のマウスポインタが現われればOK。
Ctrl+Alt+F1 でコンソールを切り替え、Ctrl+C で X を終了させる。

うまくいかないときは、切り替え後のコンソールに「(EE)」が出力されていないか確認し、エラーの原因を取り除く。


うまくいったらこの設定ファイルをコピーする。

# cp /root/xorg.conf.new /etc/X11/xorg.conf

gnome インストール

gnome も gnome2 じゃなくて gnome2-lite を試してみた。

# portinstall x11/gnome2-lite


/etc/rc.conf に以下を追加。

gnome_enable="YES"


そのままだと gdm のログインプロンプトで固まってしまうので、procfs をマウントするようにする。
参考:

/etc/fstab に以下を追加。

proc           /proc       procfs  rw  0   0


もしかしたら不要かもしれないけど、一応 .xinitrc も用意しておく。
/root/.xinitrc と /usr/home/.xinitrc に以下を追加。

export LANG="ja_JP.UTF-8"
exec gnome-session

ドライバ設定

xorg-minimal と gnome2-lite では nvidia のドライバが自動的にインストールされないので手動でインストールしてやる必要がある。
ついでに nvidia-xconfig と nvidia-settings もインストール。

# portinstall x11/nvidia-driver
# portinstall x11/nvidia-xconfig
# portinstall x11/nvidia-settings


起動時に nvidia ドライバを読み込むように設定する。
/boot/loader.conf に以下を追加。

nvidia_load="YES"


で、xorg.conf の書き換え。

# nvidia-xconfig

指示に従って操作すると /etc/x11/xorg.conf が書き換わると思う。


ディスプレイドライバ以外に、サウンドドライバも有効化してやる必要がある。
(参考:FreeBSDサウンドドライバ判定 - 努力したWiki)

# kldload snd_driver
# cat /dev/sndstat

出力内容からどのサウンドドライバが使われているか判断する。


例えば、以下の例の場合、hda ドライバが使われていることが分かる。

# cat /dev/sndstat
FreeBSD Audio Driver (newpcm: 64bit 2009061500/amd64)
Installed devices:
pcm0:  (play/rec) default
pcm1:  (play)
pcm2:  (play)


あとはそのサウンドドライバを起動時に読み込むように設定する。
/boot/loader.conf に以下を追加。

snd_hda_load="YES"


そしてここでようやく再起動。

# reboot


gnome が起動すれば成功。

firefox インストール

3.6 以降でも構わないので、www/firefox をインストール。

# portinstall www/firefox


Flash もインストール。
(参考:Web ブラウザ - FreeBSD ハンドブック)


まずは Linux 互換機能をインストール。

# portinstall emulators/linux_base-f10


インストールされたモジュールをロードしておく。

# kldload linux


ついでに起動時に読み込むようにしておく。
/etc/rc.conf に以下を追加。

linux_enable="YES"


残りのインストール。

# portinstall www/nspluginwrapper
# portinstall www/linux-f10-flashplugin10
# ln -s /usr/local/lib/npapi/linux-f10-flashplugin/libflashplayer.so /usr/local/lib/browser_plugins/


linprocfs をマウントする。

# mount -t linprocfs linproc /usr/compat/linux/proc

ついでに fstab にも以下を追加。

linproc    /usr/compat/linux/proc  linprocfs   rw  0   0


各ユーザごとにプラグインをインストール。

$ nspluginwrapper -v -a -i


後は使っていく中で足りないものを入れていけばいいかと。