逸般の誤家庭でパリピな鯖を飼おう
この記事は、FreeBSD Advent Calendar 2019のために書き下ろしました。
TL;DR
逸般の誤家庭に NAS を FreeBSD で組んで 置こう よ。簡単だよ。でも、お金はかかるかもよ。というお話です。
きっかけ
我が家には、サーバールーム(以下鯖部屋)があり、ちょっと だけ逸般しています。昔は対外回線も2本あったのでさらに逸般してたのですが、さすがに回線はまとめてしまった。だってお高いんですもの。
さて、鯖部屋には、仮想環境構築用にXCP-ngが動いている鯖とかプリンタとかJetson-nanoとか色々な子が鎮座在しましておられるのですが、その中にボスのような存在の、しかし表からは見えない(見せていない)とても重要な鯖が居られまする。それが NAS。
このNASは、鯖部屋の仮想環境にStorageを供給するのみならず、バックアップデータの保存所にもなっているので、非常に重要な鯖なのです。生き腐れたら困ってしまうのです。だって(ほぼ)すべての環境が…
そう、このNASの電源が壊れたのが全ての始まりだったのです。
壊れた話とか、一時的無理やりな復旧の話とか、そういういろいろは全部すっ飛ばして、本題の「パリピなNAS鯖を逸般の誤家庭で飼う」部分のみを切り出すことにします。
パリピなNAS とは
Google様で検索してもBing様で検索してもDuckDuckGo様で検索しても「パリピなNAS」なんてパワーワードは結果に出てきません。(この記事だって「パリピな鯖」としか書いてないし、「パリピな鯖」としても検索には出てきません。あしからず。)
今回NASを作るにあたり考えたのは、
- とりあえず5年は安定して使いたい
- 十分な容量と性能を確保したい
- とりあえず、今のIntelCPUはAMDよりもCPU Microcode Patchが多そうで、Updateに不安が…。せっかくだからAMD使う
の3点です。なので、清水の舞台から飛び降りるつもりで以下の部材を揃えました。
- CPU
- AMD Ryzen 3700X x1
- Memory
- DDR4-2666 32GB x4
- MB
- ASRock X570 Taichi x1
- Case
- 5.25inch Bay x9なもの x1
- Case
- 5.25Inch 3Bayに搭載する、2.5Inch HDDx12搭載可能かつHotSwap可能なDiskマウンタ x1
- Case
- 5.25Inch 3Bayに搭載する、3.5Inch HDDx4搭載可能かつHotSwap可能なDiskマウンタ x2
- SSD
- 4T SSD(WD Red) x 12
- HDD
- 4T HDD(WD Red) x8
- NIC
- Intel 10G 2port x1
- NIC
- Intel 1G 2port x1
- HBA
- Broadcom MegaRAID SAS9361-16i x1
- Video
- GeForce GT610 1GB x1
ええ、贅沢しました。かなり贅沢であることは間違いないです。はい。
これがパリピなNASの諸元です。はい。え?全然パリピじゃ無い?、ではお見せしましょう。
こんななんです。はい。ファンがとっても「パ・リ・ピ」でしょ?
実は調子に乗って、ケースに追加のファンをつけましたが、これもLEDファンです。これをみた娘が「パリピなファン」と言ったんです。そして組み上がったPCを見て、「パリピなPC」と言ったんです。このマシンはNASになるのだから、このマシンは「パリピなNAS」ということになります。(異論は聞きません)
ケース正面のDiskマウンタが、全部「高輝度青色LED」なので、目が痛いです。ブルーライトカット眼鏡が要りそうな勢いです。
FreeBSDでNAS
さて、ここからはちょっと真面目にいきましょう。
今回作成するNASは以下のような実装でいきます。
OS | FreeBSD 12.1-RELEASE |
---|---|
FileSystem(Boot) | 250GB SSD / UFS |
FileSystem(供給ストレージ用) | SSDのみを束ねたZpool(Zssd)とHDDのみを束ねたZpool(Zhdd)の二つ |
XCP-ngに供給するStorage(仮想Disk用) | iSCSI |
XCP-ngに供給するStorage(インストーラーイメージ用) | NFS (v3)(本記事では扱わない) |
iSCSIを供給するI/F | 10G(ixgbe)を2本Link Aggregation(LAG)し、Jumbo Payload(9000)で利用 |
NFSを供給するI/F | 1G(em)を2本LAGして利用(本記事では扱わない) |
OSのInstall
FreeBSDのInstall方法はここでは取り扱いません。https://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/bsdinstall.html や、FreeBSD利用者のための情報共有など様々な場所で情報ややり方が公開されているので、探してみてください。
今回のシステムは、基本的に、OSのDistributionだけで、ほとんどの部分が構築できます。実際、自分が使っているDistributionに含まれないツールは
- sudo (doasに移行したいがまだなにもしてない)
- smartmontools (Diskの S.M.A.R.T 情報を取得するために導入
だけです。これらをpkgからInstallするだけです。
将来、SAMBAに対応させたいという気持ちもあるのですが、それはVMから供給する手もあるかなぁ...
OSの設定
インストールが済んだら、OSの設定です。
この記事はあくまでパリピな鯖を飼うことが目的なので、細かい設定は書きません。ちょっと気をつけておくと幸せなところだけをピックアップします。
/etc/sysctl.conf
10GNICをJumbo Payload で利用するので、以下の設定を投入する
kern.ipc.nmbjumbo16=262144 kern.ipc.nmbjumbo9=262144 kern.ipc.nmbjumbop=262144 kern.ipc.nmbclusters=262144 hw.intr_storm_threshold=9000 net.inet.raw.maxdgram=16384 net.inet.raw.recvspace=16384
/etc/rc.conf
当然NICにJumbo Payload設定を投入する必要があります。ただし、Jumbo Payloadを利用する場合には、以下の点に注意が必要です。
- PCだけJumbo Payloadの設定をしても、Switch側のMTUが1500では意味がありません。トラブルの元となります。Switch側のMTUも9000以上に設定しておくこと
- 私の場合、SwitchがApresia社の機器なので、MTUを9044に設定してあります。
- 同一セグメントに接続している全てのInterfaceでMTUを同じ値(今回は9000)に揃えましょう。
- 今回利用しているIntel NICは、Payloadとして最大で16114 Byteにすることができます。しかし、Switchの都合で、9000 Bytesに設定します。
cloned_interfaces="lagg0" ifconfig_ix0="mtu 9000 up" ifconfig_ix1="mtu 9000 up" ifconfig_lagg0="laggproto lacp laggport ix0 laggport ix1 mtu 9000 inet 192.0.2.11/24"
Zpool/ZFS の作成
今回のパリピNASのようなDiskの多いマシンの場合、Diskが壊れることを常に考えておく必要があります。
壊れることに対処するには、
- RAIDのような「対故障性の高い」形式を利用する → 今回はRAID-Z2を利用
- 壊れたDiskを交換する際に分かりやすいようにする準備を整える → gpartを利用して、Disk自体にラベルをつけておく
- 壊れたときに交換しやすいように、HotSwapできる構成をとる → ケースは全て HotSwap 可能なものを選択
といった準備が必要になります。
- gpartでlabelつけを行う
- 一例として、Boot用のSSD(250G)にlabelを割り当てる場合を以下に記載します。
# gpart add -l sata1p1 /dev/ada0p1 # gpart add -l sata1p2 /dev/ada0p2 # gpart add -l sata1p3 /dev/ada0p3
- diskに割り当てたlabelをみたい場合、
gpart show -l
などとしてください。 # gpart show => 40 488397088 ada1 GPT (233G) 40 409600 1 efi (200M) 409640 479838200 2 freebsd-ufs (229G) 480247840 8149288 3 freebsd-swap (3.9G) # gpart show -l => 40 488397088 ada1 GPT (233G) 40 409600 1 sata1p1 (200M) 409640 479838200 2 sata1p2 (229G) 480247840 8149288 3 sata1p3 (3.9G)
- ここで割り当てたlabelは
/dev/gpt/sata1p1
のような形で利用することができます。fstabなどで指定するDisk名にも利用できるので、便利です。
- RAID-Z2でFilesystemを構築する
- NASの場合、特にatimeをonにしておくと遅くなるので、atimeはoffにしておくことをお勧めします。
- 今回は、新規SSD 12台でRAID-Z2を構築する場合を記載しますが、HDDでも手順は同様です。
# : # GPTにしてLabelをつける # for i in `seq 0 11`; do j=`expr ${i} + 1` gpart create -s gpt da${i} gpart add -t freebsd-zfs -l ssd_hba${j} da${i} done # : # RAID-Z2 SSD poolを作成する # mkdir /zfs # zpool create SSD raidz2 /dev/gpt/ssd_hba* # : # iSCSI export用のzvolを構築する # zfs create -o volmode=dev -V 16T SSD/zvol
これで、iSCSI用ZFS Volumeが完成します。
NASとしての設定
ここまでできれば、あとは iSCSI Targetとしての設定を行うだけです。
FreeBSDでは、Systemに当初からiSCSI Targetになるためのdaemonであるctldがあるので、その設定を行います。
/etc/ctl.conf
ctldは、設定ファイルとして /etc/ctld.conf
を読み込むので、ctld.confを設定します。
詳しい内容はmanページを見てくださいね。
# # ctl.conf : FreeBSD iSCSI target configuration # # iSCSI portal configuration portal-group pg0 { discovery-auth-group no-authentication listen 192.0.2.10:3260 } # iSCSI target configuration target iqn.2018-05.org.dsk.example:target0 { alias nasvol auth-group no-authentication portal-group pg0 lun 0 { device-id zvol12t serial 1 path /dev/zvol/SSD/vol } }
そして、/etc/rc.confに以下の行を追記します。
ctld_enable="YES"
終わりに
えー、とても長くなりました。それでもNFSには到達できませんでしたし、文章も下手ですね。すみません。疲れたでしょう?
パリピなNASを動かし始めてそろそろ2週間が経つのですが、とても快適です。 というよりも、このNASの限界性能を要求するような状況が未だ発生していないのですが、置き換え前のNASよりも反応が早くて(当たり前だよ)とても快適になりました。
一つだけ問題があるとすると、深夜でも鯖部屋に入ると七色の電飾が延々回り続けるPCのおかげで、部屋の中の雰囲気がとても怪しいことです。 正直、押し込める場所を持たない一般のご家庭では、24時間稼働はちょっと悩ましいところでしょうか。
でもいいんです。今回の記事は「逸般の誤家庭に置く」NASなのですから。
FreeBSDはLinuxに比べて大変にマイナーな、情報も集めにくいOSですが、様々なNetwork系サーバーを構築するには軽くてキビキビ動く、とても可愛いOSです。 興味を持つ方が増えたら幸いです。
今回は生NASを生に作ってみましたが、XigmaNASというFreeBSDを元にしたフリーのNASアプライアンスもありますから、興味があればどうぞ。
是非是非機会があれば試してみてくださいね。
それでは〜