88171.net


NASからDASへ

XigmaNASを動かしているHP MicroServer N54Lを使いはじめてから丸10年がたち、ハードウェアの寿命が気になりだした。 いざ壊れてからバタバタするのも嫌なのでリプレースを検討しはじめたのだけど、さっそく問題にぶち当たった。

とにかく、NASに適したリーズナブルなハードウェアがない。 N54Lは型落ちだったこともあり当時RACまでついて3万円未満だったが、今日日そんな値段では最低限妥協できるものすら手に入らない。 普通に見繕うと20万円コース。 嗚呼、物価高。

いっそのことNASアプライアンスという選択肢もなくはない。 なくはないのだけど、ロックインは極力避けたい。

そもそも、現状のクライアントがMac mini 1台だけであることを考えればNASである必要性が(完全にとは言わないけれど)ほとんどない。 なのでいろいろ割り切ってDASを作ることにした。


エンクロージャは、後述のとおりSATAポートマルチプライヤとして機能すればいいので正直なんでもいい。 どうせHDDを使うので接続方式やI/Oスピードにもさしてこだわりはない。 とにかく物理的なウィークポイントが少ない、頑丈な構造のものがいい。

という観点で選んで、OWCのMercury Elite Pro Dualにした。 巷にはもっと安い選択肢もあるのだけど、PCに比べたらぜんぜんお手頃なので納得できるものに。

実際に使ってみて大きな不満はないのだけど、強いてひとつ挙げるとすれば、Macのスリープとうまく連動してくれない。 どうもOWCに限らず外付けストレージにありがちな問題らしく、これといった解決法も見当たらないので、スリープを使わないことにした。 特に不便は感じていないのでよしとする。


HDDを2本積んでJBODモードにし、Time Machine用にAPFSと、雑多なアーカイブ用にZFS mirrorを載せる。

Time MachineバックアップをZFSに載せることも不可能ではなさそうなのだけど、構成が複雑になっていざリストアするときに困る気がすごくする。 あとHDD容量の個体差を吸収するバッファとしても都合がいいので、それぞれのHDDの一部をAPFSで使っている。 模式図でも描こうと思ったけれど面倒になったので、後述のコマンドラインから察してほしい。

ZFS実装にはOpenZFS on OS Xのお世話になる。 HomebrewにCaskがあるのでインストール自体は簡単なのだけど、カーネル拡張や各種ツールを動かすためにセキュリティ機構を調整する必要があって少し面倒。 行き詰まったらとにかくO3XWikiのFAQを見るのがオススメ。


構築に使ったコマンドラインを載せておく。 主にHDDを交換する将来の自分に向けたヒントなので、意味がわからないところもあるかもしれない。

パーティションの作成。 3TBのHDDを積んでいるので、それぞれ2TBをZFSに、残りをAPFSにする。 EFIパーティションは不要。 partitionDisk でいきなりAPFSを作ることはできないので、一旦JHFS+を作って変換する。 APFSはこのあと2つともTime Machineに設定しておく。

$ diskutil partitionDisk -noEFI disk${disk1_number} 2 \
    GPT %6A898CC3-1DD2-11B2-99A6-080020736631% %noformat% 2.0T \
    JHFS+ "Time Capsule ${disk1_serial}" 0
$ diskutil apfs convert disk${disk1_number}s2

ZFSストレージプールの作成。 当初XigmaNASの旧データセット(正確にはその前のFreeNASで作ったもの)をsend/recvしたらUnicode Normalizationの関係でまともに使えないことがわかったので、NFDにする。

$ sudo zpool create \
    -o ashift=12 \
    -O casesensitivity=insensitive \
    -O normalization=formD \
    ${pool_name} \
    mirror disk${disk1_number}s1 disk${disk2_number}s1

ZFSデータセットの作成。 今回Native Encryptionを使うので、あらかじめキーファイルを作成しておいてそれを読ませる。

$ openssl rand -hex 32 > ${keyfile_abspath}
$ sudo zfs create \
    -o encryption=on \
    -o keyformat=hex \
    -o keylocation=file://${keyfile_abspath} \
    ${pool_name}/${dataset_name}

あとは、旧データセットからデータを移行する。 Unicode Normalizationを変えた影響でsend/recvで移行できないので、普通にrsyncでファイルコピーした。


OpenZFSはオープンで柔軟性もあるし、半端なハードウェアRAIDなんかと比べたら信頼性も高いと思うのだけど、macOS向け実装の将来性には若干不安もある。 メンテナのJorgen Lundman氏がたしかRedditで「Appleが将来macOSのkextサポートを廃止する可能性がプロジェクトにとって最大のリスク」という主旨のコメントをしていた気がして(改めて探しなおしたけど見つけられなかった…)、エコシステム全体で見たときの不安はどうしても拭えない。 まあ現時点で他にベターな構成も思い付かないし、いざ使えなくなったらそのときに考えればいいことなので、当面お世話になります。


最後に白状すると、DASに移行したのは5月末のことで、この半年くらい草稿をこねくり回していた。 いろいろと書き足りていないことはあるのだけど、このままだと年を越えてしまいそうなので適当なところでケリをつけた。


自分が困る書き忘れに気付いたので追記。

Native Encryptionを使っていて zpool import のときにキーを自動でロードさせたい場合、-l オプションが必要になる。

-l

Indicates that this command will request encryption keys for all encrypted datasets it attempts to mount as it is bringing the pool online. Note that if any datasets have a keylocation of prompt this command will block waiting for the keys to be entered. Without this flag encrypted datasets will be left unavailable until the keys are loaded.

ZPOOL-IMPORT(8)

OpenZFS on OS Xでは /Library/LaunchDaemons/org.openzfsonosx.zpool-import.plistProgramArguments に追加する。