QNAPやSynologyのアプライアンスを買わず自前でNAS構築したい。しかも、ディスクのファイルシステムは堅牢さが期待できるZFS。この記事は、そんな人向けの構築手順紹介です。極力、前フリ以外うんちくは廃して手順メインにしました。
この記事の見出し一覧
ZFSの機能でRaid同等を実現
私的に構築前ずっと勘違いしてたのは、ZFSとRaid10の共存。Raid10で構成したい+ZFSでも構築したいと考えたものの、2つのキーワードでググっても両立するようなノウハウは無く、、、結論として「ZFSの機能でミラー(仮想デバイスで設定)組み合わせをストライピング(マネージメントで設定)すればよい」ということだった。これがRaid10相当になるということ。
ZFSに詳しい人から言えば、( ゚Д゚)ハァ?無知だなってことだけれど。ZFSの奥は深く、多機能だと実感。そして筆者の場合、ZFSで2018年現在5年以上トラブル無しという信頼性が見逃せなかった(Raid10のように構成したのは今回初)。
ファイルシステムをZFSにしなければ、NAS4Free上でソフトウェアRaidとして、Raid10設定することもできるけれど、今は無きSunの遺産を使いたいってのも大きな理由(Oracleのモノではない!w)。さらに、コマンドオプションがとてもシンプルなので比較的オペミスしずらいところも大きい。
以下は、バージョン11.1.xで「GUI操作のみでZFS構築」を行った手順です。
注:ここで挙げているZFS設定はGUI優先の一例です(XigmaNAS対応)。
ディスク「マネージメント」
「ディスク」→「マネージメント」でOSから見えるディスクを追加登録します。ここでは4台のディスクが対象の例です。
設定すべきは、対象「ディスク」の選択が必須で、今回の場合はS.M.A.R.T.の有効化をしています。最後で少し触れますが、S.M.A.R.T.を有効にしたいためESXi上でRDM設定をしました。
上記を4回(4つのディスク)繰り返します。なお、今回の例ではESXi上でRDMマウントをさせています。理由は後述にて。
上記のようになっていればOK。ここまででディスクマネージメントの完了です。
ZFS「仮想デバイス登録」
「ディスク」→「ZFS」→「仮想デバイス」をたどります。
4台のうち2台ずつを「MIRROR」設定で束ねます。ここでは、「vdev1」「vdev2」などと記載していますが任意の名称です。
ZFS「マネージメント」
「名前」項目を任意の名称にして「仮想デバイスリスト」に表示されている、ここでは「vdev1」「vdev2」を選択して各ミラーしたものをストライピングとして設定すれば完了です。名前の「nas」は任意の名称です。
ZFS「データセット」
最後に「データセット」で「プール」として設定します。名前(プール名)の「nas」は任意のものです。
ここまででZFS設定が完了です。「ボリューム」は使ってません。
CIFS/SMB設定
最後に、CIFSなどのサービス設定をすればWindowsネットワークで次のようにフォルダ表示されます。この記事はZFSのGUI設定がメインのため端折ってます。
あと、ZFSなのでメンテ設定として次のようにScrubをCron登録しておけば、予兆把握に安心です。
ScrubのCron登録
定期的にScrub(ファイルシステム整合性チェック)するのがおすすめです。
以下のコマンドラインは、「nas」の個所を各自のプール名に置き換えです。
以上の設定後、ZFS情報を確認すると次のようになっています。
アップデートしても影響がないように、ブートディスク外に次のようなスクリプトを置いておけば、Cron実行も安心です。
nas4free: ~# cat /mnt/nas/datastore/bin/status.sh #!/bin/sh /sbin/zpool status -v /sbin/zpool iostat -v /usr/local/bin/zfs-stats -E nas4free: ~#
ここで使用しているディスクは3GbpsのSATA接続のため、Scrubが9時間超と比較的遅め、などということも上画像から分かります。下画像のように、その最中はCPU負荷もかなり上がっており、本環境の場合消費電力もちょうど10W増えてます(常用している別ツールMuninでモニタリングの例)。
ちなみに、16TBのプールでガリガリディスク読み書きし続けると、メモリー16GBでも少なくスワップも発生する事態。いや、日常的に16GBでは足りないようで(下画像のように)。さすがリソース食いのZFSだけれど、本構成でも常に80MB/秒超のスループットで満足度は高いです。
munin-node、Zabbix Agentを自動インストール
アップデートするとまっさらになってしまうので、モニターアプリ(Munin/Zabbix)は起動時にインストール&設定するようにスクリプトを用意した。
nas4free: ~# cat /mnt/nas/datastore/bin/app_start.sh #!/bin/sh /usr/local/sbin/pkg install -y munin-node /usr/local/sbin/munin-node-configure --shell | sh -x echo "host_name nas" >> /usr/local/etc/munin/munin-node.conf echo "allow ^192\.168\.xx\.xx$" >> /usr/local/etc/munin/munin-node.conf /usr/local/etc/rc.d/munin-node onestart echo 'munin_node_enable="Yes"' >> /etc/rc.conf ln -s /mnt/nas/datastore/bin/plugin/zfs_cache_efficiency /usr/local/etc/munin/plugins/zfs_cache_efficiency ln -s /mnt/nas/datastore/bin/plugin/zfs-stats-for-freebsd-cache-hits-by-cache-list /usr/local/etc/munin/plugins/zfs-stats-for-freebsd-cache-hits-by-cache-list ln -s /mnt/nas/datastore/bin/plugin/zfs_stats_ /usr/local/etc/munin/plugins/zfs_stats_ ln -s /mnt/nas/datastore/bin/plugin/zfs-stats-for-freebsd-cache-hits-by-data-type /usr/local/etc/munin/plugins/zfs-stats-for-freebsd-cache-hits-by-data-type ln -s /mnt/nas/datastore/bin/plugin/zfs_usage_ /usr/local/etc/munin/plugins/zfs_usage_ ln -s /mnt/nas/datastore/bin/plugin/zfs-stats-for-freebsd-dmu-prefetch /usr/local/etc/munin/plugins/zfs-stats-for-freebsd-dmu-prefetch ln -s /mnt/nas/datastore/bin/plugin/zfs-filesystem-graph /usr/local/etc/munin/plugins/zfs-filesystem-graph ln -s /mnt/nas/datastore/bin/plugin/zfsarcstats-counters /usr/local/etc/munin/plugins/zfsarcstats-counters ln -s /mnt/nas/datastore/bin/plugin/zfs-stats-for-freebsd-arc-efficiency /usr/local/etc/munin/plugins/zfs-stats-for-freebsd-arc-efficiency ln -s /mnt/nas/datastore/bin/plugin/zlist /usr/local/etc/munin/plugins/zlist ln -s /mnt/nas/datastore/bin/plugin/zfs-stats-for-freebsd-arc-utilization /usr/local/etc/munin/plugins/zfs-stats-for-freebsd-arc-utilization ln -s /mnt/nas/datastore/bin/plugin/zpool_iostat /usr/local/etc/munin/plugins/zpool_iostat /usr/local/sbin/pkg install gawk /usr/local/etc/rc.d/munin-node restart /usr/local/sbin/pkg install -y zabbix4-agent /bin/cp /usr/local/etc/zabbix4/zabbix_agentd.conf.sample /usr/local/etc/zabbix4/zabbix_agentd.conf sed -i '' -e 's/Server=127.0.0.1/Server=192.168.xx.xx/' /usr/local/etc/zabbix4/zabbix_agentd.conf sed -i '' -e 's/ServerActive=127.0.0.1/ServerActive=192.168.xx.xx/' /usr/local/etc/zabbix4/zabbix_agentd.conf sed -i '' -e 's/Hostname=Zabbix\ server/Hostname=nas/' /usr/local/etc/zabbix4/zabbix_agentd.conf sed -i '' -e 's/\#\ EnableRemoteCommands=0/EnableRemoteCommands=1/' /usr/local/etc/zabbix4/zabbix_agentd.conf echo "UserParameter=zpool.health[*],zpool list -H -o health $1" >> /usr/local/etc/zabbix4/zabbix_agentd.conf echo "UserParametor = zpool.size[*], zpool list -H -p -o size $1 >> /usr/local/etc/zabbix4/zabbix_agentd.conf echo "UserParametor = zpool.capacity[*], zpool list -H -p -o capacity $1 >> /usr/local/etc/zabbix4/zabbix_agentd.conf /usr/local/etc/rc.d/zabbix_agentd onestart /usr/local/sbin/pkg install -y zfs-stats nas4free: ~#
ただし、よく推奨されているembeddedインストールの場合は、/usr/local がパッケージ追加で100%必至。このため、OS Fullでシステム再インストールするのがよく、Fullインストールで最初の方に問われるOSパーティション容量を大きく確保しておけばパッケージをいろいろ追加できるので安心。
MuninでもZFS状況が分かるから助かる。たいした使ってない稼働状況も。。。
ディスクはS.M.A.R.T.監視のためESXi上でRDMに
S.M.A.R.T.監視したいため、ESXi上ではRDM(Raw Device Mapping)マウントさせている。多くの事例では、RDMにするのはVMDKでなくRAWディスクとしてマウントさせたほうがパフォーマンスやESXi環境からディスクを抜いても使えるという解説が多い。しかし筆者の場合は「S.M.A.R.T.監視したい」理由のみだった。