RAID1とかRAID5とか、冗長性確保という意味では確かに便利だけども、
ハードウェアのサポートが必要だったりとか、書き込みホール問題だとか色々あるワケで、
まあ色々面倒なところはある。
で、その辺の問題を解決したぜ! と主張するのがSolaris由来のZFSでサポートされるRAID-Z。
http://blogs.sun.com/bonwick/entry/raid_z5
ほほう、なかなか良さそうじゃあないですか。
でもって普段使ってるFreeBSDにもZFSがportされてきたらしいじゃないですか。
こりゃあ試さないといかんでしょう。
さて、今回こちらに生まれも育ちも異なるが、
容量は大体全部250GBくらいのHDDが4玉ございます。
1玉だけ300GB近くあるけど気にせずに、ちょっくらRAID-Z2を組んでみようではございませんか。
なお今回特に冗長性が必要な運用を想定しているわけでは全くないので、
おおむねRAID-Z2とかはオーバースペックではある。
が、どのみち今回使用予定のHDDはどれもこれも少なくとも3年、
長いものは6年以上使っていていつ寿命がきてもおかしくないドライブなので、
そういう意味では冗長化も全く無駄ではなかろう。
…いや要するに、「ZFSのRAIDを使ってみたい!」が半ば目的なわけだが。
まあ巷の噂ではCPUリソースを食うとかメモリもバカ食いするとか色々あるみたいだけど、
今回の構成はCPUはCore2Duo、メモリは4GBだ。
ZFSを使うのに十分かどうかはともかく、問題はないだろう。多分。
で、インストール手順は下記Wiki記事にある。
http://wiki.freebsd.org/RootOnZFS/GPTZFSBoot/RAIDZ2
以上。
うん。以上。これで終わらせても問題ないくらいにはなにもなくインストールが完了してしまった。
しかしまあこれだけというのもさみしいのでちょっと補足。
こちらはZFSはあんまり関係ないけども、FreeBSD-8.1-RELEASE-amd64-memstick.img なる
USBメモリからブート可能なイメージが公式で配布されているので、こいつを適当な USB メモリに dd して、
BIOSで起動順序を調整して起動した。便利な世の中になったもんだ。
今回はこのddも別PCのFreeBSDでやったけども、Unix系のシステムがあれば適当にddできると思うし、
Windowsでもddツールはあるらしくそれを使えばできるとのこと。
このメモリで起動すると自動的にsysinstallが実行されるので、指示通りFixitを選択すればOK。
サブメニューが出るけど、それも 3. USB で問題なし。
Wikiの指示に従って素直にgpart createコマンドを実行したら…おおっと、こんなエラーが。
gpart: geom 'ad4': File exists
まあ「お古」のドライブなので当然といえば当然。以下のコマンドで廃棄してから再開。
gpart delete -i 1 ad4
gpart delete -i 2 ad4
gpart delete -i 3 ad4
gpart destroy ad4
全ドライブまっさらにしてからやったら上手くいった。
現在のドライブに何個パーティションがあるかとかは、
gpart list adN とかやれば一覧されるので、
index の欄を見て単純に全部廃棄すればいいようだ。
ディスク作成後のパーティション切りについては、bootとswapは今回素直にWiki記事に従った。
最後のzpool用の領域については、Wikiだと60GBになってたけども、
まあ普通そこから先のパーティション分けはZFS自身に頼ると思うので、全部でいいでしょう。
ということで今回私は -s オプションを外して残り全部を使うように指示した。
ただ、今回4玉のHDDがそれぞれ容量がバラバラだったので、
zpool createコマンド時に「容量が違うが良いのか」と言われることにはなった。
無視したければ -f を指定せよ、との指示だったのでその通りにしたけども、
真面目にやるならgpartコマンド時点で一番容量の少ないドライブに合わせておくのが無難なのかも。
ZFSは物理ディスクやディスクスライスなんかを集めてストレージプールなるものを作成し、
その上にまたZFSでの論理パーティションを作成する、という、一段レイヤが増えた状態になっている。
なので、既にGPTでパーティションは作成しているけども、今回はそれをそのまま使うわけではないので、
もう一回ZFSのストレージプールからパーティションの作成をすることになる。
おかげで柔軟なディスク運用ができるようになってるみたいだけど、
どのレイヤで何をしているのかはちょっと意識する必要があるかもしれない。
GPTパーティションを挟まずにディスクそのものをプールに追加する形式なら混乱が少なくて済かもしれないが、
その場合はブート用の別ディスクが必要になるようだ。
ただまあ、USBメモリを起動ディスクにして、HDDは全体をZFSに管理させるという方法もあるようなので、
場合によってはそういうやりかたも良いかもしれない。
で、今回は基本Wikiの指示に素直に従って分けたけども、
ディスク容量には余裕がある予定なので compression オプションは全部外した。
この辺、オプションや分け方は好みに応じてカスタマイズしても良いとは思う。
話によると、パーティション単位でスナップショットとかが取れるらしいので、
その辺使う予定があるならこの時点で気にしておくと良いのかもしれない。
メモにあった通り、
2-7. Install ZFS aware /boot/loader (Required for 8.0-RELEASE and 7.{0-2}-RELEASE)
については、FreeBSD 8.1 では既に不要のようなのでスキップした。
結論としては特に問題なし。
ネットワークインターフェースの読替は、dmesg コマンドで調べて em0 と判明したのでそれを使用。
ifconfig コマンドでも分かるかもしれない。
あとWikiの指示じゃ設定ファイルも古き良き echo とリダイレクトで書いてるけども、
そこは面倒なのでviを使った。って、そんな補足はさすがにどうでもいいよね…。
でもまあこうやって指示書にするには echo and redirect は便利だよね、実際。
で、指示通りに再起動したらちゃんとFreeBSDが起動してきた。やったね!
一旦 root でログイン、sysinstall を起動して、 Configure -> User Management から普段使う一般ユーザを追加。
SSHは当然必要なので、/etc/rc.conf に sshd_enable=”YES” を追記して再起動。
これで再起動後、普段通りのユーザでSSHログインが可能なことを確認。
後はいつも通り ports から必要なアプリケーションをインストールしていくだけで、
ファイルシステムがZFSだろうがなんだろうが全然変わらない。
もうちょっと苦労するかなーと思ってたけど別にそんなことはなかった。
さて、これからちょっとディスクエラーとか出るのが楽しみになっちゃうね!
いやまあ、一応普通に使用予定なのでわざと壊すようなマネをするつもりはないし、
エラーとか出てもらってもそれはそれで困るんですが…。
1GB のファイルをコピーしたらこんな感じ。
% time cp FreeBSD-8.1-RELEASE-amd64-memstick.img /tmp/
cp -ip FreeBSD-8.1-RELEASE-amd64-memstick.img /tmp/ 0.00s user 1.62s system 4% cpu 40.237 total
25MB/sくらいですかね。単体でのディスク性能がわかんないので速いのか遅いのかよくわかんないけど。見る限りではそれほどCPUリソースを食っている感じもないような?
df コマンドの結果はこんな感じ。
% df -h
Filesystem Size Used Avail Capacity Mounted on
zroot 435G 282M 435G 0% /
devfs 1.0K 1.0K 0B 100% /dev
zroot/tmp 436G 1.0G 435G 0% /tmp
zroot/usr 436G 1.4G 435G 0% /usr
zroot/usr/home 443G 8.3G 435G 2% /usr/home
zroot/usr/ports 436G 1.0G 435G 0% /usr/ports
zroot/usr/ports/distfiles 435G 323M 435G 0% /usr/ports/distfiles
zroot/usr/ports/packages 435G 27K 435G 0% /usr/ports/packages
zroot/var 435G 152K 435G 0% /var
zroot/var/crash 435G 29K 435G 0% /var/crash
zroot/var/db 435G 93M 435G 0% /var/db
zroot/var/db/pkg 435G 14M 435G 0% /var/db/pkg
zroot/var/empty 435G 27K 435G 0% /var/empty
zroot/var/log 435G 225K 435G 0% /var/log
zroot/var/mail 435G 415K 435G 0% /var/mail
zroot/var/run 435G 70K 435G 0% /var/run
zroot/var/tmp 435G 28K 435G 0% /var/tmp
どのマウントポイントも結局は同じ zpool から割り当てられているので、Availが全部同じサイズを報告するという壮観な状態に。
zpool status コマンドの結果はこんな感じ。
% zpool status
pool: zroot
state: ONLINE
scrub: scrub in progress for 0h2m, 16.95% done, 0h12m to go
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
raidz2 ONLINE 0 0 0
gpt/disk4 ONLINE 0 0 0
gpt/disk6 ONLINE 0 0 0
gpt/disk7 ONLINE 0 0 0
gpt/disk8 ONLINE 0 0 0
errors: No known data errors
まあ問題ないってことね。
ちなみに scrub というのは、zpool scrub というコマンドで、プール内のデータを全チェックしてくれるのだが、
丁度チェックを実行しているときにコマンドを実行したので「チェック中だよ」と出ている。
ZFSは最初に紹介したblog記事にもある通り、全データに対してチェックサムをとっているので、
データが破損していないかどうかぜーんぶチェックできるのだ。
そして冗長化RAIDでは、該当冗長化レベルで対応可能な限り、破損データの修復すら可能だ。素晴らしい。
ロマンだよねえ。
で、せっかく大容量のディスクスペースがあるわけだし、
CIFSで公開してファイルサーバーっぽく使ってみたらいいよね。
なんかZFSだと直接CIFS公開できるらしいよ、なーんて噂もあったので早速トライ。
% zfs set sharesmb=on zroot/usr/home
property 'sharesmb' not supported on FreeBSD: permission denied
…ぎゃー。残念。permission deniedなどと出ているがrootでやっても関係ない。
結局Solaris CIFS依存なのでFreeBSDではサポートしないよ、ということらしい。
なんとかしようと思ったらsmbdを上げるしかないようだ。
そうそう、ところで今更だけど、RAID-Z2ってRAID6相当なら、最低4ドライブじゃないのかな?
参考にしたWiki、3ドライブなんだけど…。