VMware ESXi 仮想マシンをバックアップ

このページの内容は、VMware ESXi 6で行った内容です。

仮想マシンを全部、別のディスクにバックアップします。

バックアップって書いてますが、そもそもの目的はHDDからSSDへの仮想マシンの載せ替えだったりします。

  1. (旧)HDDから(新)SSDにまるごとコピー (バックアップ)
  2. 仮想マシンをインベントリから除去
  3. SSDにコピーした仮想マシンをインベントリに登録
  4. 以後、定期的にSSDの仮想マシンをHDDにコピー(バックアップ)する運用

って感じでやっていこうと思います。

事前準備

ホストマシンから直接操作するか、もしくは、SSH接続できるようにしておきます。

注意事項

vmdk だけは特別扱いします。
※vmkfstoolsを使うって意味です。vmdk以外は普通に cp 。

使用できるコマンドに制限がある

ls -la /bin/sh

▲これがすべてなんですが、使えるコマンドはwikipediaをご覧ください。

function example(){   }
# ▲とか

find /vmfs/volumes/ディスク/仮想マシン -maxdepth 1 -type f ! -name '.vmdk' ! -name '.log' -print0 | xargs -0 cp -p {} /vmfs/volumes/ディスク/backup/仮想マシン
# ▲とか

こういうことをシェルスクリプトに書いてまとめて実行したいと思ったのですが、ダメっぽいです。

手順

場所を確認

ls -la /vmfs/volumes
識別名 -> 英数字

▲みたいな感じに出てくるので「英数字」のほうを使います。識別名のほうは使いません。(使えません)

以降、「英数字」という表現を使っていきますが、ここの英数字の意味で読み替えてください。

念のためディレクトリの中を確認します。

ls -la /vmfs/volumes/英数字

仮想マシンのディレクトリが出てきたらOKです。

対象ファイルの一覧を書き出す

ファイルの一覧を書き出します。

find /vmfs/volumes/英数字 -maxdepth 2 -type f > /vmfs/volumes/英数字/file_list.txt

vSphere Client から「ホストマシン」 > 「構成」 > 「ストレージ」 > 「対象のデータストア」 > 右クリック > 「データストアの参照」

書き出したファイルをダウンロードします。

シェルスクリプトを作成

書き出したファイルの一覧を使ってスクリプトを作っていきます。

基本の形

「★英数字」はコピー元
「▲英数字」はコピー先

vmdk 以外は普通にコピー
vmdk は vmkfstools を使ってコピー
最後に vmx 内の絶対パスを新しいパスに書き換えて完了です。

# ディレクトリを作る
mkdir -p /vmfs/volumes/▲英数字/仮想マシン名

# ファイルをコピー
cp /vmfs/volumes/★英数字/仮想マシン名/*.vmx /vmfs/volumes/▲英数字/仮想マシン名/.
cp /vmfs/volumes/★英数字/仮想マシン名/*.vmxf /vmfs/volumes/▲英数字/仮想マシン名/.
cp /vmfs/volumes/★英数字/仮想マシン名/*.vmsd /vmfs/volumes/▲英数字/仮想マシン名/.
cp /vmfs/volumes/★英数字/仮想マシン名/*.nvram /vmfs/volumes/▲英数字/仮想マシン名/.
cp /vmfs/volumes/★英数字/仮想マシン名/*.log /vmfs/volumes/▲英数字/仮想マシン名/.
cp /vmfs/volumes/★英数字/仮想マシン名/*.xml /vmfs/volumes/▲英数字/仮想マシン名/.
cp /vmfs/volumes/★英数字/仮想マシン名/*.hlog /vmfs/volumes/▲英数字/仮想マシン名/.

# vmdk をコピー
vmkfstools -i /vmfs/volumes/★英数字/仮想マシン名/仮想マシン名.vmdk /vmfs/volumes/▲英数字/仮想マシン名/仮想マシン名.vmdk -d thin

# vmx 内のパスを変更
sed -i -e 's|/★英数字/|/▲英数字/|' /vmfs/volumes/▲英数字/仮想マシン名/仮想マシン名.vmx

▲を 変数を使った形に置き換えたものが▼です。

VM_NAME=仮想マシン名
FROM_VOLUME_NAME=★英数字
DEST_VOLUME_NAME=▲英数字

FROM_DIR=/vmfs/volumes/$FROM_VOLUME_NAME/$VM_NAME
DEST_DIR=/vmfs/volumes/$DEST_VOLUME_NAME/$VM_NAME

# 日付ディレクトリの中に入れる場合
# DEST_DIR=/vmfs/volumes/$DEST_VOLUME_NAME/backup_20210115/$VM_NAME

# ディレクトリを作る
mkdir -p $DEST_DIR

# ファイルをコピー
cp $FROM_DIR/*.vmx $DEST_DIR/.
cp $FROM_DIR/*.vmxf $DEST_DIR/.
cp $FROM_DIR/*.vmsd $DEST_DIR/.
cp $FROM_DIR/*.nvram $DEST_DIR/.
cp $FROM_DIR/*.log $DEST_DIR/.

if test -f $FROM_DIR/*.xml; then
    cp $FROM_DIR/*.xml $DEST_DIR/.
fi

if test -f $FROM_DIR/*.rom; then
    cp $FROM_DIR/*.rom $DEST_DIR/.
fi

if test -f $FROM_DIR/*.hlog; then
    cp $FROM_DIR/*.hlog $DEST_DIR/.
fi

# vmdk をコピー
vmkfstools -i $FROM_DIR/$VM_NAME.vmdk $DEST_DIR/$VM_NAME.vmdk -d thin

# vmx 内のパスを変更
sed -i -e "s|/$FROM_VOLUME_NAME/|/$DEST_VOLUME_NAME/|" $DEST_DIR/$VM_NAME.vmx

xml, rom, hlog はファイルが存在しない場合もあるので存在確認してからコピーします。

ここまで出来たら function にしたいところなんですが、上に書いたように busybox なので使えません。
ならば、と、 include とかあの手この手と考えてみたのですが、どうにも無理そうです。

ということで、手順の最初のところで作ったファイルの一覧を使います。

ファイルの一覧を基にシェルスクリプトを書き上げていきます。

仮想マシンによってファイル名が異なっていたり存在しなかったりする場合があるので、存在確認のチェックを入れたり、ファイルの一覧を見ながらやってくことになります。

このあたりもうちょっと良い方法ないかな、と思ってますので、また書き換えるかもです。

シェルスクリプトファイルを配置

データストアブラウザからファイルをアップロードします。

ここでは backup.sh というファイル名にしました。

アップロードされていることを確認します。

ls -la /vmfs/volumes/英数字

よく見ると実行権限が付いてないと思います。
データストアブラウザから行うと、ファイルをアップロードするたびに実行権限が外れるようです。

実行権限を付けてやります。

chmod +x /vmfs/volumes/英数字/backup.sh

コピー対象の仮想マシンはすべて停止していることを確認しておきます。

実行します。

/vmfs/volumes/英数字/backup.sh

いきなり全部の仮想マシンを書いて実行するのではなく、最初はどれか1つくらい選んで意図したとおりコピー出来ていることを確認しながらやることをオススメします。