お盆休みの暇つぶしに、未だベータテスト中のさくらのクラウドを利用して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ビット版を選択する。
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
再起動
これで、最低限の設定が行われたので、再起動する。
さくらのクラウドの場合は、
- シャットダウンする
- DVDを取り出す
- 起動する。
今のさくらのクラウドでは、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 そのままの設定にしたが、好みはいろいろであろう