メモ。一応解決方法まで。
最近のFreeNASはWebGUIでチェックボックスを一つオンにするだけで、AFTなHDDに対応したZFS仮想デバイスを作成できますが、そのディスクを別のマシンに移動すると問題が起きるかも知れません。
今回はディスク(FreeNAS本体: USBメモリ、ZFS raidz2プール: WD20EARSx6)を別マシンに移設した際の問題です。
FreeNASでAFT対応にした場合、ZFSによるディスクアクセスと実ディスクの間で、NOP GEOMクラスによる4kセクタアクセスをするように内部的に設定されます。
また、(FreeNASでは普通にやるとそうなると思いますが)ディスクをまるごとZFS用にした場合、GPT等でパーティションが切られる事はありません。
上記のようにパーティションを切らずにディスクを直接使いつつNOP GEOMクラスを使うという事は、例えば
/dev/ad10
/dev/ad10.nop
という2種類のデバイスファイルで全く同じデータにアクセス出来るということです。
もちろんad10.nopの方は4kセクタアクセスを行うので速く、ad10は遅いという事になります。
そしてFreeNASではAFTに対応したZFS仮想デバイスを作る際に〜.nopのデバイスが利用されます。
再起動しても当然ながら〜.nopのデバイスを使ったzpoolが自動的にimportされます。
この「再起動してもちゃんと〜.nopの方のデバイスが使われる」のは、ZFSの構成キャッシュ(/boot/zfs/zpool.cache)のおかげらしいですが、このzpool.cacheはどうもデバイス名に依存しているみたいです。
あと、FreeNASが起動時に自動的に〜.nopを作成してくれるから、でもありますがやはりその処理もデバイス名に依存してるようです。
つまり、デバイス名が変わるとプール自体は正常にimportされるが 〜.nopのデバイスが使われなくなり、パフォーマンスの低下を招くということです。
もう少し細かく書くと、
1. マシンを移動したりしてディスクのデバイス名が変わる。
2. 新しいデバイス名で〜.nopが作成されない。
3. 新しいデバイス名がzpool.cacheに乗ってない。
4. zfsにより自動的に構成ディスクの検索が行われる。
5. 〜.nopが作成されていない新しいデバイス名のディスクが見つかる。
6. 4kアクセスするかしないかの差はあるがデータ自体は同じなので.nop無しのデバイスが(ある意味)無事使われる。
という事みたいです。
具体的には自分の場合は以下のようになりました。
移設前
freenas:~# zpool status pool: tank state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz2 ONLINE 0 0 0 ad4.nop ONLINE 0 0 0 ad6.nop ONLINE 0 0 0 ad8.nop ONLINE 0 0 0 ad10.nop ONLINE 0 0 0 ad12.nop ONLINE 0 0 0 ad14.nop ONLINE 0 0 0 errors: No known data errors
移設後
freenas:~# zpool status pool: tank state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz2 ONLINE 0 0 0 ad10.nop ONLINE 0 0 0 ad12.nop ONLINE 0 0 0 ad14.nop ONLINE 0 0 0 ad16 ONLINE 0 0 0 ad18 ONLINE 0 0 0 ad20 ONLINE 0 0 0 errors: No known data errors
で、これをどうやって全て.nopを使うようにするかですが、
まずエクスポート
zpool export tank
必要な/dev/*.nopが全てあるか確認
ls /dev/*.nop
足りなかったら以下のようにして必要なだけ作成
gnop create -S 4096 ad16
gnop create -S 4096 ad18
gnop create -S 4096 ad20
ディレクトリを作って.nopを隔離(zpool statusで.nopになってないもののみ。)
mkdir devnop
ln -s /dev/ad16.nop devnop/
ln -s /dev/ad18.nop devnop/
ln -s /dev/ad20.nop devnop/
devnopディレクトリを優先的に検索させimport
zpool import -d devnop tank
freenas:~# zpool status pool: tank state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz2 ONLINE 0 0 0 ad10.nop ONLINE 0 0 0 ad12.nop ONLINE 0 0 0 ad14.nop ONLINE 0 0 0 ad16.nop ONLINE 0 0 0 ad18 ONLINE 0 0 0 ad20 ONLINE 0 0 0 errors: No known data errors
一つずつしか.nopが使われないので今回使われた.nopを消して以下を必要なだけ繰り返す。
zpool export tank
rm devnop/ad16.nop
zpool import -d devnop tank
zpool status
最終的に全部.nopになったら、exportして、devnopディレクトリを消して普通にimportしてみる。
zpool export tank
rm -r devnop
zpool import tank
freenas:~# zpool status pool: tank state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz2 ONLINE 0 0 0 ad10.nop ONLINE 0 0 0 ad12.nop ONLINE 0 0 0 ad14.nop ONLINE 0 0 0 ad16.nop ONLINE 0 0 0 ad18.nop ONLINE 0 0 0 ad20.nop ONLINE 0 0 0 errors: No known data errors
全て.nopが使われるようになってるはず。
結局はzpool.cacheを作ってるだけですが、これ以上いい方法が思い浮かびませんでした。
あとはzpool export tankをし、FreeNASのGUIで一旦ディスクやZFSの情報を全て削除した後、ZFSの同期を行い、新しい構成をGUIに反映させる。
そのままではGUIでAFT(ディスク→ZFS→プール→仮想デバイス→編集アイコン→Advanced Format)が無効になってると思うのでGUIでAFTが有効になってないと再起動時にgnop createが自動的に行われない)、システム→バックアップ/リストアで設定のXMLファイルをダウンロードした後、そのファイルをAFTを有効にするように書き換えて、リストアすればOK。
どう書き換えるかはAFTが有効な環境の設定XMLとdiffをかければすぐ分かると思う。
(このへん端折り過ぎなので要望があれば説明します)
今回の問題はデバイス名が変わっても問題なくimportできるというZFSの柔軟性が逆にあだになった感じですかね。
ただ、ZFSにはいろいろ問題はありますが、どの問題もほとんどがZFSに対応しきれてない周辺環境との間での問題であって、ZFS自体のファイルを守る能力は信頼しています。
最近のコメント
名前
しゅごい
Jane Doe
FYI Avoid Annoying Unexpe…
Jane Doe
ご存じとは思いますが、whileには、”~の間”と…
peta_okechan
針金みたいなパーツを引っ張ると外れます。 他の方の…
虎徹ファン交換
虎徹の標準ファンを外す際に、どのようにして外されま…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…