FreeBSD9でFull ZFSシステム作成の実験[追記あり]
FreeBSD勉強シリーズの一環です。
- FreeBSDの勉強中: プラスα空間 (2012年11月3日)
FreeBSDでの魅力と言えば、やはり、ZFS。色々調べていたら、bootパーティション以外を、ZFSにしてインストールする方法が出ていました。
- FreeBSD 9でフルZFSシステム: FreeBSD Try, Error and Error
- BSD Consulting, Inc.
- Booting from ZFS RAID0/1/5/6 in FreeBSD 9.0-RELEASE | Dan’s Blog
大変参考になりました。ありがとうございます。
これらの資料を元に、FreeBSDインストールの実験をしました。実験と言うのは、Parallelsに、次のスペックの仮想マシンを作って、実際にインストールしました。
- メモリ … 4GB
- HDD0(SSD) … 9GB (システム、スワップ、ZIL用)
- HDD1 … 1GB (データ用。RAIDZ)
- HDD2 … 1GB (データ用。RAIDZ)
- HDD3 … 1GB (データ用。RAIDZ)
- HDD4 … 1GB (データ用。RAIDZ)
- USBメモリ … 32GB (L2ARC用)
(追記 2014-03-30 20:31 実際のシステムでは、L2ARCにSSDを割り当てています。USBメモリは使っていません。)
このスペックの仮想マシンに、とりあえずインストールしました。インストールして起動確認したまでで、使い込んではいないのですが、実験はできました。また、スワップ・パーティションの準備はしていないのですが、ファイルとしてZFSプールに置くつもりです。
インストールは、次の手順でした。一応、インストールから起動までは確認できたのですが、私がZFSを完全に理解している訳ではないので、間違った事を書いているかもしれません。その時は、お知らせください。
上記二つの資料を読んだ上で、私なりの改良を加えたシステムになっています。
- ZILのサイズはメインメモリの半分にした
- ZFS の新機能 – Oracle Solaris ZFS 管理ガイド (ログデバイスの最大サイズは物理メモリーのサイズの約 1/2 になるようにしてください。)
- L2ARCのサイズは、メインメモリよりも大きくした
- L2ARCはUSBメモリに置いた
- ZIL/L2ARCはSSDに置くのが効果的だが、大容量のSSDは高い
(追記 2014-03-30 20:31 実際のシステムでは、L2ARCにSSDを割り当てています。USBメモリは使っていません。)
ZIL/L2ARCについては、次の資料を参考にしました。ありがとうございます。
次の順序でインストールしました。
- システム用ディスクの準備
- L2ARC用のUSBを準備
- データ用ディスクの準備
- ZFSカーネルのロード
- システム用プール(rpool)の作成
- データ用プール(upool)の作成
- ZILとL2ARCの設定
- rc.confとloader.confの設定
- システム用プール(rpool)のマウントポイントの設定
- データ用プール(upool)のマウントポイントの設定
- システムのインストール
それでは、順に説明して行きます。
1. システム用ディスクの準備
まずは、つながっているデバイス名を調べ、GPTパーティションを切ります。boot用、システム用、ZIL用の3つです。
# dmesg | grep MB # gpart destroy ada0 # gpart create -s gpt ada0 # gpart add -s 64k -t freebsd-boot ada0 # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0 # gpart add -s 2G -t freebsd-zfs -l zil ada0 # gpart show # gpart add -s 7G -t freebsd-zfs -l zroot ada0
最後の7Gが、システム用になります。実際には、"-s 7G"ではなく、"gpart show"で調べたサイズ、"-s 14679869″を指定しています。gpart showでfreeとなっている大きさを直接指定しています。
なお、2回目以降同じディスクに再インストールする場合、gpard destroyに失敗すると思います。"-F"オプションを付けると、強制的にdestroyできます。
2. L2ARC用のUSBを準備
l2arc用には、USBメモリを割当てています。本当はSSDに前提で組むのが良いですが、大容量のSSDは高いので、代わりにUSBメモリを使っています。壊れたら、買い直せば良いし。
(追記 2014-03-30 20:31 実際のシステムでは、L2ARCにSSDを割り当てています。USBメモリは使っていません。)
# gpart destroy da0 # gpart create -s gpt da0 # gpart show # gpart add -s 60532925 -t freebsd-zfs -l l2arc da0
3. データ用ディスクの準備
データプール用のディスクを初期化します。これは、機械的に作業を進めるだけです。
まずは、GPTを破壊します。
# gpart destroy ada1 # gpart destroy ada2 # gpart destroy ada3 # gpart destroy ada4
GPTパーティションテーブルを作ります。
# gpart create -s gpt ada1 # gpart create -s gpt ada2 # gpart create -s gpt ada3 # gpart create -s gpt ada4
ZFSとしてパーティションを作り、ラベル名を与えます。
# gpart add -t freebsd-zfs -l disk0 ada1 # gpart add -t freebsd-zfs -l disk1 ada2 # gpart add -t freebsd-zfs -l disk2 ada3 # gpart add -t freebsd-zfs -l disk3 ada4
4. ZFSカーネルのロード
ZFS関連のカーネルモジュールをロードします。これらのカーネルモジュールをロードしないと、zpool, zfsコマンドが使えません。
# kldload opensolaris # kldload zfs
5. システム用プール(rpool)の作成
# zpool create -o altroot=/media rpool /dev/gpt/zroot # zfs create rpool/root # zfs create rpool/root/tmp # zfs create rpool/root/var # zfs create rpool/root/usr # zfs create rpool/root/usr/local # zfs create -o compression=lzjb -o setuid=off rpool/root/usr/ports # zfs create -o compression=off -o exec=off -o setuid=off rpool/root/usr/ports/distfiles # zfs create -o compression=off -o exec=off -o setuid=off rpool/root/usr/ports/packages
/usr/portsは、圧縮をかける設定にしてみました。
6. データ用プール(upool)の作成
# zpool create upool raidz1 /dev/gpt/disk0 /dev/gpt/disk1 /dev/gpt/disk2 /dev/gpt/disk3 cannot mount '/upool': failed to create mountpoint # zpool status -v upool
エラーは出たけれど、upool自体はできているみたいです。
(追記 2017-06-14 20:01 “/"がread onlyになっているため、"/upool"を作れなかったと言うエラーです。)
# zfs create upool/home # zfs set mountpoint=/media/usr/home upool/home
mountするのは、2段目にします。スナップショットをzfs recvでリストアする時に簡単にする為です。詳しくは、次のページからダウンロードできるPDFの45ページ目をご覧下さい。(追記 2017-06-14 20:01 httpsでつなぐ時にセキュリティエラーがでます。接続はやめておいた方が無難かもしれません。)
7. ZILとL2ARCの設定
ZILとL2ARCは、データ用プール(upool)に対して効く様に設定します。
# zpool add upool cache gpt/l2arc # zpool add upool log gpt/zil
8. rc.confとloader.confの設定
ZFSシステムを起動時にマウントする為の方法です。マウントには、zpool.cacheと言うファイルが必要だそうです。それを作る為の方法です。
# mkdir -p /media/root/boot # mkdir -p /media/root/boot/zfs # mkdir -p /media/root/etc # echo 'zfs_enable="YES"' >> /media/root/etc/rc.conf # echo 'zfs_load="YES"' >> /media/root/boot/loader.conf # echo 'vfs.root.mountfrom="zfs:rpool/root"' >> /media/root/boot/loader.conf # mount -t tmpfs tmpfs /tmp # zfs umount -a # zpool export rpool # zpool export upool # zpool import -o cachefile=/tmp/zpool.cache -o altroot=/media rpool # zpool import -o cachefile=/tmp/zpool.cache -o altroot=/media upool # cp /tmp/zpool.cache /media/root/boot/zfs/ # zfs umount -a # umount /tmp
9. システム用プール(rpool)のマウントポイントの設定
今まで作って来たZFSファイルシステムの、マウントポイントを設定します。
# zpool set bootfs=rpool/root rpool # zpool set cachefile="" rpool # zfs set mountpoint=none rpool # zfs set mountpoint=/ rpool/root # zfs set mountpoint=/tmp rpool/root/tmp # zfs set mountpoint=/var rpool/root/var # zfs set mountpoint=/usr rpool/root/usr # zfs set mountpoint=/usr/local rpool/root/usr/local # zfs set mountpoint=/usr/ports rpool/root/usr/ports # zfs set mountpoint=/usr/ports/distfiles rpool/root/usr/ports/distfiles # zfs set mountpoint=/usr/ports/packages rpool/root/usr/ports/packages # zfs get -r mountpoint rpool
“zfs get"コマンドで確認するそうです。私の場合、次の様になっていました。
10. データ用プール(upool)のマウントポイントの設定
同様に、データ用プール(upool)のマウントポイントを設定します。
# zpool set cachefile="" upool # zfs set mountpoint=none upool # zfs set mountpoint=/usr/home upool/home # zfs get -r mountpoint upool
“zfs get"コマンドの結果は、次の様になっていました。
11. システムのインストール
いよいよ、システムのインストールです。私の場合、なぜか、いったんexportしてから再importしないと、ディスクが見えませんでした。
# zpool export rpool # zpool export upool # zpool import -o altroot=/media rpool # zpool import -o altroot=/media upool
ファイルを展開します。
# tar xzpvf /usr/freebsd-dist/base.txz -C /media # tar xzpvf /usr/freebsd-dist/src.txz -C /media # tar xzpvf /usr/freebsd-dist/kernel.txz -C /media # tar xzpvf /usr/freebsd-dist/ports.txz -C /media
ファイルを展開し終わったら、再起動します。正しく設定できていたら、起動するはずです。rootへのパスワードさえも設定していませんので、再設定が必要です。
(追記 2013-08-04 01:02)
データ用プールの名前を、"hpool"から"upool"に変更しました。手順そのものは変わりません。
(追記 2013-09-26 22:10)
ラベル名の付け方が気持ち悪かったので、修正しました。手順そのものは変わりません。
(追記 2014-03-30 20:31)
実際のシステムでは、L2ARCにSSDを割り当てています。USBメモリは使っていません。USBメモリを使おうとした所、上手く行かなかった事が主な理由です。
[amazonjs asin="B00Y32OHNM" locale="JP"]
ディスカッション
コメント一覧
まだ、コメントがありません