SPARC/Solaris探検隊
第22回:スナップショットはこんなに便利です

2019年7月24日


 

第21回 では、ZFSファイルシステムを説明しました。
そこで今回は、ZFSファイルシステムの機能の1つである「スナップショット」を紹介したいと思います。

日常の出来事や光景などの瞬間を撮影した写真を「スナップショット」と言います。Oracle Solarisにも、ある一瞬、その一瞬の状態を記録として残すことができる「スナップショット」という機能があります。

昔のアルバムで写真を見ながら「あの頃に戻りたいな」と思っても、魔法やタイムマシンがないので過去には戻れません。しかし、Oracle Solarisでは、OS標準の「ロールバック」や「バックアップ/リストア」という機能で、スナップショットで記録した「過去の一瞬」に戻ることができるのです。

では、「スナップショット」、「ロールバック」と「バックアップ/リストア」について、順番に紹介します。

スナップショット

スナップショットは、名前のとおりスナップ写真のようなもので、「その時点(瞬間)の状態を写しとったもの」です。

スナップショットは、さまざまなOSやソフトウェアで利用されています。Oracle Solaris(以降、Solaris)では、ZFSファイルシステムの機能としてzfs snapshotを提供しています。

イメージしやすいように、写真の例と一緒にスナップショットの機能を説明していきたいと思います。
それでは、実際に「スナップショット」をとってみましょう。

たとえば、rpool配下のdataというファイルシステム(rpool/data)に大事なデータが入っているものとします。大事なデータなので、rpool/dataの現在の状態をスナップショットで記録したいと思います。
下のイラストのように、高校時代にサッカーで活躍している雄姿を写真で撮影したのと同じことですね。

スナップショットは、zfs snapshotというコマンドでとることができます。
zfs snapshotコマンドに、ファイルシステム「rpool/data」と、「@任意のスナップショット名」を指定すればOKです。
ここでは例として、スナップショット名「snapshot1」でスナップショットをとってみましょう。

コマンドを実行すると、一瞬で完了しました。

  ワンポイント

「-r」オプションを指定すると、指定したファイルシステムの下位ファイルシステム(例:rpool/data/20180101など)のスナップショットも同時にとれます。今回は、rpool/data配下に下位のファイルシステムは存在しないため、「-r」オプションは指定していません。

スナップショットがとれたことを確認してみましょう。「rpool/data@snapshot1」がありますね。

スナップショットは素早く簡単にとれるうえに、システム停止は不要です。
デジカメやスマホで写真をパシャっと撮るように簡単ですね。

ロールバック

まずは、スナップショットを作成したときの状態に戻す「ロールバック」という機能を使ってみましょう。
先ほどとったスナップショット「snapshot1」を使って、ロールバックをしてみます。過去に戻れる魔法を使って、写真を撮ったあの頃に戻るようなイメージですね。

まずは今の状態を見てみます。

ファイルシステム「/data」の中に、ファイルが3つありますね。どれも大事なファイルです。

ここで、誤ってファイルを削除してしまったとします。

ファイルが0個になりました・・・元に戻したいです。

こういうときに、ロールバックを利用します。
とっておいたスナップショット「snapshot1」をzfs rollbackコマンドに指定して実行するだけで、スナップショットをとったときの状態に戻せるのです。

確認してみると、ファイルが復元されています。

rpool/dataをスナップショット取得時の状態に戻すことができました。

このように、作業前などにスナップショットをとっておくことで、誤ってファイルを消してしまった場合でも、ロールバックで元の状態に戻すことができます。
また、パッチを適用したら重大な障害が発生してしまったなど、想定外の事象が発生した場合にも、障害発生前にスナップショットをとっておくことで、元の状態に戻せます。

  ワンポイント

スナップショットは、スナップショットを取得したファイルシステム上に作成されます。今回の例では、ファイルシステム「rpool/data」の下にスナップショットが作成されています。そのため、ファイルシステム「rpool/data」を削除するとスナップショットも削除され、ロールバックできなくなってしまいます。

ところで、スナップショットとロールバックを使うと、いつでも自由に、過去のどのような状態にでも戻ることができるのでしょうか?
実は、ロールバックする場合は、戻したいスナップショットよりも新しいスナップショットは削除しておく必要があります。たとえば、最新ではないスナップショット(イラスト内のsnapshot1)を使用してロールバックする場合は、使用するスナップショットよりも新しいスナップショット(イラスト内のsnapshot2)を削除し、snapshot1を最新のスナップショットにしておく必要があるのです。
スナップショットとロールバックは、ある特定の状態にだけ戻れる機能ということですね。


ロールバック実行時に「-r」オプションを指定すると、対象のスナップショットより新しいスナップショットを削除してロールバックが実行されます。

  ワンポイント

削除したスナップショットは利用できなくなります。そのため、削除したスナップショットの状態へはロールバックできません。

バックアップ/リストア

ロールバックは、特定のスナップショットの状態に戻す機能であることがおわかりいただけたと思います。
でも、特定の状態だけでなく、ほかの状態に戻したい場合もありますよね。いろいろな過去に戻ってみたい、そんな気持ちでしょうか。

そこで、次に紹介する機能が「バックアップ/リストア」です。
バックアップは、スナップショットからアーカイブを作成し、指定した場所にバックアップ(ファイル保存)する機能です。
リストア(復元)は、保存しておいたバックアップを使って復元する機能です。
バックアップ/リストアによって、バックアップした状態にいつでも戻すことができます。

スナップショット/ロールバックとの大きな違いは、バックアップを任意の場所に保存するので、ファイルシステムが削除されたり壊れたりしても、リストアできることです。
また、いくつものスナップショットをとってアーカイブを作成し、それぞれのバックアップを保存しておくことで、過去のさまざまな状態に戻れるようになるのです。いわゆる、世代管理ですね。

それでは、実際にスナップショットからバックアップを実行し、リストアしてみましょう。
ここでは例として、スナップショット「snapshot1」からバックアップとしてアーカイブを作成します。また、ファイルシステムを削除してしまった後に、アーカイブからリストアして元に戻します。

まずは、ファイルシステム「rpool/data」の状態を確認します。

rpool/dataが存在しますね。大事なデータです。

このデータは、すでに「snapshot1」という名前でスナップショットを取得済みとします。
取得済みのスナップショット「snapshot1」から、バックアップ1(アーカイブ)を作成します。

  ワンポイント

ここでは、アーカイブの容量を抑えるため、gzipで圧縮しています。

  ワンポイント

「-R」オプションを指定すると、指定したファイルシステムの下位ファイルシステム(例:rpool/data/20180101など)のアーカイブも同時に作成できます。今回は、rpool/data配下に下位のファイルシステムは存在しないため、「-R」オプションは指定していません。

ここで、誤ってファイルシステム「rpool/data」を削除してしまったとします。

ファイルシステムを削除したので、ファイルシステム内に保存されているスナップショット「snapshot1」も削除されています。そのため、スナップショットを使用したロールバックでは復元できません。

このようなときは、削除してしまったファイルシステム(rpool/data)をリストアで復元します。
「バックアップ1」からファイルシステムを復元します。

  ワンポイント

アーカイブ作成時にgzipで圧縮しているため、gzcatで解凍してから復元します。

  ワンポイント

zfs sendコマンドで「-R」オプションを指定した場合は、zfs receiveコマンドに「-d」オプションを指定します。

確認してみると、ファイルシステムが復元されていますね。

高校生に戻って人生をやり直す、そんなイメージですね。

たとえば、下のイラストのように「snapshot1」から「バックアップ1」、「snapshot2」から「バックアップ2」をとっておくことで、いつでも「バックアップ1」や「バックアップ2」の状態に戻れます。

システム領域全体のバックアップとリストア

今回は、データ領域として使用しているファイルシステムのバックアップ/リストアを実行しましたが、システム領域全体をバックアップしてリストアすることもできます。

  ワンポイント

システム領域全体のバックアップ/リストアの場合は、OSインストール媒体(DVDなど)でブートしてから復元を実行します。また、復元コマンドにオプションを指定します。
詳細は、「Oracle Solaris 11を使ってみよう(構築・運用手順書)」を参照してください。

  ワンポイント

スナップショットではなく、大事なファイルを「コピー」で保存しておいて、必要なときに復元する、ということもできます。
ただし、コピーでは保存できないものや、コピーに時間がかかって業務に影響を与える場合もありますので、注意が必要です。状況や保存する対象を考慮したうえで、コピーをご利用いただければと思います。

まとめ

スナップショット(zfs snapshot)を使用することで、ファイルシステムの状態を素早く簡単に、かつシステムを停止することなく保存できます。
また、スナップショットを使用して「ロールバック」や「バックアップ/リストア」を実行し、スナップショットをとった時点に状態を戻すことができます。

第15回 で紹介しているBoot Environment(以降、BE)は、実はzfs snapshotを使用しています。
BEはシステム領域すべてを対象とし、かつシステム領域に保存されますが、zfs snapshotは必要な領域のみを対象とし、かつバックアップファイルとして保存することができるという違いがあります。

Oracle SolarisのZFSには、スナップショット以外にも便利な機能がたくさんあります。
ZFSについて詳しく知りたい方は、以下の資料も参考にしてください。


応援メッセージはtwitterにて、ハッシュタグ #fjsparc  までお願いします。