VMware ESXi無償版でVMをコピーするシェルスクリプト
VMwareの案件があって、自分のESXiサーバをちょこちょこいじっているんですが、仮想マシンの保存先データストア(要はハードディスク)を変更したくなりました。Storage vMotionを使いたいところですが、無償版では手作業でやるしかありません。
そこで、ブログ記事「にほんごVMware ESXi でのVMのクローンについて(vCenterがない場合)」を真似してシェルスクリプトを作ってみました。
上記記事との差異としては、
- RDMは除外してコピーしてくれる
- vmxファイル内はいじらない
- テスト動作(Dry run)ができる
といったところでしょうか。
仮想マシンを別のデータストアに移すときや、RDM有りのVMをバックアップする際にお役に立てるかもしれません。
使い方としては下記のスクリプトをコピー先に配置し、下記のように実行してください。
sh copy_vm.sh <コピー元データストア名> <仮想マシン名>
この時、何でもいいので3つめの引数を指定するとDry runモードとなり、echo出力のみ行います(←手抜き)。
例: sh copy_vm.sh datastore1 vm1 test
仮想マシンを別のデータストアに移すときや、RDM有りのVMをバックアップする際にお役に立てるかもしれません。
使い方としては下記のスクリプトをコピー先に配置し、下記のように実行してください。
sh copy_vm.sh <コピー元データストア名> <仮想マシン名>
この時、何でもいいので3つめの引数を指定するとDry runモードとなり、echo出力のみ行います(←手抜き)。
例: sh copy_vm.sh datastore1 vm1 test
SRC_VM=/vmfs/volumes/$1/$2
DST_VM=$2
[ -d $SRC_VM ] || { echo "src_vm does not exist."; exit 1; }
[ -d $DST_VM ] && { echo "dst_vm already exists."; exit 1; }
echo "Make directory..."
echo "mkdir $DST_VM"
[ $# -eq 2 ] && mkdir $DST_VM
echo "Copy vmdk..."
### List vmdk only
ls $SRC_VM/*.vmdk | egrep -v '\-flat\.|\-delta\.|\-rdmp?\.' | while read L
do
### Skip RDM
RDM=`echo $L | sed -e s/\.vmdk/-rdm.vmdk/g`
[ -e $RDM ] && continue
RDMP=`echo $RDM | sed -e s/\-rdm\./-rdmp./g`
[ -e $RDMP ] && continue
L2=`echo $L | sed -e s@${SRC_VM}@${DST_VM}@g`
echo "$L => $L2"
[ $# -eq 2 ] && vmkfstools --diskformat thin --clonevirtualdisk $L $L2
done
echo "Copy another files..."
### List except vmdk,log
ls $SRC_VM/* | egrep -v '\.vmdk|\.log' | while read L
do
L2=`echo $L | sed -e s@${SRC_VM}@${DST_VM}@g`
echo "$L => $L2"
[ $# -eq 2 ] && cp -p $L $L2
done
コピーが終わった後は、必要に応じて下記のようにvmxファイル内に元のデータストアへの絶対パスが含まれていないか確認できます(grepにはデータストアのUUIDの一部を指定します)。
以上、お役に立てば幸いです。
for FN in `find . -name *.vmx`; do cat $FN | grep 51fe1b01; doneどうやら仮想スワップファイル(vswp)へのパスは絶対パスで含まれていることが多いようです。スナップショット込みのVMには付いてくることが多いようですのでお気をつけ下さい。
以上、お役に立てば幸いです。