どうしてもお仕事の関係でやらねばならなくなりまして、やってみた的な感じです。
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はその辺のロジックがしっかりしてるみたいなので。
マシン自身が正常に稼働していれば、好きなタイミングで取得する事が可能です。
$ su - Password: <パスワード> #
# 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になっていれば問題無いかと思います。
# 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で入力できます。
# 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台目以降にリカバリするのもありやも知れぬ。
いや、無いか。
$ su - Password: ←パスワード入力 #
LiveCD版のrootユーザーのパスワードは“solaris”です
# 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を選択して一旦すべて削除しておく。
削除できたら、新しくパーティションを作成
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のみ 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]? 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)
# 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時間も掛からないと思うけど。。。,,
# zfs create -b $(pagesize) -V 8GB rpool/swap # zfs set primarycache=metadata rpool/swap # zfs create -b 128k -V 16GB rpool/dump
上記のパラメータはあくまでもサンプルです。推奨値はOracleのサイトに掲載されていますので、そちらを参考にしてください。
参考
スワップ空間の計画(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(ぉぃ
# installgrub /tmp/mnt/boot/grub/stage1 /tmp/mnt/boot/grub/stage2 /dev/rdsk/c3t0d0s0
# devfsadm -Cn -r /tmp/mnt
# touch /tmp/mnt/reconfigure
# beadm unmount solaris
例によって?solarisの部分がブートエントリー名になります。
# beadm activate solaris
solarisの部分が(ry
# init 5
ルートプール以外にプールが構成されている場合、そちらに関してはルートプールの構成後にリカバリする
上の方にバックアップ取得時にzpool listやzpool statusで確認する作業を書いているけど、その出力にrpool以外があれば、それ。
# 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
# 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