ファイルサーバのリプレイス

ちょっと自宅のファイルサーバを刷新したので、そのときの注意事項を記載しておきます。対象読者は何もかも忘れてしまった未来の自分です。
新規サーバは Gentoo Linux で作ります。既存のは FreeBSD 8.2-RELEASE です。いずれもファイルシステムZFS を使い RAIDZ で fail safe な状態にします。基本は Gentoo 本家のハンドブックと、Web で見つけたこのメモを見れば OK です。 / も ZFS にすることができます。

https://github.com/ryao/zfs-overlay/blob/master/zfs-install

サーバとなる PC には Western Digital の WD30EZRX という 3 TByte のディスクが 6 本 SATA3 で接続されており、 2 本壊れてもデータが失われないようにします(うわぁ、ディスクだけで 6 万円超えてるとか)。このディスクは AFT という技術が使われていてセクタが 4096 Byte あるそうです。いつまでも 512 Byte では効率が悪いということでしょうね。このボリュームは /home に当てて、他で使うボリュームは部屋に転がっていた Hitachi の HDS72202 という 2 TByte のディスクを使います。
構築作業の手順ですが、zpool を作成するところをちょいちょい調べたので、やっていることについて補足していきます。

まずはこれ。 zpool コマンドで zpool という名前のボリュームを作ります。

# zpool create -f -o ashift=12 -o cachefile=/tmp/zpool.cache -O normalization=formD -m none -R /mnt/gentoo zpool /dev/sda

オプションはそれぞれこんな意図があります。 man zpool で得られる情報です。

No. Option Explanation
1 create 任意のデバイスを使ってボリュームを作ります
2 -f 強制的に vdev を使います。 vdev はディスクだったりファイルだったりデバイスです
3 -o ashift=12 セクタ長を 2 の乗数で指定します。 4096 なら 12、 512 なら 9 ですね。ディスクの構造に依存しません。大きければパフォーマンスが上がりますが、ディスクの使用量も場合によっては上がります
4 -o cachefile=/tmp/zpool.cache ZFS の構造を管理するファイルを指定します。起動時にこれを読みます
5 -O normalization=formD UNICODE で書かれたファイル名を比較するアルゴリズムの指定です。 UNICODE ってそんなもんなのですが、 formD は Mac と相性が良いとか。
6 -m none どこにも mount しません
7 -R /mnt/gentoo -o cachefile=none,altroot=path と同等のようです。 4 と矛盾しますね。 root として振る舞う path を記載します。 Gentoo のインストールで使う chroot の path を指定すると良いです
8 zpool ボリュームの名前です。お好みで
9 /dev/sda vdev の名前です

で、起動用のボリューム zroot にこんなコマンドを実行しました。

# zpool create -f -o ashift=12 -O normalization=formD -m / -R /mnt/gentoo zroot sda

/dev/sda は HDS72202 なので ashift=9 で良かったと思いますが、ぱ、パフォーマンス重視なのです。実はあまり考えてません。名前は zroot にしました。これは好みです。

ストレージ用のボリューム home はこんな感じです。

# zpool create -f -o ashift=12 -o cachefile= -O normalization=formD -m /home -R /mnt/gentoo home raidz2 sdb sdc sdd sde sdf sdg

zroot と異なるのは vdev に raidz2 とディスクをしているところです。raidz2 は RAID-5 の亜種で、"write hole" と呼ばれる電源が落ちたときの問題を解決してます。 raidz2 の 2 はパリティに 2 本ディスクを使うという意味なので、 2 本までのディスク障害に耐えられます。

ここまで来たら、他は固有の手順はそんなにないと思いました。あとは zfs コマンドでボリュームを作って mount したら例のメモに従えば OK です。きっと 3 年後くらいにまたハマるので今の自分に感謝するはず。