久しぶりに古いpoolを触ってビビる

 ZFSのpoolのメンバーのハードディスクがS.M.A.R.T.エラーを出していたので交換しようとしたら"devices have different sector alignment"とかいうエラーが出て失敗。

# zpool replace zhome /dev/disk/by-id/ata-WDC_WD20EARS-00S8B1_WD-WCAVY2554993 /dev/disk/by-id/ata-WDC_WD30EZRZ-00Z5HB0_WD-WCC4N5LNLKLU
Defaulting to 4K blocksize (ashift=12) for '/dev/disk/by-id/ata-WDC_WD30EZRZ-00Z5HB0_WD-WCC4N5LNLKLU'
cannot replace /dev/disk/by-id/ata-WDC_WD20EARS-00S8B1_WD-WCAVY2732416 with /dev/disk/by-id/ata-WDC_WD30EZRZ-00Z5HB0_WD-WCC4N5LNLKLU: devices have different sector alignment

えっなにそれ。そんなエラー初めて見たぞ。
調べてみると新しいハードディスクはAFT(アドバンスド・フォーマット・テクノロジー)なのにpoolを作った時にはAFT以前のハードディスクで作ったものだからセクタサイズとアラインメントが合っていないのが原因だった。

アラインメントはzdbコマンドで確認できる。

# zdb | grep ashift
ashift: 9

いっぽう、AFTのハードディスクを使う場合はashift=12に設定するとパフォーマンスが下がらなくて良いとされている。そして一度作ってしまったpoolのアラインメントは変更できないのでAFT登場後、oshikojiは新しくpoolを作るときにはashift=12に設定している(全部AFT以前のハードディスクで構成するときも)。だから今までアラインメントが違うので置き換えられない、というエラーを見たことがなかったのだ。
こういう時はAFTのハードディスクを強制的にashift=9に設定して使えるようだ。

# zpool replace zhome /dev/disk/by-id/ata-WDC_WD20EARS-00S8B1_WD-WCAVY2554993 /dev/disk/by-id/ata-WDC_WD30EZRZ-00Z5HB0_WD-WCC4N5LNLKLU -o ashift=9

パフォーマンスは低くなってしまうかもしれないが、まあいいだろう。
 ところで、このpoolはいつ作られたものなのだろう?zpool historyコマンドで見てみよう。

# zpool history zhome
History for 'zhome':
2009-09-10.20:59:59 zpool create -f zhome raidz2 ad4 ad6 ad8 ad10 ad12 ad14

ほほー。2009年に作成したpoolでしたか。AFTが出だしたのは2011年らしいので意識せずに作ってますわな。