2007.11.03 ZFSメンテナンスの日々 #5 ZFS Root 編 最近仕事が忙しかったのと, あまり特別書かなければならないような ことやってなかったせいもあり, あんまり ZFS まわりでの進捗がな かった今日この頃です。あまりにあんまりな日々でした:-)。 ZFS の運用については, jus の勉強会にて思いのたけをぶつけてきま した。ご静聴いただきありがとうございます。 http://www.jus.or.jp/benkyokai/07-09.html 運用時において, ZFS について知っておきたいことや事例などを重点 に発表いたしました。設計や実装面における説明としては不満に思う 方もおられるかと思いますが, とりいそぎ「ぶっちゃけ ZFS ってな んなのヨ」という視点でまとめてみました。実際に自分で行おうと思 ったときのきっかけになれば幸いです:-)。 また, この時の発表資料についても下記にて公開しております。 http://www.ninth-nine.com/presentation/Jus070926.pdf また, 発表してる最中に気がついたりとか, 後から議論してて書き足 りない点等についてエラッタを書きましたのでそちらも参照いただけ ると助かります。こちらは随時更新予定ですが, 次の更新予定は未定 です:-)。 http://www.ninth-nine.com/presentation/Jus070926_errata.txt - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - さて。最近の ZFS の新しい運用と言えば, FreeBSD の current で 培った(?) new feature のお披露目(RELEASE)にあるわけですが, リリースバージョンで*使える*機能としての ZFS でどれだけの運用 が可能かが興味あるところです。 というわけで HP ProLiant ML115G1 (AMD Athon64 3500+ 2.2GHz, 1GB メモリ, 250GB SATA ×2 基, Lights Out 100i) がキャンペー ン価格で入手できたので, 今まで 5 年以上に渡って 4-stable で がんばってきたサーバーのリプレースメントとして作業しました。 まだ運用を始めて日が浅いですが, その点ご承知ください。 まず, 全てにおいて ZFS 上で生活するためにはどうするのがいい のか。そのための手段として 2 つの方法論があります。1 字違い ですが, なかなか奥が深い:-) 1. ZFS Root / (ルート)ディレクトリを ZFS にしてしまおう。というもの。 それの何が問題なの?ということで得失をまとめる。 ・デメリット a. pure ZFS 環境ではない。どうして UFS が必要である。 b. OS が起動(ブート)するのに /boot は UFS で構成する必要 がある。またパーティションの中に boot ディレクトリが ある構成である必要がある。なお, これ以外は ZFS で環境 構築できる(スワップも含め)。 c. それなりの作業手順をもって作業する必要がある。ただし 後述の ZFS Boot と大差あるかと言ったら, ほとんど無い か, むしろ楽。 ・メリット a. ブート手順が従来の手法(boot1, boot2, loader)に頼って るので極めて堅牢。 b. BSD ディスクラベル切らないといけないので, スワップを 取りやすい。 c. ZFS 上にスワップを取ることはできるが, OS のクラッシュ ダンプは取れないので, スワップが取りやすいのはメリット でかい。 2. ZFS Boot ブート時点から ZFS にしてしまおう。というもの。というわけ で得失をまとめる。 ・デメリット a. 現時点で OpenSolaris でのみ使える(それも grub で)程度の 状況で Solaris ですら使えない状況のところで, FreeBSD で は開発中で, ソースをひっぱってきて作業する必要がある。 b. そういう意味で極めて 実験的 機能。 c. 作業手順が恐ろしく繁雑。liveCD 上で作業する必要があるの と手元でコンパイル環境が別途用意できる上, 随所で対応し なければならないほどのスキルが要求される。 d. sysinstall はほぼ使えない。 e. スワップを確保しずらい。なにせ BSD ディスクラベル不要で すから, 作業手順として意識して作る必要がある。 f. ML115 上では動かんかった。。 orz ・メリット a. この上なく pure ZFS 環境。 b. 自慢したくなるほど ZFS 環境。 c. ミラーリング手順が極めてシンプル。 d. HDD障害対応手順がシンプル。 というわけで ZFS Boot に挫折した私は ZFS Root に挑戦するので あった。。。 作業手順としては下記説明が極めてよくまとまってるので, そちら を見て作業する方向で。。。 http://www.ish.com.au/solutions/articles/freebsdzfs とは言え, 運用面のフォローは必要と言うことで色々と調べた結果 をまとめる。基本的には先の URL ものの手順をベースとする。 1. 先の例では UFS パーティションのサイズを 512MB としている。 私的には 2GB を推奨。 a. 7.0BETA 1.5 でミニマムインストールすると 386MB で 95% 使用する。512MB というのはぎりぎりと言える。 b. 次にカーネルサイズの問題がある。私の場合カーネルは -g3 オプション付きでコンパイルしているので, デバック用のシ ンボルテーブルのサイズを含めると 200MB 弱使用する。 boot ディレクトリ以外を削除しても 512MB ではせいぜい 二世代までしかカーネルを保存できない:-)。 2. ファイルシステムの分割方法とチューニング(パラメータ調整)。 usr, var, tmp しか切ってないのでもっと切る。とりあえず こんな感じ? zpool create tank mirror ad4s1d ad6s1d zfs set atime=off tank zfs set compression=lzjb tank zfs set copies=3 tank zfs create -o compression=gzip -o copies=1 tank/compat zfs create -o compression=gzip -o copies=1 tank/home zfs create -o compression=gzip -o copies=1 tank/usr zfs create -o compression=gzip -o copies=1 tank/var zfs create -o compression=off -o copies=1 tank/tmp zfs create -o compression=off tank/var/log zfs create -o compression=off tank/var/tmp zfs create -o readonly=on tank/var/empty zfs create tank/usr/src zfs create tank/usr/share zfs create -o compression=off tank/usr/share/man zfs create tank/usr/obj zfs create tank/usr/doc zfs create tank/usr/local zfs create tank/usr/ports zfs create -o compression=off tank/usr/ports/distfiles 個人的には tank/var/empty の quota を 0 バイトに設定し たいけど, どうも設定できないみたいで…。。。 3. Creating a Mirror 以降の手順はちょっと…。。。 sysinstall 使っても一発で a, b, d パーティションはでき ない。disklabel -r ad4s1 としてその設定を ad6s1 に反映 するようにした方がいい(もちろん同じディスクサイズとして)。 とりあえず, d, b, e とパーティション作ってから disklabel -e ad6s1 でパーティション名変えるのが正解かな。 4. ミラー先(ad6s1)の構築手順はいただけない。。 zpool の手順は ok としても, ad6s1a 作るのに, ad4s1a を作る 手順と同じなのは無駄。というわけでどうするかを以後にまとめ る。 パーティションは以下の状態にあり下記のように構成する。 ad4s1a 非同期ミラー ad6s1a ad4s1b ミラーしない ad6s1b ad4s1d ZFS Mirror ad6s1d MBR(ad4) 個別設定 MBR(ad6) スライス(ad4s1) 個別設定 スライス(ad6s1) パーティション 個別設定 パーティション まぁ現時点で ad6 の MBR 以外は設定済んでると思うので boot0cfg -b boot0 ad6 を実行して MBR を書き込んでおく。 非同期ミラーをどうするか。は色々やりようがあって単純には いかないと思う。たぶん忘れて事故起こすに一票。まぁ単純に は dd if=/dev/ad4s1a of=/dev/ad6s1a bs=64k あたりで。 あるいは dump(8)/restore(8) とか。 これを cron で仕込むか, make installkernel 時に仕込むか が検討しどころ。実際にはハードディスク障害が起こった際の 状況を確認して, インテリジェントに対応する必要がある。 起動時の状況等を考慮して, HDD 停止/交換手順を確認する必 要がある。 まぁだいたいこんなところで。 Written by 重村法克