・VirtualBoxとホスト環境のsuspend/resume(その2)
昨日の続き。だいたいの見当は付いた。
最近のカーネル(手元で試したのは4.14.xと4.16.7)では、カーネル自身が複数の時刻情報源を認識し、それらの中から適切な情報源を選択して使用するらしい。
カーネルが使用している時刻情報源は /sys/devices/system/clocksource/clocksource0/current_clocksource に表われる。
$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource tsc
一方、利用可能な時刻情報源の一覧は /sys/deices/system/clocksource/clocksource0/available_clocksource に示される。
$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource tsc hpet acpi_pm
上記は実機の例で、tsc(time stamp counter)、hpet(high-precision event timer) 、acpi_pm(Advanced Configuration and Power Interface Power management)がそれぞれ時刻情報源として利用でき、それらのうちから tsc を使うことにしている。
ざっと調べたところ、tsc が CPU のカウンタ、hpet はハードウェアレベルな専用タイマー、 acpi_pm は ACPI 規格のBIOSが提供するインターフェイスで、精度もほぼこの順らしい。
一方、VirtualBox にインストールしたカーネルでは利用可能な時刻情報源は kvm_clock と acpi_pm になり、最近のカーネルだと kvm_clock を優先して使うものの、どうもVirtualBox な環境では kvm_clock ではダメで acpi_pm にしておく必要がある模様。
VirtualBox 側の設定で変更できそうな気もする。
実は、この設定は動作中に切り替えることも可能で、
# echo "acpi_pm" > /sys/devices/system/clocksource/clocksource0/current_clocksource
してやれば acpi_pm を使うようになって、ホスト側のサスペンド/レジューム後もゲスト環境は問題なく動作するようになった。
起動時から変えるには、カーネルの起動時パラメータに
clocksource=acpi_pm
を追加すればよさげ。