技術

FreeNAS + ZFS + AFTでマシン間ディスク移動で起きた問題

メモ。一応解決方法まで。

最近の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自体のファイルを守る能力は信頼しています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください