Seishi Ono's blog

Fugaces labuntur anni. 歳月人を待たず

さくらのクラウドで ZFS RAID5 in FreeBSD-9.0

お盆休みの暇つぶしに、未だベータテスト中のさくらのクラウドを利用してFreeBSD9.0を使ってZFSを構築してみた。基本的には以下の Dan's ブログを参照したのだが、それだけではほんのわずかに足りず、悩んだところがあったので、自分自身のメモとして記録しておこう。

Dan's Blog "Booting from ZFS RAID0/1/5/6 in FreeBSD 9.0-RELEASE"

さくらのクラウドを購入

さくらのクラウドでは以下のものを借りた。ZFSはメモリの制約があるので、気をつけないと少しはまる。

  • サーバ:2cpu メモリ 6GB*1
  • ディスク: 20GB × 3台

有償化された暁にはそれなりのお値段となる構成である*2

DVDからの起動

さくらのクラウドでは、インストールDVDが選択できるので、FreeBSD-9.0の64ビット版を選択する。

  1. インストールDVDから起動して、[Install]を選択する。*3
  2. 次の画面で[Shell]を選択する。*4

gpartでの作業

ここから、shellでの作業となる。

まっさらなディスクで無ければ、初期化作業を行っておく。*5

gpart destroy -F ada0
gpart destroy -F ada1
gpart destroy -F ada2

新たにgpartで領域を作成する*6

gpart create -s gpt ada0
gpart create -s gpt ada1
gpart create -s gpt ada2

boot領域を作成する

gpart add -s 128 -t freebsd-boot ada0
gpart add -s 128 -t freebsd-boot ada1
gpart add -s 128 -t freebsd-boot ada2

ここで、残りの領域の全てをZFAにして、デバイスを作成しておく。*7

gpart add -t freebsd-zfs -l disk0 ada0
gpart add -t freebsd-zfs -l disk1 ada1
gpart add -t freebsd-zfs -l disk2 ada2

ブートコードを書き込む

gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada2

gpartでの作業はここで終わる。

ZFSの設定

ZFSのカーネルモジュールを読み込む

kldload opensolaris
kldload zfs

ここでZFSプールを作るのだが、

zpool create -f zroot raidz1 /dev/gpt/disk0 /dev/gpt/disk1 /dev/gpt/disk2

インストールディスク上なので、rootが書き込み不可となっているため失敗する。しかしそのまま強行する。*8
よって構わずbootfsの設定をする。

zpool set bootfs=zroot root

ここで、ramdisk上にファイルシステムを一つ作り、それを/mntなどに割り当てる。

mdconfig -a -t malloc -s 128m -u 2
newfs -O2 /dev/md2
mount /dev/md2 /mnt

晴れてzrootをマウントして書き込みができるようになる。

zfs set mountpoint=/mnt zroot
zfs mount zroot

zfsの一連の設定を行う*9

zfs set checksum=fletcher4 root
zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp
chmod 1777 /mnt/tmp
zfs create zroot/usr
zfs create zroot/usr/home
cd /mnt; ln -s /usr/home home
zfs create -o compression=lzjb -o setuid=off zroot/usr/ports
zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
zfs create zroot/var
zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash
zfs create -o exec=off -o setuid=off zroot/var/db
zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg
zfs create -o exec=off -o setuid=off zroot/var/empty
zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail
zfs create -o exec=off -o setuid=off zroot/var/run
zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp
chmod 1777 /mnt/var/tmp

これで、ZFSの設定がほぼ終了する。

FreeBSDインストール

ここからは、FreeBSDのインストール作業になる。

cd /mnt
unxz -c /usr/freebsd-dist/base.txz | tar xpf -
unxz -c /usr/freebsd-dist/kernel.txz | tar xpf -
unxz -c /usr/freebsd-dist/src.txz | tar xpf -


ここから先は/var/emptyをリードオンリーにしておく必要がある

zfs set readonly=on zroot/var/empty

準備ができたので、本番環境にchroot する

chroot /mnt

まず /etcの配下で最低限の作業をする。

echo ‘zfs_enable=”YES”‘ > /etc/rc.conf
touch /etc/fstab

boot loaderの設定も忘れずに行う。

echo ‘vfs.zfs.prefetch_disable=”1″‘ > /boot/loader.conf
echo ‘vfs.root.mountfrom=”zfs:zroot”‘ >> /boot/loader.conf
echo ‘zfs_load=”YES”‘ >> /boot/loader.conf

rootのパスワードを設定する

passwd root

ここからは、後でもいいが、起動時にエラーメッセージにならないための作業をする。

timezoneの設定をする

tzsetup

次に sendmailのaliasesのDBを作成しておく

cd /etc/mail
make aliases

chrootでの作業はここまでである。

exit

ZFSの最終段階の作業

chrootから復帰したらZFSのコンフィグキャッシュファイルを作成する。

cd /tmp
zpool export zroot && zpool import zroot
cp /tmp/zpool.cache /mnt/boot/zfs/zpool.cache

ZFSのmountpoint設定作業を行う。

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

再起動

これで、最低限の設定が行われたので、再起動する。
さくらのクラウドの場合は、

  1. シャットダウンする
  2. DVDを取り出す
  3. 起動する。

今のさくらのクラウドでは、FreeBSDのGPTからの起動に妙に時間がかかる気がする。
まあ、これはFreeBSDの問題か。

さて、無事起動さえできれば、これ以降は、ネットワーク関係の設定、ネームサーバの設定、sshの設定などの通常のインストール作業をbsdinstallなどを使って行うこととなる。

*1:メモリが4GBでは、zfsのモジュールを有効にするのが面倒である

*2:クラウド上でRAIDを組む理由は、恐らくほとんど無い。今回は、無償期間中であることを利用し、あくまで試してみただけのことである

*3:これで上手く行かなければ [LiveCD]でやってみる。Dsn's Blogは、LiveCDでの作業となっている。

*4:当然ながらここを見逃すとやり直しになる

*5:何か上手く行かないことがあれば、面倒でもここに戻ると解決できることが多い

*6:移行の作業で、どこまで作業が進捗したかわからなくなった場合には gpart show で確認する

*7:ここで no left space のようなエラーが出る場合は、gpart destroy からやり直してみる

*8:書き込める場所は後からramdisk上に用意するので

*9:ここは、Dan's Blog そのままの設定にしたが、好みはいろいろであろう