彷徨えるフジワラ

年がら年中さまよってます

HDD 障害復旧予行演習 〜 実践編(ZFS)

「実践」とは言いつつも、デバイスの抜き差しが絡む試行錯誤を実マシンでやるのは流石に面倒なので、実際には VMWare 上の仮想マシンで。更に、バックアップ用の ZFS プールも遠隔マシン上ではなくローカルに作成、という手抜きっ振り。ま、予行演習ですから。

何は無くとも、まずは rpool のバックアップを作成せねば。

  1. "zpool create" でバックアップ用プールを作成(以後 "rpool-backup")
  2. "zfs snapshot -r rpool@snapshot1" で rpool 上の全 ZFS インスタンスにスナップショット snapshot1 を作成
  3. "zfs send -R rpool@snapshot1 | zfs receive -F -d rpool-backup" で rpool の snapshot1 時点のバックアップを rpool-backup に作成

と、ここで "zfs receive" からエラーメッセージが:

cannot mount '/export': directory is not empty

言われて見れば至極当然な話だけど、完全な空状態だった rpool-backup 上に、rpool からのバックアップ内容に従って続々と新規の ZFS インスタンスが作成されるわけで、その際に rpool 由来の設定値に従った自動マウント処理が走ってしまい、現時点でマウント済みの rpool の ZFS インスタンスと衝突、ということらしい。

要は「ZFS 設定上のマウントポイントとは別なところにマウントされていなさい」ということを ZFS に認識させておけばよいわけで、それには zpool の altroot 属性を設定すれば良かろうというあたりは、「ZFS ルートプールを再作成しルートプールのスナップショットを復元する方法」から類推可能な範疇。

"zfs receive" で既に作成されてしまった ZFS インスタンスをあれこれするのも面倒くさいので、-R でのマウント先指定付きで "zpool create" を実行するところからやり直し。で、今度は "zfs receive" も無事に終了し、スナップショット snapshot1 時点の rpool のバックアップに成功。

でも後になって考えてみれば、一旦 "zpool export" してから -R 指定付きで "zpool import" すれば良かっただけなのかも。ま、いーか。

引き続き以下を実施すれば、ひと段落:

  1. "installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/XXXXs0" で grub 導入
  2. "zfs export rpool-backup" で rpool-backup を offline 化

grub 導入は、所謂「HDD 移植」の際でも良いのだけど、その段になって慌てないように、事前にやっておくのが大人の嗜み。後述する bootfs 属性も、多分この時点で設定してしまって良い気がする。

rpool-backup を offline 化するのは、マシンが予期せぬ再起動をしてしまった際に、rpool-backup が online な状態のままだと、先程の "zfs receive" の時と同様に、rpool とのマウント位置衝突を起こしてしまうので、これを防ぐための予防措置。

つまり、rpool-backup は "zfs receive" 実施中限定で online にする必要があるので、日々の定期バックアップの手順は:

  1. "zpool import -R /xx rpool-backup" で一時的に online 化
  2. "zfs snapshot" で rpool にスナップショット設定
  3. "zfs send" + "zfs receive" で rpool-backup のバックアップ内容を更新
  4. "zfs export rpool-backup" で offline 化

といった感じになる。定期バックアップをするなら、"zfs send" は -I 指定付きでのインクリメンタルバックアップだろうなぁ。

必要に応じて都度 rpool-backup に scrub とかを行なえば更に安心かな。

さて、バックアップができたので、いよいよディスク移植〜再起動を。

  1. "zpool export rpool-backup" で offline 化を忘れずに
  2. "shutdown" で電源断
  3. rpool に使用していた HDD の取り外し ⇒ 実際の手順では「rpool-backup の HDD と入れ替え」
  4. CD-ROM でブートしておいてログイン
  5. "zpool import -R /xx rpool-backup rpool" で rpool-backup を rpool に改名しつつ online 化
  6. "zpool set bootfs=rpool/ROOT/opensolaris rpool" で boot 向け設定
  7. "zpool set cachefile= rpool" で cachefile 属性をデフォルト化
  8. 再起動

そしてあっさり再起動に成功。うわ、あっけねぇー!

なお、"bootfs" 属性として指定する "rpool/ROOT/opensolaris" 値は、必ずしもこの値であるとは限らないので:

  • 元 rpool に対して "zfs get bootfs rpool" などを実施して確認
  • rpool-backup の rpool 改名後に、"/" にマウントされる設定の ZFS インスタンスを確認

などで、その時の環境に応じて設定する必要がある。元 rpool があるうちに済ませておいた方が安心なので、先述したように "zpool create" の際に "zfs get bootfs rpool" 値で設定するのがよさそう。

また、"cachefile" 属性を default 状態に戻しているのは、HDD 取り外し前に確認しておいた rpool での設定値と、"zpool import" により改名した後の rpool-backup における値が違っていたので、元 rpool の設定値に合わせたというだけの話なので、必ずしも実施する必要は無いかも。