各種仮想マシン環境でのFreeze / thaw スクリプト

投稿者: | 3月 14, 2024

今回は、閑話休題はなし。というか閑話休題しなきゃならないくらい前置きがながい。本題は、かなり下までスクロールしないと出てこないので注意w

仕事で静止点の話がよく出るが。。。静止点ってそんなに気になったのか。。。多分気分で静止点を考えている人がかなり多いのではと思う。宗教的に盲信している人がいる。説明しても納得してもらえない。

 

静止点の話

そもそも、こういう経緯で静止点が出てきた。

Windowsをファイルバックアップ(ファイルコピー)をすると、ファイルがオープン中でバックアップ(コピー)ができないものがある。パッと答えらた人は昭和生まれ!

たとえば、レジストリファイルやIMEの辞書ファイル、データベースファイルなど。アプリがファイルをつかんでいるとバックアップ(コピー)をとらせてくれない。

ある程度は、事前に対応しているが、そういうファイルをバックアップしようとするとバックアップソフトが警告(Warning)を挙げてしまう。取れないのはみんな知っているが、バックアップジョブは完了とならず、警告で終わってしまう。つまり正常なバックアップなのに警告というステータス。実はこれが厄介で警告のアラートメールが毎回飛んでしまう。なので、バックアップソフトにはOpen File Optionなどという名の名目で、取れなかったファイルの警告を無視して成功とする機能があったりした。そうあったりした。

時は変わって、Windows XP/Windows Server 2003にVSSが実装された。

VSSは、OS上でスナップショットをとって、バックアップ(コピー)をさせてくれるようになった。(このVSSが出てくることによって、実は結構取れないものがあるのがわかったりした。詳しくは、vssadmin list writersコマンドで見てみると面白い)

このVSS、出だしは共有にあるファイルの過去バージョンを取り出させてくれる機能だったが、VSS Frameworkを使うとバックアップサーバ(Provider)がVSSを呼び出すと、OS内でデータベース(Writer)のスナップショット(Freeze)を作成して、データベースのバックアップ機能をキックしてくれる。それも、対応していれば、ストレージハードウェアをそのまま呼び出してくれる(Hardware Provider)という。なので、VSSを使えば、実は簡単にデータベースのバックアップが取れてしまう。ただし、VSSに対応したデータベースだけである。実際は、MicrosoftのMS SQL / ExchangeとOracleぐらいだが。

Windowsの場合は、話の主体がやんわり変わってきてしまっていることに気が付くかもしれない。そう、バックアップソフト屋さんで、バックアップできないファイルがあっても完了とするパーツとVSSの処理をするパーツをやっている人が社内で同一部署だったりしたのではと。。。(自分が過去いた会社はそうだった。)

 

一方Linuxはどうなっているのかというと、Linuxには、オープンファイルという概念がない。なので、取ろうと思えばなんでも取れてしまう。ただし、Linuxだと/dev(特殊デバイスファイル)や/proc, /sys(動的に作られたステータスや設定ファイル)、/boot (ブートローダーなどディスクのファイルシステム外と関係している)ファイルがあるので、取らないフォルダがあるくらい。

ちなみに、ロックされていると感じるときは、大抵、アプリが作ったLockファイルが邪魔をしているだけなので、Lockファイルを消せば普通にアプリが動けてしまう。

 

もう一つ、静止点で議論になるのは、ファイルコピー中のものはどうなるの?という話がある。

例えば、ある共有フォルダ /shareに大容量のISOファイルをアップロードをしているとする。そのファイルコピー中では静止点はどうなるか?

ファイルのアップロードが終わるまでロック(オープンファイル)になるか?答えはならない。ファイルのサイズが一体どれくらいで、アップロードの時間がどれだけかかるかはわからない。静止点(スナップショット)がキックされたら、そのファイルは、仕掛かり中のI/Oがぶった斬られて、アップロード未完のファイルとなる。これはどうにもならない。そういうことが嫌なら、OSの電源をオフにして取るか、スナップショットを撮る間だけスクリプトで仕掛かり中のI/Oが起きないようにするしかない。この例の共有へのアップロードの場合は、スナップショットを作成する前に共有を停止(Freeze)させて、スナップショットの作成が終わったら(Thaw)、共有を再開させるようにする。そうすることによって、アップロードをしている人には、スナップショットを切った瞬間にアップロードがエラーになるので、時間をおいて再度トライをしてくれると思う。(あるいは管理者に文句を言いに行くか)実際は、このスナップショット前後で、データベースを一時停止したり、データベースのバックアップをスクリプトで実行したりする。

 

最後にもう一つファイルシステムの静止点の話

ファイルシステムの静止点は、一体何か?ファイルシステムの状態のスナップショットと思っている人が多いが、ファイルシステムが「正しくアンマウント」された状態かどうかを言う。

Windows Serverで言えば、電源をプチっと切って、再度電源をオンにするとシャットダウントラッカーが出てきて、理由を入力させられる。(しないけど。)ファイルシステムが正しくクローズされていないから表示される。

Linuxの場合は、今はなかなか感じることが少ない。今のファイルシステムは、ジャーナルファイルシステムなので、もし、ファイルシステムが正しくアンマウントされていない状態で起動してきても、起動中にファイルシステムを裏でリカバリーしてしまう。唯一、ファイルシステムが正しくアンマウントされていないかどうかを体感したいのであれば、ファイルシステムをext2にすると体験できる。ext2は、ジャーナルファイルシステムではないので、ファイルシステムが正しくアンマウントされていない状態でマウントを使用とするとfsckが走ってしまう。これが大容量のパーティションだとすると最悪で、fsckが完了するまで、ブートプロセスが次に進まない。

Linuxのext2/ext3/ext4ファイルシステムの場合、ファイルシステムの状態は以下で見れる。

tune2fs -l /dev/sdb1 | grep "Filesystem state:"

Filesystem state: clean と出ていれば正常

Filesystem state: not clean と出ていたら正しくアンマウントされていない状態。fstabの6列目(最後)が1だったら、ファイルシステムチェックが行われてしまい、システム起動に時間がかかる。

ジャーナルファイルシステムだったら、第6列目は0にしておいて構わないかもしれない。

このファイルシステムが正常にアンマウントされたかの静止点は、仮想環境だとVMware Toolsで静止点を取らないと基本的には取れないと思う。ファイルシステムの静止点を仮想で取るのは難しい。今のファイルシステムであれば、ジャーナルで修正されてしまうので、こだわる必要はない。こだわりたいのであれば、電源オフの状態でバックアップするしかない。Windowsなら大方VSSでフリーズされてしまうし、Linuxならスクリプトでサービスを停止させたり、I/Oを止めてしまうしかない。

Linuxは、以下のコマンドでピタッとファイルシステムI/Oを停止させることができる。

fsfreeze -f /data

復帰は、以下のコマンドでできる。

fsfreeze -u /data

しかし、これをしてもファイルシステムのステートは、not cleanのままになる。

このファイルシステムが正常にアンマウントされたかどうか問題は、イメージバックアップでしか起きない。この問題から離脱したいのであれば、イメージバックアップをやめて、時間のかかるファイルバックアップを使うしかない。

 

 

静止点の説明を書くだけでこんなにかかってしまった。。。宗教的に盲信している人だとここまで説明ができないかもしれないと思う。

閑話休題というか、本題。

 

静止点の取り方一覧

まず、各仮想マシンでの静止点の状態を一覧にしてみる。

  VMware Tools Qemu Guest Agent Nutanix Guest Tools
Windows VSS VSSが動作 VSSが動作 VSSが動作
Windows Script あり なし あり
Linux Script あり あり あり

実は、Qemu Guest AgentのWindows環境では、Freeze/thawスクリプトをサポートされていない。(見つからない)よって、KVMのWindowsゲストだと、VSSをサポートしているデータベースしか使えない。これは盲点かもしれない。

 

スクリプトの形式

この手のスクリプトには2通りある

  • 第一引数で挙動が変わるもの (VMware Tools / Qemu Guest Agent)
  • Freeze/thawでそれぞれのスクリプトをもつもの (Nutanix Guest Tools)

第一引数で挙動が変わるスクリプトは要注意で、何も考えないでFreeze / thawのスクリプトを作って配置してしまうと

Freeze時

freeze.bat freeze
thaw.bat freeze

Thaw時

freeze.bat thaw
thaw.bat thaw

第一引数が無視されて、単純にFreezeとthawでそれぞれ2回ずつ、合計4回動いてしまうので注意。

 

スクリプトの作成

ここからが本題、以下、それぞれの環境のスクリプトを列記してみる。

とりあえず、動作したときに、日時と何が動いたのかをログに書き込み、ログに吐き出させていている。

以下は、OS上でコピペするだけでフォルダにサンプルスクリプトが配置される。

 

VMware Tools – Linux

VMware Toolsバージョン10.2以降で使える。

mkdir -p /etc/vmware-tools/backupScripts.d
cat << 'EOF' > /etc/vmware-tools/backupScripts.d/10-sample.sh
#!/bin/bash

LOGFILE=/var/log/vmware-tools-backup-`hostname`-`whoami`-$1.log

if [[ $1 == "freeze" ]]
then
  echo "This section is executed before the Snapshot is created"
  date >> ${LOGFILE}
  echo "freeze" >> ${LOGFILE}
elif [[ $1 == "freezeFail" ]]
then
  echo "This section is executed when a problem occurs during snapshot creation and cleanup is needed since thaw is not executed"
  date >> ${LOGFILE}
  echo "freezefail" >> ${LOGFILE}
elif [[ $1 == "thaw" ]]
then
  echo "This section is executed when the Snapshot creation was successful"
  date >> ${LOGFILE}
  echo "thaw" >> ${LOGFILE}
else
  echo "Usage: `/bin/basename $0` [ freeze | freezeFail | thaw ]"
  exit 1
fi
EOF
chmod +x /etc/vmware-tools/backupScripts.d/10-sample.sh

 

VMware Tools – Windows

これはPowerShellで記載してある。

# ディレクトリを作成するパス
$directoryPath = "C:\Program Files\VMware\VMware Tools\backupScripts.d"

# ディレクトリが存在しない場合に作成する
if (-not (Test-Path -Path $directoryPath -PathType Container)) {
  New-Item -Path $directoryPath -ItemType Directory
  Write-Host "Directory created: $directoryPath"
} else {
  Write-Host "Directory already exists: $directoryPath"
}
@'
@echo off

if "%~1" == "" goto USAGE
if %1 == freeze goto FREEZE
if %1 == freezeFail goto FREEZEFAIL
if %1 == thaw goto THAW

:USAGE

echo "Usage: %~nx0 [ freeze | freezeFail | thaw ]"

goto END

:FREEZE

echo "This section is executed before the Snapshot is created"
echo %date% %time% >> C:\freeeze.log
echo freeze >> C:\freeeze.log

goto END

:FREEZEFAIL

echo "This section is executed when a problem occurs during snapshot creation and cleanup is needed since thaw is not executed"
echo %date% %time% >> C:\freeezefail.log
echo freezefail >> C:\freeezefail.log

goto END

:THAW

echo "This section is executed when the Snapshot creation was successful"
echo %date% %time% >> C:\thaw.log
echo thaw >> C:\thaw.log

goto END
:END
'@ | Out-File -FilePath "C:\Program Files\VMware\VMware Tools\backupScripts.d\sample.cmd" -Encoding utf8

 

Qemu Guest Agent – Linux

mkdir -p /etc/qemu-ga/fsfreeze-hook.d/
cat << 'EOF' > /etc/qemu-ga/fsfreeze-hook.d/10-sample.sh
#!/bin/sh

LOGFILE=/var/log/qemu-ga-`hostname`-`whoami`-$1.log

case "$1" in
freeze)
date >> ${LOGFILE}
echo "freeze" >> ${LOGFILE}
 ;;

thaw)
date >> ${LOGFILE}
echo "thaw" >> ${LOGFILE}
 ;;

*)
      echo "Usage: `/bin/basename $0` [ freeze | thaw ]"
exit 1
;;
esac
EOF
chmod +x /etc/qemu-ga/fsfreeze-hook.d/10-sample.sh

Nutanix Guest Tools – Linux

cat << "EOF" > /usr/local/sbin/pre_freeze
#!/bin/sh

LOGFILE=/var/log/ngt-freeze-`hostname`-`whoami`.log

#pre_freeze-script
date >> ${LOGFILE}
echo "freeze" >> ${LOGFILE}
EOF
chown root /usr/local/sbin/pre_freeze
chmod 700 /usr/local/sbin/pre_freeze
cat << "EOF" > /usr/local/sbin/post_thaw
#!/bin/sh

LOGFILE=/var/log/ngt-thaw-`hostname`-`whoami`.log

#post_thaw-script
date >> ${LOGFILE}
echo "thaw" >> ${LOGFILE}
EOF
chown root /usr/local/sbin/post_thaw
chmod 700 /usr/local/sbin/post_thaw
shutdown -ht0 now

 

Nutanix Guest Tools – Windows

これはPowerShellで記載してある。

New-Item -ItemType Directory -Path 'C:\Progra~1\Nutanix\scripts\'
@'
@echo off
echo %date% %time% Running pre_freeze script >>C:\Progra~1\Nutanix\scripts\pre_freeze_log.txt
'@ | Set-Content -Path 'C:\Program Files\Nutanix\scripts\pre_freeze.bat'
@'
@echo off
echo %date% %time% Running post_thaw script >>C:\Progra~1\Nutanix\scripts\post_thaw_log.txt
'@ | Set-Content -Path 'C:\Program Files\Nutanix\scripts\post_thaw.bat'

スクリプトの動作確認

テストは、各環境でスナップショットを作成してみると確認ができる。VMwareの場合は、VMware Toolsの静止点を設定する必要がある。

コメントを残す