ZFS bootで,うっかり複数のrootをマウントしてしまう羽目になったら

最近,周りでHDDのクラッシュが多いので,うちのファイルサーバもZFS rootだけどroot自体はSSD単騎なのであんまりよろしくないよねと思い,raid組んでいるファイルサーバにバックパップをsend-recvでとろうとしたのが運の尽き.

現状,single user modeで入ることはないのでmountpoint=/として,ZFS bootを構築中(詳細は,前書いた記事参照 zfs bootかつCAM化 - smectic_gの日記).

この状態で,send-recvで同じマシンの別のpoolに複製を下のように作るとはまる.

zfs send -R zroot/system@20100731 | zfs recv -d tank

やりたかった事はzroot/system以下の多数あるファイルシステムのsnapshotを別のtankというプールにsnapshotとしてコピーしたいということなんだけど,どうも,この意図を反映するコマンドではなかった模様で,tank以下に全てのスナップショットがコピーされた上に,「マウントポイントがルート」の生きているファイルシステムがコピーされてしまった.

こうなっちゃうと地獄で,都合よくルートディレクトリ以下が全部コピー先のものを参照するようになればよかったのだけど,今回は本当にルートしか作業が終わった時点で認識されない状態になった.こうなると,/usr/以下のコマンドが使えない.つまり,/usr/bin/local/sudoはおろか,/usr/bin/suも使えないという状況に陥る.rootでログインできれば単純にコピーされちゃった余計なファイルシステムのmountpointをnoneにでも切り替えるだけなんだけど,ssh経由でアクセスしてるとどうにもならない.

仕方がないので,こんなこともあろうかと用意していたUSBスティックで起動して,mountpointを変更すべく,問題のpoolをimportしてしまったのが第2の失敗.importすると,自動でマウントするのでルートが乗っ取られてしまう.一度マウントされてしまうとシステムが正常に動作しなくなるので,exportもmountpointの変更も出来ない.再起動してもマウントした状態を覚えているから,二度と正常に起動しない.

正解は,

zpool import -R /mnt/ <pool>

とやって,別のディレクトリに代替ルートを設定した後に,順番に注意して下のディレクトリのファイルシステムから一個ずつzfs umountする.

その後,問題のファイルシステムのmountpointを気が狂ったように

zfs set mountpoint=none

とすればOK.実際には,これを問題のpoolを含むHDD群を全部外してexportして電源をoffして,繋ぎ直した後に起動した後に行なう.

どうやって,バックアップをとるべきかはちょっと検討が必要.たぶん,正解はファイルとして

zfs send <snapshot> >somefile

としてしまうことなんだろう.特に,systemの様なマウントポイント関係で危うい問題が起こりそうなものは.

あと,importするけど自動マウントしないというオプションが欲しい.