QA@IT

【VirtualBox】×ボタン等で CentOS 7 をシャットダウンしたい

6914 PV

ゲストOSは CentOS 7 です。VirtualBoxのウィンドウで×ボタンを押したときに表示される「仮想マシンを閉じる」ダイアログにおいて、「シャットダウン シグナル送信」を選択すると、CentOSのGUIでサスペンドしたときと同じ状態になります。もう一度×ボタンを押して「シャットダウン シグナル送信」を選択すると、ロックしたときの画面が表示されます。

このように、パソコンの電源ボタンに「サスペンド」を割り当てているような挙動になるのですが、「サスペンド」ではなく「シャットダウン」させるにはどうすれば良いのでしょうか。

環境

  • systemd 208-20.el7_1.6
  • CentOS 7.1-1503
  • VirtualBox 5.0.4 r102546
  • Windows 7 SP1 64bit

設定

/etc/systemd/logind.conf の内容は次のようにすべてコメントアウトされており、HandlePowerKey は初期値である poweroff になっているはずです。

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# See logind.conf(5) for details

[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
#HandlePowerKey=poweroff
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate
#HandleLidSwitch=suspend
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#IdleAction=ignore
#IdleActionSec=30min

また、acpid サービスは無効になっています。

試してみたこと

上記のファイルを以下のように書き換え、sudo systemctl restart systemd-logind を実行して設定を反映しました。その後同じように「シャットダウン シグナル送信」を選択してみましたが、同じ結果になりました。

[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
HandlePowerKey=poweroff
HandleSuspendKey=poweroff
HandleHibernateKey=poweroff
HandleLidSwitch=poweroff
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#IdleAction=ignore
#IdleActionSec=30min

以下のように ignore に変えても結果は同じでした。

[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
HandlePowerKey=ignore
HandleSuspendKey=ignore
HandleHibernateKey=ignore
HandleLidSwitch=ignore
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#IdleAction=ignore
#IdleActionSec=30min

回答

自分の環境では再現しませんでした。100さんとほぼ同じ環境で、違いはVirtualBoxが5.0.2で、100さんの5.0.4より若干古いだけです。acpidサービスも100さんと同じく無効です。

こちらの環境では「×ボタン」->「シャットダウン シグナル送信」でシャットダウン動作となります。/etc/systemd/logind.confはデフォルトのままです。つまり期待通りデフォルトで「HandlePowerKey=poweroff」になっているようです。

試しに/etc/systemd/logind.confを書き換えて「HandlePowerKey=suspend」にすると、サスペンド動作になったので、systemd-logindの設定は効いているように見えます。

100さんの環境でなぜデフォルトの動作がサスペンドになるかは分からないですが、VirtualBox側のログとゲストOS側の両方のログを見て、サスペンド時に何が起こっているかを調べたほうがよさそうです。

あと100さんの環境ではsystemd-logindの設定を変更してリスタートしても、設定が効いていないように見えるので、その点も気になりました。この点もログから何か分からないものでしょうか。

こちらでは再現しなかったので原因は不明なんですが、考えてみたのはACPIに関係した何かの問題かとも思ったのですが、これといった原因が思いつきませんでした。

VirtualBoxのマニュアルによると、ACPIはデフォルトでONになっているようです。
settings-motherboard

マニュアルをざっと見たところでは(読み切れてないかもしれませんが)、設定はON/OFFくらいしかないように見受けられます。それもGUIからではなくコマンドラインからのようです。
vboxmanage-modifyvm

まったくの憶測ですが、「シャットダウン シグナル送信」はシステムの状態を通常の運用状態(S0)からいきなり完全な電源断(S5)にするのではなく、電源断直前の通知をするか、もしくは電源ボタン押下の割り込みを上げるなどしなければならないような気がします。

で、その通知を受けると、ゲストOSはshutdown実行後、状態を電源断(S5)に遷移させると思われます(本来の動作)。しかし100さんの環境では、ゲストOSがshutdownは行わず、状態をサスペンド(S1-S3のいずれか)に遷移させてしまう、といった感じなのでしょうかね。

ちなみに関係あるかどうか分かりませんが、自分のゲストOS(CentOS 7.1)の環境は最小構成になっていて、GUI(デスクトップ環境)は入っていません。

あまり答えになっていませんが、とりあえず思いついたことを書いてみました...

編集 履歴 (0)
  • 最小構成のCentOSでは再現しないということで、gdmを無効化したところシャットダウンシグナルで終了できました。GNOMEの設定が原因らしいということで調べたところ、dconfエディタで org.gnome.settings-daemon.plugins.power の button-power を変更することで制御できることがわかりました。この度はどうもありがとうございました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。