仮想マシンの停止方法

azure
Published: 2024-12-16

はじめに

「Azure の仮想マシンには色々な停止方法があるんだよ」というだけのエントリです。

4つの停止方法

仮想マシンの停止には powerOff と deallocate という2つの API が存在します。

powerOff と deallocate の違いは、仮想マシンの vCPU とメモリが解放された「割り当て解除」の状態になるかどうかです。powerOff は割り当て解除になりません。deallocate はその名の通り割り当て解除になります。

さらに、この powerOff には skipShutdown というオプションが、deallocate には hibernate というオプションがあります。これらのオプションこみで、仮想マシンの停止方法は次の4つになります。

  1. Power Off
  2. Power Off + skipShutdown
  3. Deallocate
  4. Deallocate + hibernate

それぞれの挙動を実際に確認しました。

Power Off

powerOff をオプション無しで実行する方法です。厳密には、オプションである skipShutdown を既定の false で実行する方法です。

https://management.azure.com/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx/resourceGroups/test/providers/Microsoft.Compute/virtualMachines/stoptest/powerOff?api-version=2024-03-01

この方法では、仮想マシンの OS はシャットダウンされます。そして、OS のイベントログにはシャットダウンされたことを示すログが記録されます。

The process C:\Windows\system32\svchost.exe (stoptest) has initiated the shutdown of computer stoptest on behalf of user NT AUTHORITY\SYSTEM for the following reason: Other (Planned)
 Reason Code: 0x80000000
 Shutdown Type: shutdown
 Comment: Calling CleanShutdown by wvchelper
Reason for shutdown: Stop call

そして仮想マシンの状態は停止になります。OS は止まっているものの仮想マシンとしての料金が発生し続ける状態です。

> get-azvm -Name stoptest -ResourceGroupName test -Status | Select-Object Name,ResourceGroupName,@{Label="DisplayStatus"; Expression={$_.Statuses[-1].DisplayStatus}}

Name     ResourceGroupName DisplayStatus
----     ----------------- -------------
stoptest test              VM stopped

Power Off + skipShutdown

powerOff を skipShutdown つきで実行する方法です。skipShutdown を True にします。

https://management.azure.com/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx/resourceGroups/test/providers/Microsoft.Compute/virtualMachines/stoptest/powerOff?skipShutdown=True&api-version=2024-03-01

この方法で停止すると、仮想マシンの OS はシャットダウンされません。OS から見ると、電源ブチで落とした状態になります。イベントログには、シャットダウンされなかったことを示す各種ログが記録されます。

The previous system shutdown at 11:59:52 AM on 12/12/2024 was unexpected.
The last shutdown's success status was false. The last boot's success status was true.
The system has rebooted without cleanly shutting down first. This error could be caused if the system stopped responding, crashed, or lost power unexpectedly.

Bastion で仮想マシンに接続した状態でこの方法を実行したところ、シャットダウンされたことを示す青い画面が表示されず、Bastion の接続がハングしました。

そして、仮想マシンの状態は停止になります。

> get-azvm -Name stoptest -ResourceGroupName test -Status | Select-Object Name,ResourceGroupName,@{Label="DisplayStatus"; Expression={$_.Statuses[-1].DisplayStatus}}

Name     ResourceGroupName DisplayStatus
----     ----------------- -------------
stoptest test              VM stopped

Deallocate

deallocate をオプション無しで実行する方法です。Azure Portal 上の「停止」ボタンはこの方法を利用します。

https://management.azure.com/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx/resourceGroups/test/providers/Microsoft.Compute/virtualMachines/stoptest/deallocate?api-version=2024-03-01

この方法で停止すると、仮想マシンの OS はシャットダウンされます。また、OS のイベントログにはシャットダウンされたことを示すログが記録されます。

The process C:\Windows\system32\svchost.exe (stoptest) has initiated the shutdown of computer stoptest on behalf of user NT AUTHORITY\SYSTEM for the following reason: Other (Planned)
 Reason Code: 0x80000000
 Shutdown Type: shutdown
 Comment: Calling CleanShutdown by wvchelper
Reason for shutdown: Stop call

Bastion で仮想マシンに接続した状態でこの方法を実行したところ、シャットダウンされたことを示す青い画面が表示されました。

そして、仮想マシンの状態は割り当て解除になります。

> get-azvm -Name stoptest -ResourceGroupName test -Status | Select-Object Name,ResourceGroupName,@{Label="DisplayStatus"; Expression={$_.Statuses[-1].DisplayStatus}}

Name     ResourceGroupName DisplayStatus
----     ----------------- -------------
stoptest test              VM deallocated

Hibernate

deallocate を hibernate オプションありで実行する方法です。Azure Portal 上の「休止状態」ボタンはこの方法を利用します。

https://management.azure.com/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx/resourceGroups/test/providers/Microsoft.Compute/virtualMachines/stoptest/deallocate?hibernate=True&api-version=2024-03-01

この方法で停止すると、仮想マシンの OS はシャットダウンされずスリープします。OS のイベントログにはスリープしたことを示すログが記録されます。

The system is entering sleep. 
 
Sleep Reason: Application API 

Bastion で仮想マシンに接続した状態でこの方法を実行したところ、シャットダウンされたことを示す青い画面は表示されませんでした。

そして、仮想マシンの状態は 割り当て解除(休止状態)になります。休止状態であっても割り当て解除であることに変わりはないため、仮想マシンの利用料金は発生しません。

PS C:\Users\ymatsumoto> get-azvm -Name stop3 -ResourceGroupName test -Status | Select-Object Name,ResourceGroupName,@{Label="DisplayStatus"; Expression={$_.Statuses[-1].DisplayStatus}}

Name  ResourceGroupName DisplayStatus
----  ----------------- -------------
stop3 test              VM hibernated

まとめ

仮想マシンの4つの停止方法をまとめました。それぞれの違いは次の通りです。

手段 OS の状態 仮想マシンの状態
Power Off シャットダウンされる 停止
Power Off + skipShutdown シャットダウンされない 停止
Deallocate シャットダウンされる 割り当て解除
Deallocate + hibernate スリープされる 休止状態

Power Off や Power Off + skipShutdown を使うことはほぼないと思いますが、知っておくといざというときに役に立つかもしれません。

Note

  • 当サイトは個人のブログです。このブログに示されている見解や意見は個人的なものであり、所属組織の見解や意見を表明するものではありません。
  • 公開情報を踏まえて正確な情報を掲載するよう努めますが、その内容の完全性や正確性、有用性、安全性、最新性について一切保証しません。
  • 添付文章やリンク先などを含む本サイトの内容は作成時点でのものであり、予告なく変更される場合があります。