2022年1月22日土曜日

ZFSで沼にはまって、データ移行の際にデータをロスト仕掛けた話

こんにちは、白虎21です。

皆さんは ファイルサーバを立てているでしょうか?

ご自身の手でファイルサーバを建てるなら、OSの候補に上がるのがLinuxかBSDだと思います。

その中で私はdebianを選択しました。


1.ファイルシステムとRAIDシステムの選定

それではファイルシステム(FS)は何が良いでしょうか?

Linuxだとext2,3,4やXFS,BtrFS,etc...たくさんあります。

ファイルサーバとなるとRAID組みたくなりますよね?

ただ、RAIDと聞くと、私の中では、構築が難しそうだったり、復旧が難しそうだったりと思う点がありました。そして、システムに一貫性がないと感じました。

細かいRAIDの話はArchLinuxのwikiに任せるのが一番だと思いますので、おいておきます→RAID - ArchWiki


上の憂慮した点を解消してくれるのがBtrFSとZFSでした。

私がファイルサーバを構築した際にBtrFSは当時事情があり、

「ZFSはライセンスが扱いにくいが、個人が使う分には大きく気にしなくてもよいだろう、それよりもBtrFSの技術的に問題がある方が問題である」と感じ、ZFSを選定しました。

 

2.ZFSのメリット

ZFSは簡単にストレージ(?)を作れます。

ZFSではストレージプールといいます。

これは作るのが非常に簡単です。

例えばHDD1,HDD2をつないだとします。

そうすると、

sudo zpool create tank HDD1 HDD2

でRAID 0のプールが作成されます。

もしも、RAID 1で作成したいのであれば、

sudo zpool create tank mirror HDD1 HDD2

でRAID 1のプールが作成されます。

ただ、要注意すべき点として、 HDD1やHDD2の表記に/dev/sdaなどのSATA指した順で変わるような指定の仕方はマウントの失敗などを招くため推奨されません。

/dev/disk/by-id/ata-*などのデバイスIDでの指定をおすすめします。

その他知りたい情報があれば、ArchLinuxのwikiに任せるのが一番だと思いますので、おいておきます→ZFS -ArchWiki

 

また、snapshotを取ることができます。

その他のメリットとして、Oracleと富士通の資料が充実しています。普通に扱う分には困らないでしょう()→ OracleのZFSの資料

 

3.ZFSの落とし穴

ZFSをLinuxで使うにはzfs-fuseとzfsutils-linuxがあります。

ubuntuなどで後者を使いましょう。

zfs-fuseで書かれている資料を私は見た記憶がありません。

debianは安定性を重視するので、後述するOpenIndianaやubuntuにバージョンで遅れを取っています。

特にzfs-fuseは0.70と大きく遅れを取っています。

zfsutils-linuxはdebianでも最低限2.0になっています。

システム的に今後はzfsutils-linuxしか更新されないと思うので、こちらを今後は使うようにしましょう。

 

4.ZFSでのデータ移行の失敗

私は安直に既存のプールに新しいHDDをmirrorでattachしました。

これはRAID0に当たります。

私の環境下では、つけたものは外せません。

その次に、ゴニョゴニョいじって、新しいHDDだけにして、zpoolをcreateして、古いプールからimportしました。

もとのプールにはアクセスできなくなりました。古いHDDには前のzpoolの情報が残っています。

 

mirror -

    4TBのやつ

    4TBのやつ

mirror - 

    8TBのやつ

    8TBのやつ


という情報が。

このプールの状況が

mirror -     UNAVAIL

    4TBのやつ    ONLINE

    4TBのやつ    UNAVAIL

mirror -     UNAVAIL

    8TBのやつ    UNAVAIL

    8TBのやつ    UNAVAIL


でした。

debianの環境では詰みました。

高っかいリカバリソフトは諦めました。


5.どのように復旧したか

極論、ググりました。

このサイトを参考にしました→ Turbocharging ZFS Data Recovery

ググった結果、ZFSの大元であるOracleのSolarisのOSS版のOpenSolarisの後継のOpenIndianaを用いて、最新のZFSが使える環境にして、ZFSが読み込めるか確かめました。

以下のコマンドはubuntuでは不可能でした、OpenIndianaを用いました。

zdb -dep /files -G datapool

→このコマンドで最後が「LOADED」になればOKです。

zpool import -f -d /files -o readonly=on datapool

→このコマンドで読み取りのみが可能になります。

 

 6.ZFSの移行方法

私が次、HDDの増設に失敗しないためのメモです。

ドキュメントから生成されているので必ずしも成功するとは限りません。

バックアップは取っておきましょう。

今回はnewHDD1とnewHDD2のRAID1へ移行します。

まず、新しいプールを作成します。

zpool create New_Pool mirror newHDD1 newHDD2

その後、そのプールにsend&receiveします。

zfs send Old_Pool|zfs recv New_Pool

その後、古いプールをepoxrtし、新しいものを好きな名前に変えます。

zpool export Old_Pool

zfs rename New_Pool What_You_Like_Name_Pool

 

7.その他参考資料

https://chibiegg.gitbooks.io/how-to-zfs/content/

https://ostanin.org/2013/06/14/importing-a-freebsd-zfs-pool-in-illumos/