目次

Solaris11のバックアップとリカバリ

どうしてもお仕事の関係でやらねばならなくなりまして、やってみた的な感じです。
Oracle Solaris 11は、特に変な構成でなければ、システムのバックアップとリカバリは結構簡単。
Oracleのサイトで公開されているドキュメントだけでちゃんとバックアップもリカバリもできました。
でも地味に嵌って時間がかかったので、Wikiにしたためておく。

というか、基本はOracleのサイトのシステムアーカイブの実行と復旧の手順を見りゃちゃんと出来るよって事で。

前提条件

大した条件は無いけど、Solarisが11系であること。
あとSolaris自体がZFSのルートプール上に構成されていること。
つまりはSolaris11を普通にインストールしてるなら問題無いってこと。

必要なもの


今回の検証ではOracle Solaris 11の11/11のバージョンを利用しているので、そのLiveCD版を使いました。
データ保存場所はとりあえずインストールしたてのものをバックアップするだけだと1.5GBにも満たないくらいのデータ量だったので、数GBもあれば十分かと。

今回の環境

検証環境は下記の通り

バックアップ

Oracle Solaris 11は、システムのルートファイルシステムとしてZFS・ZPOOLを利用していて、このZFSの機能を使う事でシステムのバックアップデータを簡単に取得できます。
バックアップデータの取得は、マシンの稼働状況はあまり考える必要は無さそうです。
ZFSはその辺のロジックがしっかりしてるみたいなので。
マシン自身が正常に稼働していれば、好きなタイミングで取得する事が可能です。

バックアップ手順

  1. マシンを起動する
    いや、サーバ用途なら起動しっぱなしだとは思いますがw
  2. 端末アプリケーションを起動する
    CUI環境で使っている場合はそのままで良いです。GUI環境で使っている場合は、「アプリケーション」メニューから「アクセサリ」にある「端末」を実行してください。
  3. スーパーユーザにスイッチ
    rootユーザになっておく必要があります。
     $ su -
     Password: <パスワード>
     #
  4. ZPOOLの状態を確認
    別に確認するまでも無いかもしれませんが。。。
     # zpool list
     NAME    SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
     rpool  19.9G  6.27G  13.6G  31%  1.00x  ONLINE  -

    Solarisのシステムが格納されているプールであるルートプール「rpool」の状態が確認できますね。
    他にプールを構成している場合は更に別の行が表示されます。

     # zpool list
     NAME    SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
     rpool  19.9G  6.27G  13.6G  31%  1.00x  ONLINE  -
     tank   19.9G  75.4M  19.8G   0%  1.00x  ONLINE  -
  5. プールのステータスを確認
    これも別に確認するまでも無さそうですけどね。。。
     # zpool status
       pool: rpool
      state: ONLINE
       scan: none requested
     config:
     
             NAME        STATE     READ WRITE CKSUM
             rpool       ONLINE       0     0     0
               c3t0d0s0  ONLINE       0     0     0
     
     errors: No known data errors
     
       pool: tank
      state: ONLINE
       scan: none requested
     config:
     
             NAME      STATE     READ WRITE CKSUM
             tank      ONLINE       0     0     0
               c3t2d0  ONLINE       0     0     0
     
     errors: No known data errors

    STATEがONLINEになっていれば問題無いかと思います。

  6. 接続されているドライブを確認
    Solarisが認識しているドライブを確認します。
    物理的な数ではなく、ハードウェアRAIDとかを組んでいる場合は、まとまって見えます。
     # format
     Searching for disks...done
     
     
     AVAILABLE DISK SELECTIONS:
            0. c3t0d0 <ATA-VBOX HARDDISK-1.0 cyl 2607 alt 2 hd 255 sec 63>
               /pci@0,0/pci8086,2829@1f,2/disk@0,0
            1. c3t2d0 <ATA-VBOX HARDDISK-1.0-20.00GB>
               /pci@0,0/pci8086,2829@1f,2/disk@2,0
     Specify disk (enter its number): ^D

    それぞれのディスクの名前(「c3t0d0」「c3t1d0」など)を確認しておきます。
    formatコマンドでformatプロンプトに切り替わり、ディスクの名前とかが確認できますが、^Dでformatプロンプトを抜ける事ができます。
    ちなみにCtrl+Dで入力できます。

  7. スナップショットを取得する
    バックアップを取る為には、バックアップの元になるスナップショットを取得します。
    スナップショットは「プール名@識別名」で指定します。わかりやすいように日付などを含めると良いのではないでしょうか。
     # zfs snapshot -r rpool@archive-$(date +%Y%m%d)

    rpool以外のプールが構成されていて、そちらもバックアップの対象である場合は、そちらも同様にスナップショットを取得しておきましょう。

     # zfs snapshot -r rpool@archive-$(date +%Y%m%d)
     # zfs snapshot -r tank@archive-$(date +%Y%m%d)
  8. スナップショットの不要データを除去する
    この手順は別にやらなくても構いませんが、バックアップデータのサイズが小さくなるので、出来ればやっときましょう。
     # zfs destroy rpool/swap@archive-$(date +%Y%m%d)
     # zfs destroy rpool/dump@archive-$(date +%Y%m%d)
  9. 保存先をマウントする
    保存先をマウントして、バックアップデータを簡単に書き出せるようにしておきます。
     # mount -F nfs 192.168.100.6:/path/to /mnt

    保存先として、今回はNFSサーバを想定していますが、NFSサーバの構築に関しては、ググレカスって事でおながいします。
    ちなみに、NFSサーバがNFSv4で動いている場合はこのままで構いませんが、NFSv3で動作している場合は、オプションを指定してください。

     # mount -F nfs -o vers=3 192.168.100.6:/path/to /mnt

    また今回は書きませんが、外付けのUSBHDDなんかを保存先として利用する場合は、その保存先が正常に利用できる状態にしておいてください。

  10. スナップショットからバックアップデータを取得する
     # zfs send -Rv rpool@archive-XXXXXXXX | gzip > /mnt/rpool_$(date +%Y%m%d).zfs.gz
     # zfs send -Rv tank@archive-XXXXXXXX | gzip > /mnt/tank_$(date +%Y%m%d).zfs.gz

    XXXXXXXXはこのサイトの手順で実行している場合は、スナップショット取得時の日付ですので、ちゃんと書き換えて実行してくださいね。
    この処理はスナップショットを元に、バックアップデータを作るのですが、さすがに数GBのデータを作り出すので、結構時間がかかります。
    また、スナップショットの取得とは違い、ディスクI/Oや場合によってはネットワークにも負荷がかかるので、実行タイミングには注意しましょう。

  11. スナップショットを削除する
    いや、別に残しておいても良いのですが。
    いらなければ消してくださいなってことで。
     # zfs destroy -r rpool@archive-XXXXXXXX
     # zfs destroy -r tank@archive-XXXXXXXX

    XXXXXXXXはこのサイトの手順で実行している場合は、スナップショット取得時の日付ですので、ちゃんと書き換えて実行してくださいね。(2回目ww)

リカバリ

前述のバックアップ作業で取得しておいたバックアップデータを元に、システムのリカバリを行います。
同一の機器構成ならどこにでも戻せるみたいなので、一台目のサーバを構成してからバックアップを取得し、2台目以降にリカバリするのもありやも知れぬ。
いや、無いか。

リカバリ手順

  1. “必要なもの”にある、対象マシンにインストールしたものと同じバージョンのSolarisのLiveCDをCD/DVDドライブに入れてマシンを起動する
    起動はGUI、CUI、どちらでも構わない。
    起動中、キーボードと使用言語を聞かれるので、Japaneseを選んでおく。
  2. 起動したら、ネットワークの設定を行う
    インターネットが見れる必要は無いので、ちゃんとバックアップデータのあるNFSサーバと通信さえ出来れば、固定IPであろうが、DHCPで動的になっていようが構わない。
    ちなみに今回はルーターさんからDHCPでIP配布してもらいました。
  3. (GUIの場合)端末アプリケーションを起動する
    [アプリケーション]→[アクセサリ]→[端末]でおk
  4. rootユーザーに昇格しておく
     $ su -
     Password: ←パスワード入力
     # 

    LiveCD版のrootユーザーのパスワードは“solaris”です

  5. ブートデバイスを確認・設定する
    バックアップ時にも確認したが、formatコマンドで接続デバイスを確認し、設定していく。
     # format
     Searching for disks...done
     
     
     AVAILABLE DISK SELECTIONS:
            0. c3t0d0 <ATA-VBOX HARDDISK-1.0 cyl 2607 alt 2 hd 255 sec 63>
               /pci@0,0/pci8086,2829@1f,2/disk@0,0
            1. c3t2d0 <ATA-VBOX HARDDISK-1.0-20.00GB>
               /pci@0,0/pci8086,2829@1f,2/disk@2,0
     Specify disk (enter its number): 0 ←一つ目のディスクを選択する
     selecting c3t0d0
     【中略】

    プロンプトがformatプロンプトに変わるので、fdiskを入力して実行する

     format> fdisk

    この時、次のように表示された場合、「y」と入力し、Enterを押す。

     Type "y" to accept the default partition, otherwise type "n" to edit the partition table.
     y ←yを入力
     format>

    上のように表示されなかった場合、fdiskの画面に切り替わるので、ディスクの状態を確認します。

     Total disk size is XXXXX cylinders
     Cylinder size is XXXXX (XXX byte) blocks
     
                                            Cylinders
     Partition  Status   Type           Start   End   Length    % 
     =========  ======   =============  =====   ===   ======   ===
     
     
     SELECT ONE OF THE FOLLOWING:
       1.  Create a partition
       2.  Specify the active partition
       3.  Delete a partition
       4.  Change between Solaris and Solaris2 Partition IDs
       5.  Edit/View extended partitions
       6.  Exit (update disk configuration and exit)
       7.  Cancel (exit without updating disk configuration)
     Enter Selection:

    ===のラインの下に何も無ければ良いが、何かエントリーがあるようなら、3のDelete a partitionを選択して一旦すべて削除しておく。
    削除できたら、新しくパーティションを作成

    1. Enter Selectionで1を入力しEnterを押す
    2. パーティションタイプの選択で1を入力しEnterを押す
    3. パーティションの割当量で100を入力しEnterを押す
    4. パーティションのアクティブフラグの割当でyを入力し、Enterを押す
    5. Enter Selectionで6を入力し、Enterを押す

formatプロンプトに戻ったら、「partition」と入力し、Enterを押します。
partitionプロンプトに切り替わったら、modifyと入力し、Enterを押します。

 format> partition
 【中略】
 partition> modify

スライス(パーティション)情報の更新画面に切り替わるので、下記の順序で指示を出していきます。

 Select partition base:
    0. Current partition table (default)
    1. All Free Hog
 Choose base (enter number) [0]? 1 ←All Free Hogを選択
 【中略】
 Do you wish to continue creating a new partition
 table based on above table[yes]? yesyesを入力
 Free Hog partition[6]? 0 ←最初のパーティションを指定
 Enter size of partition ‘1[0b, 0c, 0.00mb, 0.00gb]: <Enter> ←Enterのみ
 Enter size of partition ‘3[0b, 0c, 0.00mb, 0.00gb]: <Enter> ←Enterのみ
 Enter size of partition ‘4[0b, 0c, 0.00mb, 0.00gb]: <Enter> ←Enterのみ
 Enter size of partition ‘5[0b, 0c, 0.00mb, 0.00gb]: <Enter> ←Enterのみ
 Enter size of partition ‘6[0b, 0c, 0.00mb, 0.00gb]: <Enter> ←Enterのみ
 Enter size of partition ‘7[0b, 0c, 0.00mb, 0.00gb]: <Enter> ←Enterのみ
 【中略】
 Do you wish to continue creating a new partition
 table based on above table[yes]? yesyesを入力
 Enter table name (remember quotes): "c3t0d0" ←ディスク名を入力。ダブルクォートで囲む事。
 Ready to label disk, continue? yesyesを入力
 partition> quit ←quitを入力
 format> quit ←quitを入力
  1. ルートプールを構成する
    前項で構成したディスクを使ってルートプールを構成する
     # zpool create rpool c3t0d0s0

    通常ZFSでプールを構成する場合、zpoolコマンドで指定するのはディスク自体だけれども、ルートプールの場合はディスク自体ではなく、ディスク内のスライスなのだとか。
    なので、cXtXdXではなく、cXtXdXsXとスライスを含めて指定する(これで一日ハマった…orz)

  2. バックアップデータの保存先があるNFSサーバの領域をマウントする
    前項でシステムをリカバリする為のルートプールを構成したので、実際にそのルートプールにリカバリデータを流し込み、復元していきます。
    まずその前準備として、バックアップデータの保存先にアクセス出来るようにするためにNFS領域をマウントします。
     # mount -F nfs 192.168.100.6:/path/to/ /mnt

    NFSサーバがNFSv3で動作している場合は、オプションの指定をお忘れなく。

  3. ルートプールにシステムをリカバリする
    バックアップデータへアクセス出来るようになったら、バックアップデータをルートプールに流し込みます。
     # gzcat /mnt/path/to/rpool_YYYYMMDD.zfs.gz | zfs receive -vF rpool

    /mnt/path/to/の部分はNFSサーバ上のバックアップデータのパスに合わせて変更してください。
    また、rpool_YYYYMMDD.zfs.gzYYYYMMDDの部分は本手順に沿ってバックアップしている場合は、バックアップの取得年月日になっているはずです。
    本処理はかなりの時間(数十分~数時間)を要します。実行には注意してください。
    ,,インストールしてからApacheとPHP突っ込んだくらいなら1時間も掛からないと思うけど。。。,,

  4. swapとdump領域を作成する
    バックアップデータの取得時にそのデータ量を減らす為にswapとdumpの領域を削除している場合、その領域を手作業で作成してやる必要があります。
     # zfs create -b $(pagesize) -V 8GB rpool/swap
     # zfs set primarycache=metadata rpool/swap
     # zfs create -b 128k -V 16GB rpool/dump

    上記のパラメータはあくまでもサンプルです。推奨値はOracleのサイトに掲載されていますので、そちらを参考にしてください。
    参考
    スワップ空間の計画(Oracle)

  5. ルートプールから起動出来るように構成する
    1. ブートエントリーを確認する
      前項まででバックアップデータをルートプールに流しこみ、データ自体の復元は完了したので、ブートエントリーの調整を行います。
      まずは、ブートエントリーの状態を確認します。
       # beadm list
       BE               Active Mountpoint Space  Policy Created
       --               ------ ---------- -----  ------ -------
       solaris          NR     /          5.25G  static 2012-10-10 10:10
       solaris-backup-1 -      -          160.0K static 2012-10-11 10:10
    2. ルートファイルシステムをマウント
       # beadm mount solaris /tmp/mnt

      solarisの部分がブートエントリー名になります。beadmコマンドのActive欄のフラグを見てマウントするブートエントリーを決めてください。
      でもおいらにゃフラグの意味が良くわかりませんでしたwwwwww(ぉぃ

    3. GRUBをインストール
      ルートファイルシステムにGRUBをインストールします。
       # installgrub /tmp/mnt/boot/grub/stage1 /tmp/mnt/boot/grub/stage2 /dev/rdsk/c3t0d0s0
    4. デバイスファイルシステムをクリアする
      ……らしいんだけど、良くわからん。
      リカバリ後のシステムで同じデバイスが使用されないようにするか、異なる方法で構成できるようになる…らしい。
       # devfsadm -Cn -r /tmp/mnt
    5. 再構成されたブートを実行するように構成
      ……らしい。これも良くわからん。
      ルートファイルシステムにreconfigureというファイルを配置する事で、再構成ブートを強制する事ができる…って噂ww
       # touch /tmp/mnt/reconfigure
    6. ルートファイルシステムをアンマウント
       # beadm unmount solaris

      例によって?solarisの部分がブートエントリー名になります。

    7. ブートエントリーをアクティブにする
      編集したブートエントリーのActiveにRのフラグが立っていない場合、アクティブなエントリーにするために下記のコマンドを実行します。
      フラグに問題が無いならやらなくてもおk.
       # beadm activate solaris

      solarisの部分が(ry

  6. シャットダウンする
     # init 5
  7. 起動して確認
    LiveCDのメディアを取り出して起動確認する
    おかしかったらブートエントリーのActiveを変えたりしてみてちょ。

別のプールがある場合

ルートプール以外にプールが構成されている場合、そちらに関してはルートプールの構成後にリカバリする
上の方にバックアップ取得時にzpool listzpool statusで確認する作業を書いているけど、その出力にrpool以外があれば、それ。

  1. とりあえず、起動
    リカバリしたルートプールから起動します。
  2. 最低限の状況を確認
    ルートプールのリカバリ後、確認ができているならいりませんが。。。
    とりあえず、IPアドレスとかホスト名とか、必要なサービスが動作してるかとか。一通り確認してくだせぇ。
  3. リカバリするプールを作成する
    事前にzpool listzpool statusで得ていた情報を元に、プールを作成します。
    例えば、プールtankを作成する場合に、
     # zpool status
       pool: rpool
      state: ONLINE
       scan: none requested
     config:
     
             NAME        STATE     READ WRITE CKSUM
             rpool       ONLINE       0     0     0
               c3t0d0s0  ONLINE       0     0     0
     
     errors: No known data errors
     
       pool: tank
      state: ONLINE
       scan: none requested
     config:
     
             NAME      STATE     READ WRITE CKSUM
             tank      ONLINE       0     0     0
               c3t2d0  ONLINE       0     0     0
     
     errors: No known data errors

    のようになっているのであれば、プールtankは単一のディスクから構成されているので、

     # zpool create tank c3t2d0

    のようにシンプルに書けば良いのですが、

       pool: tank
      state: ONLINE
       scan: none requested
     config:
     
         NAME        STATE     READ WRITE CKSUM
         tank        ONLINE       0     0     0
           mirror    ONLINE       0     0     0
             c3t2d0  ONLINE       0     0     0
             c3t3d0  ONLINE       0     0     0
         logs
           c3t5d0    ONLINE       0     0     0
         cache
           c3t4d0    ONLINE       0     0     0

    ってな具合になっている場合、プールのミラー構成や、logscacheの部分にも注意する必要があります。
    上の場合、こんなふうになるかと。

     # zpool create tank mirror c3t2d0 c3t3d0 cache c3t4d0 log c3t5d0
  4. バックアップデータを流し込む
    プールが構成できたら、バックアップデータを流し込む。
    流し込み方はルートプールの時と一緒。
    ただ、ルートプールのようにSolarisのシステムが入っているわけではないので、swapやdumpの構成は不要です。
     # mount -F nfs 192.168.100.6:/path/to/ /mnt

    NFSサーバがNFSv3で動作している場合は、オプションの指定をお忘れなく。

     # gzcat /mnt/path/to/tank_YYYYMMDD.zfs.gz | zfs receive -vF tank
  5. 一応再起動
     # init 6

    起動したらプールtankの関わる部分に問題が無いか確認します。

何か問題があったら…わからんので、自力で頑張ってください。。。サーセンwww