Top / VMware / ESXi / バックアップ運用

うちのサーバ群も仮想化環境としておせわになってるVMware ESXiですが、バックアップの運用を真剣に考えなきゃと思い、着手し始めました。

いろいろググってみると

  • ゲストOSをなるべく止めないで、ホットバックアップしたい
  • できれば自動化
  • できれば無償で

などを実現している方もいらっしゃるようですね。

いろいろ調べながら、うちでもやってみることにします。

ホットバックアップの基本的な考え方

さてホットバックアップの方法ですが、そもそも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;}'`

cronなどで自動化する

次は先のコマンドを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を(半ば強引に)使うの情報を思いきり参考にさせてもらいました!感謝です!

ESXi5.1だと/etc/rc.localが編集できなかったので

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

関連リンク


この記事は

選択肢 投票
おもしろかった 127  
そうでもない 2  
  • ESXiへのログインは -- 2011-07-08 (金) 14:04:36
  • あれ、SnapShot?うまく消えてない?ESXiをVer.upしてからかな、、、? -- きの? 2013-05-19 (日) 23:49:08
  • 同じヒト発見。 http://sky.jp/sub103.html やっぱりUpdateして変わったのだろう -- きの? 2013-05-20 (月) 00:16:44
  • SnapShot?の件は、ESXiをUpdateしたときに仕様が変わったみたいですね。結局shで直近のSnapshotId?を取得し、それを渡すように変更する予定です*5 -- きの? 2013-08-15 (木) 19:58:58

Top / VMware / ESXi / バックアップ運用

現在のアクセス:140833


*1 ESXiへのログインはなどを参考にしてください
*2 Operation not permittedってなる
*3 vmdk以外のファイルもバックアップしてそれを使用してもいいけど、まあ簡単に再作成できるので取っとかなくてもいいかな、と。。
*4 vim-cmd vmsvc/getallvms| awk '/www/ {print $1;}' のこと
*5 っていうか変更した

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-09-07 (木) 12:55:05 (18d)