RAID-Z2なZFS上にFreeBSD 8.1をインストールする


2010年 12月 03日

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

以上。

うん。以上。これで終わらせても問題ないくらいにはなにもなくインストールが完了してしまった。

しかしまあこれだけというのもさみしいのでちょっと補足。

起動用USBメモリの用意

こちらはZFSはあんまり関係ないけども、FreeBSD-8.1-RELEASE-amd64-memstick.img なる
USBメモリからブート可能なイメージが公式で配布されているので、こいつを適当な USB メモリに dd して、
BIOSで起動順序を調整して起動した。便利な世の中になったもんだ。

今回はこのddも別PCのFreeBSDでやったけども、Unix系のシステムがあれば適当にddできると思うし、
Windowsでもddツールはあるらしくそれを使えばできるとのこと。

このメモリで起動すると自動的にsysinstallが実行されるので、指示通りFixitを選択すればOK。
サブメニューが出るけど、それも 3. USB で問題なし。

GPTディスク及びパーティションについて

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は物理ディスクやディスクスライスなんかを集めてストレージプールなるものを作成し、
その上にまた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ドライブなんだけど…。