#author("2024-08-03T02:37:15+00:00","","")
#author("2024-10-04T03:16:57+00:00","","")
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents


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

いろいろググってみると
-ゲストOSをなるべく止めないで、ホットバックアップしたい
-できれば自動化
-できれば無償で

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

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


**ホットバックアップの基本的な考え方 [#f198bb5a]
さてホットバックアップの方法ですが、そもそもVMwareの仮想マシンはOS起動中はロックされていてコピー(バックアップ)することができないのですが、スナップショットを取ることによって、スナップショット時点までのファイルはロックが解放されファイルコピーができるようになります。スナップショットを取れば、それまでのファイルとそこからの変更分みたいなファイル形式になるって感じでしょうね。

なので、スナップショットを作成してバックアップを作成し、その後スナップショットを削除するっていう手順を行えばOKそうです。


**手動で実行してみる [#n59b93c0]
例として wwwというvm名の仮想マシンのバックアップをすることを考えてみます。その仮想マシンは、
 /vmfs/volumes/esxiDisk/www/www.vmdk
にハードディスクのイメージがあり、そのディスクを
 /vmfs/volumes/nfs/
へコピーします。一応、ファイル名は日付を付けて世代管理します。

さて実際の手順ですが、ESXiにログイン後((ESXiへのログインはなどを参考にしてください))、以下のコマンドでバックアップを取ることができます。
 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などで自動化する [#o2db64a9]
次は先のコマンドを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を(半ば強引に)使う>http://akionweb.com/archives/2009/04/vmware-esxi-35crontab.shtml]]の情報を思いきり参考にさせてもらいました!感謝です!

** ESXi5.1だと/etc/rc.localが編集できなかったので [#w691645d]
ESXiを5.1にUpdateしたところ、/etc/rc.localを編集できなくなってしまった((Operation not permittedってなる))ようなので、そんな場合は、/etc/rc.local.d/local.sh に同じ記述を追加することで対応しました。


**リストア [#gb1791f3]
リストアするには先ほどバックアップしたvmdkファイルを利用して、vSphere Clientから仮想マシンを再作成すれば完了((vmdk以外のファイルもバックアップしてそれを使用してもいいけど、まあ簡単に再作成できるので取っとかなくてもいいかな、と。。))ですが、バックアップしたファイルはmonosparseというそのままでは使えない形式なので、[[monosparseなディスクを変換する>VMware/ESXi/TIPS集#q9af2f92]] にしたがってファイルをシンプロビジョニング形式などに変換してください。


**いつの間にかスナップショットがうまく消せなくなっていた [#r217020d]

さてもともとバックアップのシェルは
 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(( vim-cmd vmsvc/getallvms| awk '/www/ {print $1;}' のこと))を指定するだけだと不十分で、
 vim-cmd vmsvc/snapshot.remove $vmId $snapId
とsnapShotのIDを指定する必要があるようです。


**いつの間にかスナップショットがうまく消せなくなっていた件に対応。 [#accc0a96]
さて対応した内容ですが、まず、ある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


**関連リンク [#f8879922]
-[[AKI ON WEB: VMware ESXiゲストのバックアップ方法を考えてみる>http://akionweb.com/archives/2009/04/esxi.shtml]]
-[[AKI ON WEB: ESXiゲストの自動バックアップ処理の覚書>http://akionweb.com/archives/2009/04/esxi-1.shtml]]
-[[AKI ON WEB: VMware ESXi 3.5のcrontabを(半ば強引に)使う>http://akionweb.com/archives/2009/04/vmware-esxi-35crontab.shtml]]
-[[仮想ゲストOSバックアップ〜スクリプト編〜 | Whimsical Kitteeeeen>http://www.witkitty.com/wordpress/2009/07/05/esxi-backup-part2/]] バックアップのshまでアップされてます。すごいです!
-[[はてなブックマーク - masatomixのブックマーク - ESXi>http://b.hatena.ne.jp/masatomix/ESXi/]]
-[[monosparseなディスクを変換する>VMware/ESXi/TIPS集#q9af2f92]]
-[[ESXi5.1を623860から914609へアップデートする>http://bit.ly/VJeIu5]]

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

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS