2006.12.23 刻はZFSの涙を見る。 ごめんなさい。ネタ切れです(謎)。 色々と常用していて試行錯誤の上, なんとか使っていられる状況かなぁ ということで, 涙無しには語れない調査の結果をば…(オチた?)。 現時点での ZFS を使うには, 以下の問題点があります: 1. 大量のカーネルメモリ(KVM)を要求する 2. 起動時マウント 3. パッチの改訂:-) というわけで。 1. 大量のカーネルメモリ(KVM)を要求 pjd 氏から known bugs として挙げられている上, 「レポートする な」とまで言われてる問題です。現時点(12/23)で解決策はありませ ん。回避策は無くはないですが, 恒久的なものかは不明です。その 上, ある意味リッチソリューションです:-)。 状況ですが, cvsync で /home/ncvs, /home/gnat をミラーリングす る程度の使い方でだいたい 1.2GB 使用します(爆)。 ちなみに FreeBSD/i386 標準でのカーネルのメモリ使用量の上限は 320MB (VM_KMEM_SIZE_MAX マクロ)で, 99.9% の状況でこれが足りな くなることは普通無いです:-)。FreeBSD/amd64 でも 400MB なので, 本質的には amd64 環境でも調整は必要となります。 というわけで要求量の 1/4 程度なので, これを増やす必要がありま す。増やし方は色々ありますが, 条件があって注意。考察について は後日。手順としては以下の通り。 a. options KVA_PAGES=512 をカーネルコンフィギュレーション ファイルに設定してカーネルを再構築する。 b. /boot/loader.conf に vm.kmem_size=1610612736 を設定 (1.5GB)して再起動。 c. 当然物理メモリは 2GB 程度必要ということで:-)。 カーネルのメモリ使用量についてですが, top(1) コマンドでメモリ 使用量の項目である Wired で確認できます。下記の例では 1401MB 使用しています:-)。 Mem: 35M Active, 20M Inact, 1401M Wired, 39M Buf, 44M Free 経験的に, 普通に使う分には 250MB 程度の使用量に落ち着きます。 ZFS 使用環境は異常ということで:-)。 2. 起動時マウント いちいち手で mount するのも面倒ということで。zpool import が何をしているのか調べていたら, /etc/zfs ディレクトリ配下の キャッシュファイルを利用していることが判明。zpool export し たら, このファイルを作っているので, zpool import との関係を 調査したところ, a. /etc/zfs ディレクトリは当然無い。作ろう。おそらくパーミ ッションは 0700 が妥当(root:wheel オーナーで)。 # install -d -o root -g wheel -m 0700 /etc/zfs b. zpool create での実験は行ってないけど, 一度 zpool export すると /etc/zfs/zpool.cache というファイルが作成される。 おそらくは zpool create でも作成されるものと思われる。 c. /etc/zfs/zpool.cache というファイルがあると kldload zfs した直後, zpool import と同等の処理が*行われてる*。でも マウントはしない。 orz d. ということは mount -t zfs zdevel/ncvs /home/ncvs するだ けでマウントしちゃう!? 実際する。でも事前に kldload zfs してないとパニックする。 orz e. やりー /etc/fstab だ! (あぽーん) mount -a の類では panic することが判明したので回避策を 練る必要がある。mount -t zfs zdevel/ncvs ... だと問題 無いのだけどなんでかなぁ〜と思いつつ。。 f. というわけで /etc/rc.conf.d/mountlate で逃げ。 rcNG scirpt は PREFIX/rc.conf.d/RCSCRIPT で個々に設定を 制御できる(もちろん /etc/rc.conf でも可能だが…)。マニュ アル見たら書いてない気がしないけど…。。まぁそれはともか く, 下記のようにファイルを用意しておけば ok。ちなみに パーミッションは 644 で(+x しなくてよい)。 /etc/rc.conf.d/mountlate - - - - - - - - - - - - - - - - - - - - - - - zfsinit () { kldstat -q -m zfs || kldload zfs } zfsmount () { zfs mount -a } start_precmd=zfsinit start_postcmd=zfsmount /etc/rc.conf.d/mountlate - - - - - - - - - - - - - - - - - - - - - - - このあたりの処理は mountcritlocal, mountcritremote, mountlate (いずれも /etc/rc.d ディレクトリ以下の rcNG script ファイル)でマウント制御を行っているが, どのす テップであっても /etc/fstab に記述がある場合は panic することがわかったので, 最後に実行される mountlate 時 に zfs mount -a しよう。という発想になっています。 fsck 不要と言い切るファイルシステムだけあって, zfs mount -a 時に文句言われることはないですね:-)。もっともファイル の壊れ具合について調査してないので, panic 時にどうな ったかは不明です。 3. パッチの改訂 12/16 に kmacy による src/sys/sys/sleepqueue.h#1.9 の作業 により ZFS のコンパイルができなくなりました。pjd 氏に連絡 して, この変更に追随するための変更ポイントを教えてもらい ました。とういうことで, 先に公開したときのバグ (zfs.ko モ ジュール作成時の typo)の修正と合わせて反映しました。 http://blog.ninth-nine.com/archives/zfs_20061117+.tar.bz2 なおアーカイブファイルは常に上書きで提供するのでそのつも りで。なんせ 7-current でしか動かないので, いついつ用と いうものがありえません。みんな 7-current といえば, 1 週間 以内のものを使いましょう:-)。 参考文献 http://blog.ninth-nine.com/diary/20061216.txt http://blog.ninth-nine.com/diary/20061212.txt Written by 重村法克