研究室にあるVMのバックアップ事情

こんにちは学部四年の山口です。

今回は先日行った研究室のVM(仮想マシン / バーチャルマシン / Virtual Machine)バックアップについてお話します。

cdslにはESXiというハイパーバイザーのソフトウェアを用いてvmを立てているサーバーが5台あり、1台は外向けのルターに接続されたサーバーで外部に公開するサーバーとして使用しており、4台は研究で使用するためのサーバーとして使用しています。

このサーバーには研究のため研究室のメンバーそれぞれがvmを立てて、vmをいろいろ動かしています。そのためこのvmが消えてしまうとこれまでやってきた研究のデータが消えてしまうため、vmが消えてしまってもデータを残すためにバックアップを行う必要があります。

バックアップはシェルスクリプトを使用して実行ファイルを作成しcronを用いて定期的に実行を行っています。cronの設定は/var/spool/cron/crontabs/rootのファイルに下記のように書くことで毎日一回24時にバックアップを行うシェルスクリプト(backup.sh)を実行しています。

#min hour day mon dow command
00   0    *   *   *   /vmfs/volumes/StoreNAS-Backup-Mint/backup/backup.sh

この実行しているbackup.shの内容

  1. 仮想マシンの名前と仮想マシンIDを取得する
  2. 仮想マシンのスナップショットを作成
  3. 仮想ディスク (vmdk) をバックアップ
  4. スナップショットを削除 (ディスク統合)
  5. 仮想マシンファイルのバックアップ
  6. 過去3回分のバックアップを残してバックアップの削除

この2~5をvmの数だけ繰り返し行うことでバックアップを行っています。

5台のサーバーのうち1台のサーバーであるmintのサーバーのbackup.shは以下のようになっています。

##
# create backup
##
date_dir="$(date +%Y-%m-%d-%H-%M)"
echo "date_dir=$date_dir"
mkdir /vmfs/volumes/StoreNAS-Backup-Mint/backup/$date_dir
vim-cmd vmsvc/getallvms | grep -v Name | grep StoreNAS-Mint | awk "{print \$2;}" | while read vm_name
do
  echo "vm_name=$vm_name"
  # get virtual machine id
  vm_id=$(vim-cmd vmsvc/getallvms | grep "$vm_name" | grep StoreNAS-Mint | awk "{print \$1;}")
  echo "vm_id=$vm_id"
  # create a snapshot
  vim-cmd vmsvc/snapshot.create $vm_id $vm_name
  # create dir
  mkdir "/vmfs/volumes/StoreNAS-Backup-Mint/backup/$date_dir/$vm_name"
  # copy backup vmdisc
  vmkfstools -i "/vmfs/volumes/StoreNAS-Mint/$vm_name/$vm_name.vmdk" -d thin "/vmfs/volumes/StoreNAS-Backup-Mint/backup/$date_dir/$vm_name/$vm_name.vmdk"
  # delete snapshot
  vim-cmd vmsvc/snapshot.removeall $vm_id
  # copy backup file
  find /vmfs/volumes/StoreNAS-Mint/"$vm_name"/* -not -name "*.vmdk" -exec cp {} /vmfs/volumes/StoreNAS-Backup-Mint/backup/$date_dir/"$vm_name"/ \;
done
############# ここからStorePCIeのVMのバックアップコードの追加
vim-cmd vmsvc/getallvms | grep -v Name | grep StorePCIe | awk "{print \$2;}" | while read vm_name
do
  echo "vm_name=$vm_name"
  # get virtual machine id
  vm_id=$(vim-cmd vmsvc/getallvms | grep "$vm_name" | grep StorePCIe | awk "{print \$1;}")
  echo "vm_id=$vm_id"
  # create a snapshot
  vim-cmd vmsvc/snapshot.create $vm_id $vm_name
  # create dir
  mkdir "/vmfs/volumes/StoreNAS-Backup-Mint/backup/$date_dir/$vm_name"
  # copy backup vmdisc
  vmkfstools -i "/vmfs/volumes/StorePCIe/$vm_name/$vm_name.vmdk" -d thin "/vmfs/volumes/StoreNAS-Backup-Mint/backup/$date_dir/$vm_name/$vm_name.vmdk"
  # delete snapshot
  vim-cmd vmsvc/snapshot.removeall $vm_id
  # copy backup file
  find /vmfs/volumes/StorePCIe/"$vm_name"/* -not -name "*.vmdk" -exec cp {} /vmfs/volumes/StoreNAS-Backup-Mint/backup/$date_dir/"$vm_name"/ \;
done
##
# delete old backup files
##
# keep latest 3 versions
ls -r /vmfs/volumes/StoreNAS-Backup-Mint/backup | tail -n+4 | xargs -I{} rm -fr /vmfs/volumes/StoreNAS-Backup-Mint/backup/{}

バックアップの保存先について

vmの保存先とバックアップの保存先にNASを用いています。

NASとは「NAS(Network Attached Storage)=ナス」の略称で、ネットワーク(LAN)上に接続することができるハードディスクです。下の写真のものを使用しています。

構成は以下の図のようになっていて、vmのデータをNASにバックアップしています。

参考資料

Leave a Reply