====== Solaris11のバックアップとリカバリ ====== どうしてもお仕事の関係でやらねばならなくなりまして、やってみた的な感じです。\\ Oracle Solaris 11は、特に変な構成でなければ、システムのバックアップとリカバリは結構簡単。\\ Oracleのサイトで公開されているドキュメントだけでちゃんとバックアップもリカバリもできました。\\ でも地味に嵌って時間がかかったので、Wikiにしたためておく。\\ \\ というか、基本はOracleのサイトの**"[[http://www.oracle.com/technetwork/jp/articles/servers-storage-admin/o11-091-sol-dis-recovery-1568621-ja.html|システムアーカイブの実行と復旧の手順]]"**を見りゃちゃんと出来るよって事で。 ===== 前提条件 ===== 大した条件は無いけど、Solarisが11系であること。\\ あとSolaris自体がZFSのルートプール上に構成されていること。\\ つまりはSolaris11を普通にインストールしてるなら問題無いってこと。 ===== 必要なもの ===== * Oracle Solaris 11がインストールされているバックアップ・リカバリ対象マシン * マシンにインストールしたSolarisと同じバージョンのSolarisのLiveCD * バックアップデータを保存する場所(数GB~) * NFSサーバ * 外付けUSBHDD \\ 今回の検証ではOracle Solaris 11の11/11のバージョンを利用しているので、そのLiveCD版を使いました。\\ データ保存場所はとりあえずインストールしたてのものをバックアップするだけだと1.5GBにも満たないくらいのデータ量だったので、数GBもあれば十分かと。 ===== 今回の環境 ===== 検証環境は下記の通り\\ * **マシン**\\ VirtualBox(4.1.20)上に構成したVM * **OS**\\ Oracle Solaris 11 11/11 * **CPU**\\ Intel Core i7 CPU Q720 @ 1.60GHz * **RAM**\\ 2048MB * **N/W**\\ 192.168.11.205/24 * **保存先**\\ 同一ネットワーク内にあるLinuxサーバ(NFSv4が稼働中) * **OS**\\ CentOS 6.3 * **CPU**\\ Intel Atom CPU 230 @ 1.60GHz * **RAM**\\ 2048MB * **N/W**\\ 192.168.11.6/24 * **ネットワーク**\\ 192.168.11.0/24 ===== バックアップ ===== Oracle Solaris 11は、システムのルートファイルシステムとしてZFS・ZPOOLを利用していて、このZFSの機能を使う事でシステムのバックアップデータを簡単に取得できます。\\ バックアップデータの取得は、マシンの稼働状況はあまり考える必要は無さそうです。\\ ZFSはその辺のロジックがしっかりしてるみたいなので。\\ マシン自身が正常に稼働していれば、好きなタイミングで取得する事が可能です。 ==== バックアップ手順 ==== - マシンを起動する\\ いや、サーバ用途なら起動しっぱなしだとは思いますがw - 端末アプリケーションを起動する\\ CUI環境で使っている場合はそのままで良いです。GUI環境で使っている場合は、「アプリケーション」メニューから「アクセサリ」にある「端末」を実行してください。 - スーパーユーザにスイッチ\\ rootユーザになっておく必要があります。 $ su - Password: <パスワード> # - 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 - - プールのステータスを確認\\ これも別に確認するまでも無さそうですけどね。。。 # 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になっていれば問題無いかと思います。 - 接続されているドライブを確認\\ Solarisが認識しているドライブを確認します。\\ 物理的な数ではなく、ハードウェアRAIDとかを組んでいる場合は、まとまって見えます。 # format Searching for disks...done AVAILABLE DISK SELECTIONS: 0. c3t0d0 /pci@0,0/pci8086,2829@1f,2/disk@0,0 1. c3t2d0 /pci@0,0/pci8086,2829@1f,2/disk@2,0 Specify disk (enter its number): ^D それぞれのディスクの名前(「c3t0d0」「c3t1d0」など)を確認しておきます。\\ formatコマンドでformatプロンプトに切り替わり、ディスクの名前とかが確認できますが、**^D**でformatプロンプトを抜ける事ができます。\\ ちなみにCtrl+Dで入力できます。\\ - スナップショットを取得する\\ バックアップを取る為には、バックアップの元になるスナップショットを取得します。\\ スナップショットは「プール名@識別名」で指定します。わかりやすいように日付などを含めると良いのではないでしょうか。 # 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) - スナップショットの不要データを除去する\\ この手順は別にやらなくても構いませんが、バックアップデータのサイズが小さくなるので、出来ればやっときましょう。 # zfs destroy rpool/swap@archive-$(date +%Y%m%d) # zfs destroy rpool/dump@archive-$(date +%Y%m%d) - 保存先をマウントする\\ 保存先をマウントして、バックアップデータを簡単に書き出せるようにしておきます。 # 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なんかを保存先として利用する場合は、その保存先が正常に利用できる状態にしておいてください。\\ - スナップショットからバックアップデータを取得する # 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や場合によってはネットワークにも負荷がかかるので、実行タイミングには注意しましょう。\\ - スナップショットを削除する\\ いや、別に残しておいても良いのですが。\\ いらなければ消してくださいなってことで。 # zfs destroy -r rpool@archive-XXXXXXXX # zfs destroy -r tank@archive-XXXXXXXX XXXXXXXXはこのサイトの手順で実行している場合は、スナップショット取得時の日付ですので、ちゃんと書き換えて実行してくださいね。(2回目ww)\\ ===== リカバリ ===== 前述のバックアップ作業で取得しておいたバックアップデータを元に、システムのリカバリを行います。\\ 同一の機器構成ならどこにでも戻せるみたいなので、一台目のサーバを構成してからバックアップを取得し、2台目以降にリカバリするのもありやも知れぬ。\\ いや、無いか。 ==== リカバリ手順 ==== - "必要なもの"にある、対象マシンにインストールしたものと同じバージョンのSolarisのLiveCDをCD/DVDドライブに入れてマシンを起動する\\ 起動はGUI、CUI、どちらでも構わない。\\ 起動中、キーボードと使用言語を聞かれるので、Japaneseを選んでおく。 - 起動したら、ネットワークの設定を行う\\ インターネットが見れる必要は無いので、ちゃんとバックアップデータのあるNFSサーバと通信さえ出来れば、固定IPであろうが、DHCPで動的になっていようが構わない。\\ ちなみに今回はルーターさんからDHCPでIP配布してもらいました。 - (GUIの場合)端末アプリケーションを起動する\\ [アプリケーション]→[アクセサリ]→[端末]でおk - rootユーザーに昇格しておく $ su - Password: ←パスワード入力 # LiveCD版のrootユーザーのパスワードは**"solaris"**です - ブートデバイスを確認・設定する\\ バックアップ時にも確認したが、formatコマンドで接続デバイスを確認し、設定していく。 # format Searching for disks...done AVAILABLE DISK SELECTIONS: 0. c3t0d0 /pci@0,0/pci8086,2829@1f,2/disk@0,0 1. c3t2d0 /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**を選択して一旦すべて削除しておく。\\ 削除できたら、新しくパーティションを作成\\ - Enter Selectionで1を入力しEnterを押す\\ - パーティションタイプの選択で1を入力しEnterを押す\\ - パーティションの割当量で100を入力しEnterを押す\\ - パーティションのアクティブフラグの割当でyを入力し、Enterを押す\\ - 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]? yes ←yesを入力 Free Hog partition[6]? 0 ←最初のパーティションを指定 Enter size of partition ‘1’ [0b, 0c, 0.00mb, 0.00gb]: ←Enterのみ Enter size of partition ‘3’ [0b, 0c, 0.00mb, 0.00gb]: ←Enterのみ Enter size of partition ‘4’ [0b, 0c, 0.00mb, 0.00gb]: ←Enterのみ Enter size of partition ‘5’ [0b, 0c, 0.00mb, 0.00gb]: ←Enterのみ Enter size of partition ‘6’ [0b, 0c, 0.00mb, 0.00gb]: ←Enterのみ Enter size of partition ‘7’ [0b, 0c, 0.00mb, 0.00gb]: ←Enterのみ 【中略】 Do you wish to continue creating a new partition table based on above table[yes]? yes ←yesを入力 Enter table name (remember quotes): "c3t0d0" ←ディスク名を入力。ダブルクォートで囲む事。 Ready to label disk, continue? yes ←yesを入力 partition> quit ←quitを入力 format> quit ←quitを入力 - ルートプールを構成する\\ 前項で構成したディスクを使ってルートプールを構成する # zpool create rpool c3t0d0s0 通常ZFSでプールを構成する場合、zpoolコマンドで指定するのはディスク自体だけれども、ルートプールの場合はディスク自体ではなく、ディスク内のスライスなのだとか。\\ なので、**cXtXdX**ではなく、**cXtXdXsX**とスライスを含めて指定する(これで一日ハマった...orz) - バックアップデータの保存先があるNFSサーバの領域をマウントする\\ 前項でシステムをリカバリする為のルートプールを構成したので、実際にそのルートプールにリカバリデータを流し込み、復元していきます。\\ まずその前準備として、バックアップデータの保存先にアクセス出来るようにするためにNFS領域をマウントします。 # mount -F nfs 192.168.100.6:/path/to/ /mnt NFSサーバがNFSv3で動作している場合は、オプションの指定をお忘れなく。 - ルートプールにシステムをリカバリする\\ バックアップデータへアクセス出来るようになったら、バックアップデータをルートプールに流し込みます。 # gzcat /mnt/path/to/rpool_YYYYMMDD.zfs.gz | zfs receive -vF rpool **/mnt/path/to/**の部分はNFSサーバ上のバックアップデータのパスに合わせて変更してください。\\ また、**rpool_YYYYMMDD.zfs.gz**の**YYYYMMDD**の部分は本手順に沿ってバックアップしている場合は、バックアップの取得年月日になっているはずです。\\ **本処理はかなりの時間(数十分~数時間)を要します。実行には注意してください。**\\ ,,インストールしてからApacheとPHP突っ込んだくらいなら1時間も掛からないと思うけど。。。,, - 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のサイトに掲載されていますので、そちらを参考にしてください。\\ **参考**\\ [[http://docs.oracle.com/cd/E24845_01/html/819-0386/fsswap-31050.html#scrolltoc|スワップ空間の計画(Oracle)]] - ルートプールから起動出来るように構成する - ブートエントリーを確認する\\ 前項まででバックアップデータをルートプールに流しこみ、データ自体の復元は完了したので、ブートエントリーの調整を行います。\\ まずは、ブートエントリーの状態を確認します。 # 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 - ルートファイルシステムをマウント # beadm mount solaris /tmp/mnt **solaris**の部分がブートエントリー名になります。beadmコマンドのActive欄のフラグを見てマウントするブートエントリーを決めてください。\\ でもおいらにゃフラグの意味が良くわかりませんでしたwwwwww(ぉぃ - GRUBをインストール\\ ルートファイルシステムにGRUBをインストールします。 # installgrub /tmp/mnt/boot/grub/stage1 /tmp/mnt/boot/grub/stage2 /dev/rdsk/c3t0d0s0 - デバイスファイルシステムをクリアする\\ ……らしいんだけど、良くわからん。\\ リカバリ後のシステムで同じデバイスが使用されないようにするか、異なる方法で構成できるようになる…らしい。 # devfsadm -Cn -r /tmp/mnt - 再構成されたブートを実行するように構成\\ ……らしい。これも良くわからん。\\ ルートファイルシステムにreconfigureというファイルを配置する事で、再構成ブートを強制する事ができる…って噂ww # touch /tmp/mnt/reconfigure - ルートファイルシステムをアンマウント # beadm unmount solaris 例によって?**solaris**の部分がブートエントリー名になります。 - ブートエントリーをアクティブにする\\ 編集したブートエントリーのActiveに**R**のフラグが立っていない場合、アクティブなエントリーにするために下記のコマンドを実行します。\\ フラグに問題が無いならやらなくてもおk. # beadm activate solaris **solaris**の部分が(ry - シャットダウンする # init 5 - 起動して確認\\ LiveCDのメディアを取り出して起動確認する\\ おかしかったらブートエントリーのActiveを変えたりしてみてちょ。 ==== 別のプールがある場合 ==== ルートプール以外にプールが構成されている場合、そちらに関してはルートプールの構成後にリカバリする\\ 上の方にバックアップ取得時に**zpool list**や**zpool status**で確認する作業を書いているけど、その出力に**rpool**以外があれば、それ。\\ - とりあえず、起動\\ リカバリしたルートプールから起動します。\\ - 最低限の状況を確認\\ ルートプールのリカバリ後、確認ができているならいりませんが。。。\\ とりあえず、IPアドレスとかホスト名とか、必要なサービスが動作してるかとか。一通り確認してくだせぇ。\\ - リカバリするプールを作成する\\ 事前に**zpool list**や**zpool 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 ってな具合になっている場合、プールのミラー構成や、**logs**や**cache**の部分にも注意する必要があります。\\ 上の場合、こんなふうになるかと。 # zpool create tank mirror c3t2d0 c3t3d0 cache c3t4d0 log c3t5d0 - バックアップデータを流し込む\\ プールが構成できたら、バックアップデータを流し込む。\\ 流し込み方はルートプールの時と一緒。\\ ただ、ルートプールのように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 - 一応再起動 # init 6 起動したらプール**tank**の関わる部分に問題が無いか確認します。\\ 何か問題があったら…わからんので、自力で頑張ってください。。。サーセンwww