目次

逸般の誤家庭でパリピな鯖を飼おう

この記事は、FreeBSD Advent Calendar 2019のために書き下ろしました。

TL;DR

逸般の誤家庭に NASFreeBSD で組んで 置こう よ。簡単だよ。でも、お金はかかるかもよ。というお話です。

きっかけ

我が家には、サーバールーム(以下鯖部屋)があり、ちょっと だけ逸般しています。昔は対外回線も2本あったのでさらに逸般してたのですが、さすがに回線はまとめてしまった。だってお高いんですもの。

さて、鯖部屋には、仮想環境構築用にXCP-ngが動いている鯖とかプリンタとかJetson-nanoとか色々な子が鎮座在しましておられるのですが、その中にボスのような存在の、しかし表からは見えない(見せていない)とても重要な鯖が居られまする。それが NAS

このNASは、鯖部屋の仮想環境にStorageを供給するのみならず、バックアップデータの保存所にもなっているので、非常に重要な鯖なのです。生き腐れたら困ってしまうのです。だって(ほぼ)すべての環境が…

そう、このNASの電源が壊れたのが全ての始まりだったのです。

壊れた話とか、一時的無理やりな復旧の話とか、そういういろいろは全部すっ飛ばして、本題の「パリピなNAS鯖を逸般の誤家庭で飼う」部分のみを切り出すことにします。

パリピなNAS とは

Google様で検索してもBing様で検索してもDuckDuckGo様で検索しても「パリピなNAS」なんてパワーワードは結果に出てきません。(この記事だって「パリピな鯖」としか書いてないし、「パリピな鯖」としても検索には出てきません。あしからず。)

今回NASを作るにあたり考えたのは、

の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に含まれないツールは

だけです。これらを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を利用する場合には、以下の点に注意が必要です。

  1. PCだけJumbo Payloadの設定をしても、Switch側のMTUが1500では意味がありません。トラブルの元となります。Switch側のMTUも9000以上に設定しておくこと
    • 私の場合、SwitchがApresia社の機器なので、MTUを9044に設定してあります。
  2. 同一セグメントに接続している全ての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が壊れることを常に考えておく必要があります。

壊れることに対処するには、

といった準備が必要になります。

  1. 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名にも利用できるので、便利です。
  2. 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アプライアンスもありますから、興味があればどうぞ。

是非是非機会があれば試してみてくださいね。

それでは〜