ghettoVCB を使う方法
https://github.com/lamw/ghettoVCB
からスクリプトをダウンロードして設置する。
独自にスクリプトを作成する方法
ネットで拾ったスクリプト
仮想HDDを分割してバックアップしているので、リストア時に統合する必要があることに注意
#!/bin/sh
#Edit these values to match you environment
#####################################
#The datastore to backup to
backupDataStore=<backupDataStore>
#The directory on the above datastore to backup to(the default is mm-dd-yyyy)
backupDirectory=$(date +%m-%d-%Y)
#The list of virtual machine names(separated by a space) to backup
vmsToBackup="VM1 VM2 VM3"
#The amount of time to wait for the snapshot to complete, some systems are slower than others and snapshot operations may take longer to complete
waitTime=40s
#####################################
startTime=$(date)
echo Backup start time: $startTime
echo Creating backup directory /vmfs/volumes/$backupDataStore/$backupDirectory
mkdir -p /vmfs/volumes/$backupDataStore/$backupDirectory
echo Backing up ESXi host configuration...
vim-cmd hostsvc/firmware/backup_config
cp /scratch/downloads/*.tgz /vmfs/volumes/$backupDataStore/$backupDirectory/
for vm in $vmsToBackup;do
vmName=$vm
vmIdAndConfigPath=$( vim-cmd vmsvc/getallvms | awk '{ if ($2 == vmname) print $1 ";" $3 $4}' vmname=$vm)
vmId=${vmIdAndConfigPath%;*}
if [ "$vmId" != "" ]; then
echo Backing up virtual machine: $vmName
echo Backing up the virtual machines configuration...
vmConfigurationFilePath=$(echo ${vmIdAndConfigPath#*;} | sed -e 's/\[\(.*\)\]\(.*\)/\1;\2/')
vmConfigurationSourceDataStore=${vmConfigurationFilePath%;*}
vmConfigurationFile=${vmConfigurationFilePath#*;}
echo Making directory /vmfs/volumes/$backupDataStore/$backupDirectory/${vmConfigurationFile%/*}
mkdir -p /vmfs/volumes/$backupDataStore/$backupDirectory/${vmConfigurationFile%/*}
echo Copying /vmfs/volumes/$vmConfigurationSourceDataStore/$vmConfigurationFile to /vmfs/volumes/$backupDataStore/$backupDirectory/$vmConfigurationFile
cp /vmfs/volumes/$vmConfigurationSourceDataStore/$vmConfigurationFile /vmfs/volumes/$backupDataStore/$backupDirectory/$vmConfigurationFile
echo Taking the snapshot...
vim-cmd vmsvc/snapshot.create $vmId "Backup"
echo Waiting $waitTime for the snapshot to complete...
sleep $waitTime
echo Getting diskFile list...
vmDiskFilePaths=$(vim-cmd vmsvc/get.filelayout $vmId | grep -i snapshotFile -A2000 | sed -n -e 's/\"\[\(.*\)\]\s\(.*\.vmdk\)\"\,/\1;\2/pg')
echo Found $(echo $vmDiskFilePaths | wc -l) disk file\(s\)...
for vmDiskFilePath in $vmDiskFilePaths; do
vmDiskFileSourceDataStore=${vmDiskFilePath%;*}
vmDiskFile=${vmDiskFilePath#*;}
if [ -e /vmfs/volumes/$vmDiskFileSourceDataStore/$vmDiskFile ]; then
if [ ! -d /vmfs/volumes/$backupDataStore/$backupDirectory/${vmDiskFile%/*} ]; then
mkdir -p /vmfs/volumes/$backupDataStore/$backupDirectory/${vmDiskFile%/*}
fi
echo Cloning /vmfs/volumes/$vmDiskFileSourceDataStore/$vmDiskFile to /vmfs/volumes/$backupDataStore/$backupDirectory/$vmDiskFile
vmkfstools -d 2gbsparse -i /vmfs/volumes/$vmDiskFileSourceDataStore/$vmDiskFile /vmfs/volumes/$backupDataStore/$backupDirectory/$vmDiskFile
fi
done
echo Removing the snapshot...
vim-cmd vmsvc/snapshot.removeall $vmId
else
echo ERROR: Could not get an id for $vmName
fi
done
endTime=$(date)
echo Backup end time: $endTime
#echo Elapsed time: $(($startTime - $endTime))
カスタマイズ
vm 側からサーバのバックアップスクリプトを実行し、vmでマウントしたsambaにコピーする
仮想HDDを分割してバックアップしているので、リストア時に統合する必要があることに注意
サーバー側
#!/bin/sh
#Edit these values to match you environment
#####################################
#The datastore to backup to
backupDataStore=datastore1
#The directory on the above datastore to backup to(the default is mm-dd-yyyy)
#backupDirectory=back_temp/$(date +%m-%d-%Y)
backupDirectory=back_temp
distBaseDir=/vmfs/volumes/$backupDataStore/$backupDirectory
#The name of a virtual machine. allow to contain space in name.
# vmsToBackup="$*"
vmName="$*"
LINE_SEP='
'
#####################################
check_running_task (){
for i in `vim-cmd vimsvc/task_list | grep vim.Task:haTask-$1 | grep $2 | sed -e 's/.*vim.Task://' -e "s/[', ]//g"`; do
if [ "`vim-cmd vimsvc/task_info $i | grep running`" != "" ] ; then
return 0
fi
done
return 1
}
# getVmId (){
# vim-cmd vmsvc/getallvms | sed 's/[[:blank:]]\{3,\}/ /g' | awk -F' ' '{ if ($2 == vmname) print $1}' vmname="$*"
# }
#
# getVmx (){
# vim-cmd vmsvc/getallvms | sed 's/[[:blank:]]\{3,\}/ /g' | awk -F' ' '{ if ($1 == vmid) print $3}' vmid=$1
# }
#
getVMDKs(){
OLD_IFS=$IFS
IFS=$LINE_SEP
for i in $(grep '.vmdk"' "$*" | awk -F "\"" '{print $2}'); do
firstchar=`echo "$i" | cut -c 1-1`
if [ "$firstchar" = "/" ]; then
echo $i
else
echo ${*%/*}/$i
fi
#echo $i
done
IFS=$OLD_IFS
}
startTime=$(date)
echo Backup start time: $startTime
echo Creating backup directory "$distBaseDir"
mkdir -p "$distBaseDir"
echo Backing up ESXi host configuration...
vim-cmd hostsvc/firmware/backup_config
cp /scratch/downloads/*.tgz "$distBaseDir"
# vmid=`getVmId $vmName`
# echo $vmid
# vmx=`getVmx $vmid`
# echo $vmx
vmIdAndConfigPath=$( vim-cmd vmsvc/getallvms | sed 's/[[:blank:]]\{3,\}/ /g' | awk -F' ' '{ if ($2 == vmname) print $1 ";" $3}' vmname="$vmName")
vmId=${vmIdAndConfigPath%;*}
if [ "$vmId" != "" ]; then
echo Backing up virtual machine: $vmName
echo Backing up the virtual machines configuration...
vmConfigurationFileInfo=$(echo ${vmIdAndConfigPath#*;} | sed -e 's/\[\(.*\)\] \(.*\)/\1;\2/')
vmConfigurationSourceDataStore=${vmConfigurationFileInfo%;*}
vmConfigurationFile=${vmConfigurationFileInfo#*;}
vmBaseDir=${vmConfigurationFile%/*}
vmConfigurationFile=${vmConfigurationFile##*/}
srcBaseDir="/vmfs/volumes/$vmConfigurationSourceDataStore/${vmBaseDir}"
echo Backup source directory : "$srcBaseDir"
echo vmx : "$vmConfigurationFile"
echo Making directory "$distBaseDir/$vmBaseDir"
mkdir -p "$distBaseDir/$vmBaseDir"
echo Copying "$srcBaseDir/$vmConfigurationFile" to "$distBaseDir/$vmBaseDir/$vmConfigurationFile"
cp "$srcBaseDir/$vmConfigurationFile" "$distBaseDir/$vmBaseDir/$vmConfigurationFile"
vmDiskFilePaths=`getVMDKs "$srcBaseDir/$vmConfigurationFile"`
# echo $vmdks
echo Taking the snapshot...
vim-cmd vmsvc/snapshot.create $vmId "Backup"
# echo Waiting $waitTime for the snapshot to complete...
#sleep $waitTime
echo Waiting for the snapshot to complete...
while check_running_task $vmId createSnapshot; do sleep 1; done
# echo Getting diskFile list...
# vmDiskFilePaths=$(vim-cmd vmsvc/get.filelayout $vmId | grep -i snapshotFile -A2000 | sed -n -e 's/\"\[\(.*\)\]\s\(.*\.vmdk\)\"\,\?/\1;\2/pg')
echo $vmDiskFilePaths
echo Found $(echo "$vmDiskFilePaths" | wc -l) disk file\(s\)...
OLD_IFS=$IFS
IFS=$LINE_SEP
for vmDiskFilePath in $vmDiskFilePaths; do
# vmDiskFileSourceDataStore=${vmDiskFilePath%;*}
vmDiskFile="${vmDiskFilePath##*/}"
echo $vmDiskFilePath
if [ -e "$vmDiskFilePath" ]; then
echo Cloning "$vmDiskFilePath" to "$distBaseDir/$vmBaseDir/$vmDiskFile"
vmkfstools -d monosparse -i "$vmDiskFilePath" "$distBaseDir/$vmBaseDir/$vmDiskFile"
# vmkfstools -d thin -i "$vmDiskFilePath" "$distBaseDir/$vmBaseDir/$vmDiskFile"
fi
done
IFS=$OLD_IFS
echo Removing the snapshot...
# vim-cmd vmsvc/snapshot.removeall $vmId
SNAPSHOT_ID=$(vim-cmd vmsvc/snapshot.get $vmId | grep -E '(Snapshot Name|Snapshot Id)' | grep -A1 "Backup" | grep "Snapshot Id" | awk -F ":" '{print $2}' | sed -e 's/^[[:blank:]]*//;s/[[:blank:]]*$//')
for id in $SNAPSHOT_ID; do
vim-cmd vmsvc/snapshot.remove $vmId ${id}
done
else
echo ERROR: Could not get an id for $vmName
fi
# done
#cd /vmfs/volumes/$backupDataStore/$backupDirectory/
#dirnames=`ls -F /vmfs/volumes/$backupDataStore/$backupDirectory/ | grep /`
#
#for d in ${dirnames};do
# dirname=`echo $d | cut -d / -f 1`
# echo compress ${dirname}
#
# tar -czvf ${dirname}.tar.gz ${dirname}
# rm -r ${dirname}
#done
endTime=$(date)
echo Backup end time: $endTime
#echo Elapsed time: $(($startTime - $endTime))
呼び出し側
#!/bin/sh if [ "$*" != "" ]; then host=$1 vm=$2 backupDirectory=$(date +%Y-%m-%d) backupFrom=/vmfs/volumes/datastore1/back_temp backupTo=/mnt/smb/vmbackup/$backupDirectory/$vm echo ------------------------------------- echo host:$host echo vm:$vm echo $host:$backupFrom To $backupTo echo ------------------------------------- mkdir -p $backupTo ssh -i ~/.ssh/id_rsa $host rm -r $backupFrom/* ssh -i ~/.ssh/id_rsa $host /bin/vmbackup_server.sh $vm scp -r root@$host:$backupFrom/* $backupTo ssh -i ~/.ssh/id_rsa $host rm -r $backupFrom/* fi
サーバに自作シェルを置く際の注意
基本的にESXi再起動時にファイルが削除されてしまう。
# cd / # tar cvzf hoge.tgz bin/hoge.sh # mv hoge.tgz /bootbank/ # vi /bootbank/boot.cfg
起動時に解凍するファイルを追加する
modules=binmod.tgz --- environ.tgz --- cim.tgz --- oem.tgz --- license.tgz --- state.tgz --- hoge.tgz
リストア
仮想HDDを分割してバックアップしているので、リストア時に統合する必要があることに注意
1.バックアップしたハードディスクイメージを統合
vmkfstools -i インポート元.vmdk インポート先.vmdk
2.データストアブラウザで仮想マシンを「インベントリに追加」
その他
tar.gz を直接転送する
http://blog.xe.bz/archives/51126645.html
tar cf - test\ UBuntu | gzip - | ssh hoge@hoge.hoge "cat > /path/to/backupdir/hogehoge.tar.gz"
みたいな感じで、tar.gz をローカルに保存することなく直接SSHへ送れる。
バックアップスクリプト サンプル
http://www.witkitty.com/wordpress/2009/07/05/esxi-backup-part2/
esxiバックアップ.pdf(1149)
スナップショットを取る際に、プロセスを監視して待つところが良い。
[通知用URL]
Tweet
最終更新時間:2013年11月13日 00時57分20秒