うちのサーバ群も仮想化環境としておせわになってるVMware ESXiですが、バックアップの運用を真剣に考えなきゃと思い、着手し始めました。
いろいろググってみると
などを実現している方もいらっしゃるようですね。
いろいろ調べながら、うちでもやってみることにします。
さてホットバックアップの方法ですが、そもそもVMwareの仮想マシンはOS起動中はロックされていてコピー(バックアップ)することができないのですが、スナップショットを取ることによって、スナップショット時点までのファイルはロックが解放されファイルコピーができるようになります。スナップショットを取れば、それまでのファイルとそこからの変更分みたいなファイル形式になるって感じでしょうね。
なので、スナップショットを作成してバックアップを作成し、その後スナップショットを削除するっていう手順を行えばOKそうです。
例として wwwというvm名の仮想マシンのバックアップをすることを考えてみます。その仮想マシンは、
/vmfs/volumes/esxiDisk/www/www.vmdk
にハードディスクのイメージがあり、そのディスクを
/vmfs/volumes/nfs/
へコピーします。一応、ファイル名は日付を付けて世代管理します。
さて実際の手順ですが、ESXiにログイン後*1、以下のコマンドでバックアップを取ることができます。
vim-cmd vmsvc/snapshot.create `vim-cmd vmsvc/getallvms| awk '/www/ {print $1;}'` forBackup vmkfstools -i /vmfs/volumes/esxiDisk/www/www.vmdk -d monosparse /vmfs/volumes/nfs/www`TZ=JST-9 date '+%Y%m%d%H%M'`.vmdk vim-cmd vmsvc/snapshot.remove `vim-cmd vmsvc/getallvms| awk '/www/ {print $1;}'`
実行するとスナップショットが作成されたことによってwww.vmdkのロックが解放されてファイルコピーができるようになり、バックアップ先のディレクトリに
/vmfs/volumes/nfs/www20090922.vmdk /vmfs/volumes/nfs/www20090922-s001.vmdk
が作成されました。で、最後にスナップショットを削除して、元通りです。
うちの環境には同様にdbというVM名の仮想マシンもあるのですが、そっちも同様に以下のようなコマンドでバックアップが作成できます。
vim-cmd vmsvc/snapshot.create `vim-cmd vmsvc/getallvms| awk '/db/ {print $1;}'` forBackup vmkfstools -i /vmfs/volumes/esxiDisk/db/db.vmdk -d monosparse /vmfs/volumes/nfs/db`TZ=JST-9 date '+%Y%m%d%H%M'`.vmdk vim-cmd vmsvc/snapshot.remove `vim-cmd vmsvc/getallvms| awk '/db/ {print $1;}'`
次は先のコマンドをshにしておいて、ESXi上のcronで定期的に実行すればよさそうです。とりあえずコマンドは
/vmfs/volumes/esxiDisk/backupServer.sh
においてchmod 755しておきます。
さてESXiでcronが利用できるかについてですが、
/var/spool/cron/crontabs/root
にはなにやらいろいろ書いてあるのでcron自体は使用できるみたいですが crontb -e とかでcronの設定の追加はできないようです。先のファイルに直接書いてもESXiを再起動すると失われてしまうようです。
結果として /etc/rc.localに以下のように記述して逃れることにします。
~ # cat /etc/rc.local #! /bin/ash export PATH=/sbin:/bin ... 割愛 ... (元々いろいろ書いてあったモノはそのまま) ln -s /vmfs/volumes/esxiDisk/backupServer.sh /sbin/backupServer.sh # crontabs cat<<_EOT_>>/var/spool/cron/crontabs/root 50 16 * * * /sbin/backupServer.sh <-日本時間は25:50 _EOT_ kill -sigterm `ps|awk '/[c]rond/ {print $1;}'` crond
このようにrc.local内で起動時にcron設定を追加し、crondを再起動することにします。
この項は(他の項もですが) AKI ON WEB: VMware ESXi 3.5のcrontabを(半ば強引に)使うの情報を思いきり参考にさせてもらいました!感謝です!
ESXiを5.1にUpdateしたところ、/etc/rc.localを編集できなくなってしまった*2ようなので、そんな場合は、/etc/rc.local.d/local.sh に同じ記述を追加することで対応しました。
リストアするには先ほどバックアップしたvmdkファイルを利用して、vSphere Clientから仮想マシンを再作成すれば完了*3ですが、バックアップしたファイルはmonosparseというそのままでは使えない形式なので、monosparseなディスクを変換する にしたがってファイルをシンプロビジョニング形式などに変換してください。
さてもともとバックアップのシェルは
vim-cmd vmsvc/snapshot.create `vim-cmd vmsvc/getallvms| awk '/www/ {print $1;}'` forBackup vmkfstools -i /vmfs/volumes/esxiDisk/www/www.vmdk -d monosparse /vmfs/volumes/nfs/www`TZ=JST-9 date '+%Y%m%d%H%M'`.vmdk vim-cmd vmsvc/snapshot.remove `vim-cmd vmsvc/getallvms| awk '/www/ {print $1;}'`
としてましたが、下記コメントに書いたようにいつからかうまくいかないようになってました。。この↑コマンドのように
vim-cmd vmsvc/snapshot.remove `vim-cmd vmsvc/getallvms| awk '/www/ {print $1;}'`
と snapshot.remove にvmid*4を指定するだけだと不十分で、
vim-cmd vmsvc/snapshot.remove $vmId $snapId
とsnapShotのIDを指定する必要があるようです。
さて対応した内容ですが、まず、あるVMのsnapShotの情報は下記のように取得できます。
# vmId=`vim-cmd vmsvc/getallvms| awk '/www/ {print $1;}'` # vim-cmd vmsvc/snapshot.get $vmId Get Snapshot: |-ROOT --Snapshot Name : forBackup1 --Snapshot Id : 403 --Snapshot Desciption : --Snapshot Created On : 9/23/2013 10:32:54 --Snapshot State : powered off --|-CHILD ----Snapshot Name : forBackup ----Snapshot Id : 404 ----Snapshot Desciption : ----Snapshot Created On : 9/23/2013 10:47:51 ----Snapshot State : powered off ----|-CHILD ------Snapshot Name : forBackup ------Snapshot Id : 405 ------Snapshot Desciption : ------Snapshot Created On : 9/23/2013 10:53:23 ------Snapshot State : powered off ------|-CHILD --------Snapshot Name : forBackup --------Snapshot Id : 406 --------Snapshot Desciption : --------Snapshot Created On : 9/23/2013 10:53:41 --------Snapshot State : powered off
さて、さっき作成したスナップショットは直近のものなので、IDは最新のものをとればいいわけですが、それは
vim-cmd vmsvc/snapshot.get $vmId | grep Id|awk '{print $4;}' | tail -1
とすれば取得できそう。。じっさいやってみると
# vim-cmd vmsvc/snapshot.get $vmId | grep Id|awk '{print $4;}' | tail -1 406 #
OKぽいですね。
結局下記のようにしました。
変更前:
vim-cmd vmsvc/snapshot.create `vim-cmd vmsvc/getallvms| awk '/www/ {print $1;}'` forBackup vmkfstools -i /vmfs/volumes/esxiDisk/www/www.vmdk -d monosparse /vmfs/volumes/nfs/www`TZ=JST-9 date '+%Y%m%d%H%M'`.vmdk vim-cmd vmsvc/snapshot.remove `vim-cmd vmsvc/getallvms| awk '/www/ {print $1;}'`
変更後:
vmId=`vim-cmd vmsvc/getallvms| awk '/www/ {print $1;}'` vim-cmd vmsvc/snapshot.create $vmId forBackup vmkfstools -i /vmfs/volumes/esxiDisk/www/www.vmdk -d monosparse /vmfs/volumes/nfs/www`TZ=JST-9 date '+%Y%m%d_%H%M'`.vmdk // ここまではおなじ。。 snapId=`vim-cmd vmsvc/snapshot.get $vmId | grep Id|awk '{print $4;}' | tail -1` // 直近のsnapShot IDを求めている。。 vim-cmd vmsvc/snapshot.remove $vmId $snapId
この記事は
現在のアクセス:170869