0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

バックアップデータが欠損してた(マルチディスクの考慮)

Last updated at Posted at 2025-11-04

はじめに

私の所属している研究室で,VMware ESXiのバックアップスクリプトを運用していたところ,バックアップデータの一部が欠損していました.原因としては,マルチディスクを使った仮想マシンを考慮できていなかったことで,.vmdk拡張子のファイルが取れていませんでした.
ちゃんと構成やバックアップについて理解していれば問題はない初歩的な内容ですが,これからバックアップ初心者は引っかかるかもしれません.

環境

VMware ESXi 8.0.3 build-24414501

バックアップの構成としては以下の図のようになっています.esxi-backupというVMからjasmine-bk.shをcronを使って3時に起動します.jasmine-bk.shはJasmineというESXiにあるbackup.shを動かすスクリプトです.ESXiのStoreNAS-Jasmine2からStoreNAS-Backup-Jasmineにバックアップを行う.
image.png

起こったこと

研究室で卒業課題のために新たに運用するサービスを公開しようと,今年Doktorというマイクロサービスを公開しました.今まで研究室でやっていなかったことをやっているため,問題も多く発生しており,その問題の1つがバックアップデータの欠損です.
バックアップスクリプトである,backup.shでは,スナップショット作成→.vmdk拡張子のファイルをバックアップ→スナップショットの削除→.vmdk拡張子のファイルのバックアップという手順でバックアップを行っています.
作成された当初は恐らくこのバックアップスクリプトで問題は起きておらず,このまま運用されていました.

↓運用していたbackup.sh

date_dir="$(date +%Y-%m-%d-%H-%M)"
echo "date_dir=$date_dir"
mkdir /vmfs/volumes/StoreNAS-Backup-Jasmine/backup/$date_dir

vim-cmd vmsvc/getallvms | grep -v Name | grep StoreNAS-Jasmine2 | awk "{print \$4;}" | cut -f 1 -d "/" | 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-Jasmine2 | 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-Jasmine/backup/$date_dir/$vm_name"
  # copy backup vmdisc
  vmkfstools -i "/vmfs/volumes/StoreNAS-Jasmine2/$vm_name/$vm_name.vmdk" -d thin "/vmfs/volumes/StoreNAS-Backup-Jasmine/backup/$date_dir/$vm_name/$vm_name.vmdk"
  # delete snapshot
  vim-cmd vmsvc/snapshot.removeall $vm_id
  # copy backup file
  find /vmfs/volumes/StoreNAS-Jasmine2/"$vm_name"/* -not -name "*.vmdk" -exec cp {} /vmfs/volumes/StoreNAS-Backup-Jasmine/backup/$date_dir/"$vm_name"/ \;
done

しかし,Doktorの開発環境をリストアするためにバックアップからリストアする際にバックアップデータが欠損していてバックアップが行えませんでした.
原因としてはマルチディスクを考慮してバックアップを取っていなかったからです.マルチディスクとは,1台の仮想マシンに複数の仮想ハードディスクを接続して使う構成のことで,Doktorでは仮想ハードディスクが2台で構成されていました.
わかっている人からしたら当然かもしれませんが,どうやらESXiでは,1つの仮想マシンに複数の仮想ディスクを割り当てるとディスクごとに.vmdk拡張子のファイルが作成されます.具体的には,$vm_name.vmdk$vm_nameはVM名)と$vm_name_1.vmdkのファイルが作成されていました.現在のシェルスクリプトでは,$vm_name.vmdkしかバックアップが作成されず,$vm_name_1.vmdkのファイル欠損していました.

↓問題の箇所:$vm_name.vmdkを指定しているため,欠損する

vmkfstools -i "/vmfs/volumes/StoreNAS-Jasmine2/$vm_name/$vm_name.vmdk" -d thin "/vmfs/volumes/StoreNAS-Backup-Jasmine/backup/$date_dir/$vm_name/$vm_name.vmdk"

対処

対処方法としては$vm_name.vmdk以外の.vmdk拡張子のファイルも探してバックアップを行うことです.方法はなんでもいいですが,私はforループで.vmdk拡張子のファイルも探し,それらのファイルをバックアップしています.その際,エクステントファイルは直接コピーせずvmkfstoolsコマンド側が勝手に処理してくれるので,*-flat.vmdk*-delta.vmdk*-sesparse.vmdkは除外します.
そうすることで,仮想ハードディスクがいくら増えようとも対処ができるバックアップスクリプトにすることができました.

↓改善した問題の箇所

for vmdk in /vmfs/volumes/StoreNAS-Jasmine/"$vm_name"/*.vmdk; do
    [ -e "$vmdk" ] || continue
    case "$vmdk" in *-flat.vmdk|*-delta.vmdk|*-sesparse.vmdk) continue ;; esac
    vmkfstools -i "$vmdk" -d thin "/vmfs/volumes/StoreNAS-Backup-Jasmine/backup/$date_dir/$vm_name/$(basename "$vmdk")"
done

確認

バックアップデータを確認したところ,$vm_name_1.vmdkもバックアップを正常に取れていました.プログラム改善前と改善後で比べると,G2124034-doktor-m-v2_1.vmdkとそれのバイナリファイルである,G2124034-doktor-m-v2_1-flat.vmdkが増えています.

↓プログラム改善前の欠損しているバックアップデータ.

[root@jasmine:/vmfs/volumes/4e27fa8d-6a04048a/backup/2025-10-29-18-00/G2124034-doktor-m-v2] ls
G2124034-doktor-m-v2-151.scoreboard
G2124034-doktor-m-v2-152.scoreboard
G2124034-doktor-m-v2-153.scoreboard
G2124034-doktor-m-v2-154.scoreboard
G2124034-doktor-m-v2-155.scoreboard
G2124034-doktor-m-v2-156.scoreboard
G2124034-doktor-m-v2-157.scoreboard
G2124034-doktor-m-v2-158.scoreboard
G2124034-doktor-m-v2-159.scoreboard
G2124034-doktor-m-v2-160.scoreboard
G2124034-doktor-m-v2-aux.xml
G2124034-doktor-m-v2-flat.vmdk
G2124034-doktor-m-v2.nvram
G2124034-doktor-m-v2.scoreboard
G2124034-doktor-m-v2.vmdk
G2124034-doktor-m-v2.vmsd
G2124034-doktor-m-v2.vmx
G2124034-doktor-m-v2.vmxf
G2124034-doktor-m-v2.vmx~
vmware-157.log
vmware-158.log
vmware-159.log
vmware-160.log
vmware-161.log
vmware-162.log
vmware-163.log
vmware-164.log
vmware-165.log
vmware-166.log
vmware.log
vmx-G2124034-doktor-m-v2-f1f8774a68637ff947552ade47616750672a4d76cc419d31af3561ce2faa5147-2.vswp
vmx-G2124034-doktor-m-v2-f1f8774a68637ff947552ade47616750672a4d76cc419d31af3561ce2faa5147-3.vswp
[root@jasmine:/vmfs/volumes/4e27fa8d-6a04048a/backup/2025-10-29-18-00/G2124034-doktor-m-v2]

↓プログラム改善後の正常に動作しているバックアップデータ

[root@jasmine:/vmfs/volumes/4e27fa8d-6a04048a/backup/2025-11-03-20-30/G2124034-doktor-m-v2] ls
G2124034-doktor-m-v2-151.scoreboard
G2124034-doktor-m-v2-152.scoreboard
G2124034-doktor-m-v2-153.scoreboard
G2124034-doktor-m-v2-154.scoreboard
G2124034-doktor-m-v2-155.scoreboard
G2124034-doktor-m-v2-156.scoreboard
G2124034-doktor-m-v2-157.scoreboard
G2124034-doktor-m-v2-158.scoreboard
G2124034-doktor-m-v2-159.scoreboard
G2124034-doktor-m-v2-160.scoreboard
G2124034-doktor-m-v2-aux.xml
G2124034-doktor-m-v2-flat.vmdk
G2124034-doktor-m-v2.nvram
G2124034-doktor-m-v2.scoreboard
G2124034-doktor-m-v2.vmdk
G2124034-doktor-m-v2.vmsd
G2124034-doktor-m-v2.vmx
G2124034-doktor-m-v2.vmxf
G2124034-doktor-m-v2.vmx~
G2124034-doktor-m-v2_1-flat.vmdk
G2124034-doktor-m-v2_1.vmdk
vmware-157.log
vmware-158.log
vmware-159.log
vmware-160.log
vmware-161.log
vmware-162.log
vmware-163.log
vmware-164.log
vmware-165.log
vmware-166.log
vmware.log
vmx-G2124034-doktor-m-v2-f1f8774a68637ff947552ade47616750672a4d76cc419d31af3561ce2faa5147-2.vswp
vmx-G2124034-doktor-m-v2-f1f8774a68637ff947552ade47616750672a4d76cc419d31af3561ce2faa5147-3.vswp
[root@jasmine:/vmfs/volumes/4e27fa8d-6a04048a/backup/2025-11-03-20-30/G2124034-doktor-m-v2]

まとめ

新しいサービスを作成するたび,そのサービスのバックアップ方法も既存の手法が適用できるのかしっかり考える必要があります.今回はマルチディスクを考慮したバックアップが行われていかったため,リストアする際にバックアップデータが欠損している問題が発覚しました.
再発を防ぐためには,毎回リストアしてバックアップが正しく取れているのか確認するのは大変なので,アラートルール作って監視するとかが現実的ですかね.一旦卒業研究が落ち着いたらバックアップを監視できるExporterを作成しようと考えています.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?