今回、自宅のファイルサーバを 12TB から 18TB に拡張するに当たって、XigmaNAS をインストールして使っているファイルサーバそのものを新調(とは言っても古い NUC の使い回しに新規に OS をインストールしただけですが…)し、ロジテックのハードディスクケース LHR-4BNHEU3 ももう一つ新規で用意して、既存のファイルサーバから移行することにしました。
なぜそんな面倒なことをしたかというと、何年も使い続けていて、いろいろ設定のゴミが目立ち始めたこと。XigmaNAS のあるあるなんですが、結構、間違った操作をすると GUI 上で消せない設定が、残ってしまったりします。これをすっきりさせたかったことが一つ。
もう一つは、断片化のある ZFS ファイルシステムを、一度すっきりさせたかったので、これまでは、ハードディスクケースに収容しているハードディスクを一つ一つ容量の大きいものに交換して、最後に容量を拡大してきましたが、これでは断片化も引き継がれてしまうので、今回は、丸々、新しいハードウェアを用意して、移行することにしました。
この作業に当たっては以下のサイトを参考にさせていただきました。
メモとかメモのようなものとか(By ルーキーの中のひと)事前準備
移行元となる srcHost 、移行先となる dstHost ともに、SSH でログインできる状態にしておいてください。なお srcHost では sudo で実施してもかまいませんが、dstHost では「SSH による root ユーザのログインを許可」 しておいてください(移行が完了したら不許可にすることも忘れずに)。
【手順 1 】 スナップショットを用意する
まずは移行元となるプール srcTank のスナップショットを作成します。
残念ながら、XigmaNAS の GUI 管理画面には単発でスナップショットを作成する手段がないので、移行元 srcHost に SSH でログインして、管理者権限で以下のコマンドを実行します。
zfs snapshot srcTank/srcSet@snap_yyyymmdd1
これでプール srcTank のデータセット srcSet のスナップショット snap_yyyymmdd1 が作成されます。
作成したスナップショットは GUI 管理画面でも確認できますが、以下のコマンドでも確認できます。
zfs list -t snapshot
【手順 2 】 zfs send/recv でデータを移行する
スナップショットが取り終わったらいよいよ移行開始です。
手順 1 で作成したスナップショットを、dstHost 側に以下のコマンドを、管理者権限で srcHost で実行して転送します。このとき、dstHost 側で「SSH による root ユーザのログインを許可」していないと、どうなるかわかりません w
zfs send srcTank/srcSet@snap_yyyymmdd1 | ssh dstHost zfs receive dstTank/dstSet
この時の注意点としては、事前にデータセット dstSet を作成しておく必要はありません。事前に作成すると警告されます。
また、転送元のデータセット srcSet と転送先のデータセット dstSet は同じ名前である必要はありません。データセット名を変えたいときは、転送の際の dstSet の名前を変えてください。
転送には時間がかかります。容量にもよりますが、今回は 10TB のデータセットを転送するのに、1Gbps I/F で接続された LAN 越しにほぼ丸 1 日かかりました。
【手順 3 】 移行中の差分を再度転送する
転送には時間がかかりますが、そもそもスナップショットを転送しているので、転送している間も srcHost 側の srcTank に書き込む処理をしても問題ありません。
転送が終わったら、もう一度、手順 1 と同じ要領で、スナップショットを取って、その差分を管理者権限で以下のコマンドを実行して再度転送します。
再度取ったスナップショットが snap_yyyymmdd2 として、
zfs send -i srcTank/srcSet@snap_yyyymmdd1 srcTank/srcSetA@snap_yyyymmdd2 | ssh dstHost receive dstTank/dstSet
差分だけなので、これはそんなに時間がかからずに終了します。これでデータ移行は終了です。
【おまけ】プールへログデバイスを追加する
最後に、移行が終わって使い始めてみると、USB で繋がっているディスクへの書き込みが遅い!
これは転送元は L2ARC(Layer 2 Adaptive Replacement Cache) も ZIL(XFS Intent Log) も SSD 上に設定していたので、当然と言えば当然。
と言うわけで改めて ZIL と L2ARC を設定。
XigmaNAS 自体は数 GB の容量で収まってしまうので、昨今の SSD にインストールすると、スワップを大きく設定しても容量は有り余るはずで、残りはストレージとして設定することもできますが、数十 GB だけ、特に ZIL のために容量を割くと、USB 接続のディスクへのスループットが劇的に改善します。
ZFS はジャーナリングのログ (ZIL) を分離することができ、これを SSD に書き込むようにすることで、遅いストレージの速度を改善することができます。
L2ARC は ZFS では実メモリー上に保持するキャッシュを、別途ストレージにも二次キャッシュとして用意することができ、SSD などの高速なストレージ上に容量を確保すれば早くなります。
ただし、L2ARC を追加するとそれ自身の容量に応じて、実メモリを消費しますので、実メモリに余裕がない場合は ZIL を追加するだけでも劇的に改善します。
XigmaNAS をインストールした ada0 が SSD で十分な余り容量があるなら、ssh でログインして、まず ZIL/L2ARC 用のパーティションを作成します。
gpart add -s 8G -t freebsd-zfs -l zil ada0
gpart add -s 64G -t freebsd-zfs -l l2arc ada0
として、zil と l2arc と言う名前の付いたパーティションを作成します(上記は ZIL に 8GB 、L2ARC に 64GB のパーティションを作成する例です)。
そうすると GUI の管理画面からも、[ディスク] – [ZFS] のプールのタグのツールタグから、「プールへログデバイス追加」で gpt/zil を選択して ZIL をプールに追加できます。L2ARC は「プールへキャッシュデバイス追加」で gpt/l2arc を選んで追加できます。
コマンドでも
zpool add targetTank log gpt/zil
zpool add targetTank cache gpt/l2arc
でプール targetTank にそれぞれ ZIL/L2ARC を追加できます。
以上、こんな ZFS プールをまるごと移行するなどという作業をいつやるか、もうやらないかもしれないので、もしかしたらの時の自分のためにまとめでした。