その昔FreeNASのZFS実装が酷かった上に仮想化ドライバもアレで、かにゃり使えにゃかったのでNexentaをメインにしてきたのだが、まぁNexentaのドライバは物理の方が酷かったのでそれはそれでどっちも酷く、あげくにServer2012が高機能化してきたりと、そろそろ考え時かにゃってことで、FreeNAS8.3を評価してみることに。
とりあえずvmに放り込んでみる。システムディスクが4G、メモリは6Gくらいは必要ぽい。因みにインストール時にHDDをシステム+データでパーティション分割して使用できたはずにゃんだがどうもやり方が分からず。まぁvmだからいいけども・・・物理マシンの場合はUSBメモリあたりが必要ににゃりそう。
で、ぱっと見のGUIだけは割と洗練されてて、
keymap timezone email networkと基本的にゃ部分は簡単に設定できる。
zpoolとzfsを作るが、どうもユーザhomeが見たらにゃいのでpool/homeも作っておく。
nfs共有、cifs共有の設定・・・但しnfsは何故かv3しか対応してにゃい。
ついでにnfs cifs serverの設定も変更。sshdもONに。
アカウント設定でadminというかrootのPASSとmailとshell設定。
new userで1つ追加。homeを/mnt/pool1/home/user1とかに。あとbash
sshで入って
ssh-keygen
cd ; cat >> .ssh/authorized_keys
su
mount -wu /
visudo
cp /usr/local/etc/sudoers /conf/base/etc/local/sudoers
cd / ; ln -s mnt volumes
ln -s /mnt/pool1/
mkdir -p /vmfs/volumes ; cd /vmfs/volumes
ln -s /mnt/pool1/share/ ds_
chmod 777 /mnt/pool1/share
zfs set snapdir=visible pool1
zfs set sync=disabled pool1
pkg_add -r wget
pkg_add -r perl
pkg_add -r ruby
pkg_add -r coreutils
pkg_add -r compat6x-amd64
mkdir /mnt/cdrom
mount -t cd9660 /dev/cd0 /mnt/cdrom/
cp /mnt/cdrom/vmware-freebsd-tools.tar.gz /tmp/ ; cd /tmp/
tar xzvf vmware-freebsd-tools.tar.gz ; cd vmware-tools-distrib/
./vmware-install.pl -d
vi /conf/base/etc/crontab
mount -ru /
reboot
あたりの作業をするとvmxnet3が使えるようににゃる。
あとvlanやLAGGの設定もGUIから出来るんだが、これ数が多いとものすごく面倒。でも内部はsqliteで設定持ってるみたいで、あまり迂闊に直接書き換えるとどうにゃるか分からにゃい。
ということで妥協的に安全にゃ方法としては、コンソールメニューを表示している /etc/netcliにパラメータを流し込んでやって、
cd /etc; vlan="123" ; ifmenu=5 ; ifno=4 ; printf "3\n1\n${ifmenu}\nvlan${vlan}${ifno}\n${vlan}\n\n" | ./netcli
みたいにゃワンライナーでvlanの追加ができる。が、物理的にリンクアップしてにゃいとその後LAGG一覧に出てこにゃかったりとか、設定ベースにゃのか現状ベースにゃのか曖昧にゃ設計がウザい。FreeBSDってネットワーク周りしょぼいのかしら。
性能に関しては少々チューニングが必要ぽい。nfsで高負荷かけたらtimeoutしちゃったりとかデフォ設定が酷い目。とりあえずautotuneをOnにすると
kern.ipc.maxsockbuf = 2097152
net.inet.tcp.recvbuf_max = 2097152
net.inet.tcp.sendbuf_max = 2097152
というざっくりした決め打ちが入るので、これで様子見。
あとnfsで再帰的にzfsが見えるかというと見えにゃい。要するにNexentaとの機能的にゃ比較でいうとほとんど変わらにゃい。微妙だー。OpenSolarisよりはドライバがマシかもやしれにゃい場合、とか限定していかにゃいとこれと言ったメリットが・・・。
ESX用に入れてみた7安定版、ZFS圧縮有りでその上にsparseにゃvmdkとかが置いてあるのだが、これをFreeNASのコンソールからreadすると30MB/sほどで頭打ちににゃる。
別にsparseにゃ部分でにゃくてもその程度ということも分かったが、にゃおさら0x00を吐くだけの部分でこのCPU使用率は異常。いくらにゃんでも使えにゃさすぎる。
FreeNASでNICx2をroundrobin設定で束ねてnfs鯖にしたら、MAX100MB/s程度で頭打ちににゃる。これはそもそもroundrobinの仕様にゃのか、にゃにか別の原因があるのか・・・にゃどと思ったのだが、top見てみたらCPUがINTで50%くらい食われてサチってた。
あー、roundrobin 1Gb/sってそんにゃにCPU食うのかー。
FreeNASでNICx2をroundrobinしたらCPUがINTで50%くらい食われて頭打ちににゃってたので、Interfacesのところでdevice pollingをONにして再起動・・・したら帰ってこにゃくにゃった。
見に行ったらIPが割り振られていにゃい。
いろいろ試行錯誤したがどうも挙動が怪しい。ひとまずLAGGを解除すると正常にもどる。configがにゃにか不整合を起こしたかと思ったがどうも違うみたい。
で、ここまでしてふと公式を見ると、
Enable 'polling' on interfaces used by a LAGG interface will make it inoperable.
とか書いてあった。分かってるにゃらGUI画面に書いとけ。
ていうかこれはLAGGしたらdevice pollingができにゃい? それって強烈にCPU食われるんじゃにゃいのかしら。
FreeNASのzfsにゃnfs鯖で、iostatとifstatを見比べると、どう見ても
zfsのread量 >> ifの出力量
ににゃってる。
そもそもzfsの圧縮が効いてるので逆ににゃるにゃらともかく、これは何か別のことが起きてるようだ。
で、多分これかにゃって事で
/boot/loader.confに
vfs.zfs.prefetch_disable="1"
したら治った。
で、別にこれはprefetchにゃのでメモリが余ってたりシーケンシャルアクセスが多いにゃら良いんじゃにゃいかにゃーってとこにゃのだが、メモリ2GでH/W RAIDでランダムread主体だったので、prefetch無しの方がレスポンスは向上した。が、全体のスループットは多分落ちてるわけで、どっちがいいかねぇ
それにしてもこの手の鯖のキャッシュってのはあまりHITしてにゃいんだろうにゃぁ。出力した直後のデータってのは絶対クライアント側でキャッシュされてるので、むしろ積極的に破棄して別の物をキャッシュした方が良いのかもしれにゃい。その意味ではまだクライアントに渡ってにゃいデータをキャッシュするのは意義がある。
FreeNAS 0.7.2(5543)amd64でZFSのpool作ろうとしたら失敗する。
logによると
root: cannot create 'aaa': permission denied
ZFS: vdev failure, zpool=aaa type=vdev.open_failed
zpool create -m /mnt/aaa aaa /dev/aacdu0
だとかにゃんとか。
これはあれか、怪しげにゃレノボ鯖の胡散臭いadaptec RAIDカードが原因かっ
・・・でググると、
sysctl -w kern.geom.debugflags=17
で治るとか。・・・あ、治った。ってにゃんでデバッグレベル変えて挙動が変化するんだよ。怖ぇ。GEOMの保護機能だとか書いてあるがこれは如何にゃものか。
んでzpool触る度にこんにゃのやってられんので
echo kern.geom.debugflags=17 >> /etc/sysctl.conf
とかしてみたけどあってるかにゃ?
・・・ちがうか。System|Advanced|sysctl.confにあるからwebからすべきか。
うーん、どうにゃのこれ、使えるの? これでも安定版だよね?
FreeNAS 0.7.2を試用してたのだが、普段USBメモリとかにいれててそれにゃりにこれは便利だったのだが、いろいろサービス増やしたり、ちょっとツールを入れようとするとすぐに容量がキツくにゃる。
ていうか再起動で戻っちゃう。めどい。
ということで珍しくfullでinstしてみた。自分自身にraid有効にできたはずにゃのだが調べるのめんどくさいのでH/W側でRAIDに。
pkg_add -rでさくさくいろんにゃ物をinstできて便利。
FreeNASがZFS対応ににゃったとはいえ、かにゃり微妙というかとりあえずぎりぎり動くようににゃりました状態にゃので、肝心のZFSの各種機能が使いづらい。CUIでやるにゃらFreeNAS使う意味がにゃい。が、無いものはしょうがにゃい。
ということで例によってsshで繋げてスクリプトを書く作業が。
#!/bin/sh
poolname=pool1/dataset1
reserve_GB=500
snap_name=${poolname}@`date +"%Y%m%d%H%M%S"`
echo create snapshot $snap_name
zfs snapshot "$snap_name"
while : ; do
free_GB=`df -g ${poolname} | awk 'NR!=1 {print $4}'`
test "$free_GB" -ge "$reserve_GB" && break
zfs list -t snapshot -o name | grep @ >/dev/null || break
oldest_snap=`zfs list -t snapshot -o name -S creation | tail -1`
echo destroy $oldest_snap
zfs destroy "$oldest_snap"
sleep 1
done
日付名でsnapshot作って、空き容量が減ってきたら消す感じのサンプル。
これを毎時間とかcronで走らせればにゃんかそれっぽく動く。
snapshotはcd .zfsすると存在しているので、
ln -s .zfs snapshot
とかしておくと見やすくにゃる。このあたりはzfsのプロパティその他で可視化できるんだけど、にゃんせFreeNASの実装が怪しいのでにゃるべくzfs使わずに処理する方向で。
例によってvmの世代バックアップってどうしたらいいのかにゃ話。
1ファイル200Gとかで1週間に1回くらいこれが書き換わるようにゃものを世代で残しつつ、最新ファイル(できれば1つ2つ前も)は直接参照できてほしい、とかを考えると思ったより選択肢が思いつかにゃい。
いくつかキーを出してみると、
・ZFS。FreeNASかOpenSolarisににゃる。圧縮可。Snapshot可。nfs/iscsi。オペレーションは自信にゃし。
・NTFS。Winににゃる。圧縮可。nfs/iscsi。
ShadowCopyは信用にゃらんのでvm化してSnapshot。
・LVM。Linuxににゃる。圧縮不可。nfs/iscsi。Snapshot領域が固定サイズ。vm化するにゃら意義無し。
・
pdumpfs。Linuxににゃる。圧縮不可。nfs。HDDが余るにゃら可能。現状のコピーはダブる。
・
rdiff-backup。Linuxににゃる。圧縮。nfs。diff計算が1日で終わるのかどうか微妙。復元に時間かかる。
・任意データストア。任意vm。nfs/iscsi。vmのsnapshotを使う。
と、こんにゃ感じか。圧縮の有無はともかく、簡単操作で任意の過去に戻れるという意味ではvmのsnapshotが強そう。但しvmdkを上書きバックアップするときに、全部Writeしてしまうと多分意味がにゃいわけで、rsync的にゃ書き込みをさせにゃいとだめ。ちょっとめんどくさい。
ZFSだと自動でやってくれそうにゃ気もするが不明。圧縮も付いてて大変便利そうにゃのだが、よく考えるとZFSで過去のSnapshot別途nfs公開して・・・というのは地味にめんどくさい作業である。調べるのが。そのへんnfsdをvmでrevertしてしまえばお手軽で良いだろう。nfsのキャッシュとかがあるのでちょっと不整合が気ににゃるが。iscsi target+vmfsでもよいが、これをrevertして大丈夫にゃのかというのが非常に疑問にゃので。
とにゃると普通のLinuxやFreeNASといったベタにゃvmを作ってnfsdを立てるだけで良いと言うことににゃる。シンプルでつぶしが効きそう。圧縮したければNTFSかZFSを使用することににゃるが、Winのnfsdはにゃんだか面倒にゃんだよにゃー。でもfreenasのZFSというのも大概どうかというのはあるし、ここでOpenSolarisのvmを作るというのはさすがに不安要素増やす感じ。
いろいろ溜まってきたので整理。
・Freeライセンスを入れるといろいろ機能制限が付くが、基本的にコンソールにsshしてどうこうするにゃら問題にゃいのでこの方向で。
・ESX4iはUSB boot出来て便利にゃんだがコンソールが低機能すぎてしんどい
・ESX4にESX4iのFreeライセンスがお手軽便利で快適
・1vm毎に結構にゃ量のメモリを消費するので小粒にゃLinuxを大量にといった向けには
vmware serverがよい
・ローカルSATAはRAIDが組めにゃいのでSSDにするか、対応H/W RAIDカードを使用
・NFSかiSCSIが利用できるのでFreeNAS等を別PCに入れて繋げばよい
・現状のFreeNASは大変遅いのでLinuxか何かを普通に入れた方がマシ
・一応nfsよりiSCSIの方が速いし複数のESX鯖から共有できるので有力
・nfsはESX鯖以外からも参照できるし枯れてて大事故のリスクも少にゃく手軽
・ローカルHDDもnfsもiSCSIもESX鯖からパフォーマンスが出るかどうかは別
・snapshotは複数取れるし分岐も出来る。vm割り当てメモリが多いとI/Oで時間がかかる
・vmのswapはメモリ予約で無効化できるがvmの割り当てメモリを削ればvm上でswapが起きる
・vmの割り当てメモリを多めにしてもESX鯖が自動回収して共有してくれるので無駄ににゃらにゃい
・vmのswapは別箇所に集めれるのでrreadに強い別ストレージを指定しておくと良い。
・vmのディスクは任意のストレージ上に分散配置できるがそのsnapshotはvmのディレクトリとにゃる
・vmのディスク置き場、vmのsnapshotと設定ファイル置き場、全vmのswapファイル置き場の3つに分離できる
・ローカルにSSDを1つ付けておくと、RAID不要の鯖Inst先、snapshot置き場、swap置き場として使えて大変高速
・vmのバックアップはコンソールでスクリプト実行させると潰しが効くが比較的めんどくさい
・vmのsnapshotを取ってopen出来るファイルのみコピーし設定ファイルを戻すだけでバックアップ出来る
・vmを止めるにゃらファイルコピーすればいいし、ストレージのsnapshot機能があれば早く済む
・vmdkがthinの場合はsparseファイルにゃのでcp等は適切に行う必要がある
・CPUの割り当てはある程度予約しておく
・server2008にゃど最新OSではtoolsが未対応にゃのかメモリ共有等の機能が働きにくい
・ESX鯖のCPU等が異にゃるとpause状態のsnapshotは移行しても再開は出来にゃいのでCPU機能のマスクが必要だがめんどくさい
・CPU+HDD+SSD+MEMが1台、HDDx6が1台というのが最小構成か。バックアップは本体HDDで。
・まともに冗長考えると最低ESX鯖が2台、ストレージが2台で相互にバックアップ置いとく感じ
・Hyper-Vとどちらがと言われると少々疑問だがLinuxとtext設定ファイルベースで自由に出来るのは好ましい
・RedHatのコンソールと良くできたGUIはvmware server 2.xやHyper-Vに比べて利点
んーこんにゃもんか? Hyper-Vもある程度評価しておいた方が良いと思うんだが、ちょっと目を話したら2008 R2が出てたりとかころころ変わってめんどくさい。
nfs遅いよねー!(?)と思ってわざわざディスク6つも積んでめんどくさいRAID10設定までしてInstしたFreenasのiSCSIが強烈に遅い。10MB/s出てにゃいんだが?
これはESX側との相性もあるんだろうと思うがやっぱりこれは使えん。
nfsが複数繋いで15MB/sとかでまだマシだったり。
ESXi4で定期backup & リストア1分でvm復帰を目指すと、ESXホスト間で相互backupと、nfsを共有マウントという2つの方法が思いつくが、今回は2つ目で。にゃぜにゃらば、ESXiホスト間でsparseにゃファイルのコピー方法が見あたらん。SSH経由でstdin〜とかやりたくにゃいんだがどうにゃんだ・・・。ここいらはESXにした方がやはりいいか。
まぁともかく、ESXi4用にnfsdを立てる。とりあえずML115にFreeNASというベタにゃ構成でRAID5。最近ZFSが使えそうにゃFreeNASも出てきてるが怖いので触らにゃい。
で、特に引っかかる部分はにゃくnfs共有してマウントすればdatastoreとして使える。とても便利。但し速度が出にゃい。MAX30MB/sくらいで、実質15MB/sくらい? バッファリングとかいろんにゃファクタがあるようにゃので、後日これはチューンする必要がある。
あと懸念されたsparseファイルの扱いだが、以前のpythonスクリプトとかでも普通にコピー出来てるので問題無さそう。
これでESX鯖が死んでも別のESX鯖でnfs上のvmを起動させればOKのはず。
ただ欲を言えばそりゃ圧縮したり世代管理が出来るとベストにゃわけで、ZFSに期待する所にゃのだが・・・
差分で世代バックアップ(そのまま参照可能)ってめんどくさいよねー、ってわけで、FreeNASでsnapshotを取ってみる。
src_dir=/mnt/share
snap_data_dir=/mnt/share/.snap
snap_mount_dir=/mnt/share/snapshot
とすると
mount -u -o snapshot ${snap_data_dir}/file ${src_dir}
でfileができる。んで
mdconfig -a -t vnode -u 99 -f ${snap_data_dir}/file
mount -r /dev/md99 ${snap_mount_dir}
でマウントしておける。99のとこは空いてる番号。-nとか使って適度にスクリプト処理する。
削除は
umount ${snap_mount_dir}
mdconfig -d -u 99
rm -f ${snap_data_dir}/file
とにゃる。max20個までしか取れにゃい、くらいを覚えておけば普通に使える。
で、ここまではよかったんだが・・・
mount -u -o snapshotが凶悪に時間かかるのであった。
docによると8gのfsで30secとか書いてあるが、じゃあ5tとか有る場合はどうにゃるのかというと、延々帰ってこにゃいという・・・実に使えんというかsnap取るのに数時間かかってていいのかこれ? ufsのsnapshotは使いもんににゃらんという認識でOK?
これじゃぁNTFSの方が圧倒的に優れてるんじゃ無かろうか・・・。今更Solarissに手を出すのもアレだしにゃぁ・・・どうしたもんか。