Kernel/VM Advent Calendar 9日目: VirtualBoxによるLinuxへのCPU hotplug

もう、だいぶ前からですが、VirtualBoxはCPU hotplugをサポートしています。
virtualization.info | リリース:Oracle VM VirtualBox 3.2(20100519-2)

マニュアルもあります。
Chapter 9. Advanced topics

というわけで、手元のMac OS XVirtualBoxでも実際できるのか、確かめてみました。

やってみた

実験環境はこんな感じです。

ハードウェア Mac mini, Intel Core 2 Duo(2.53GHz)
ホストOS Mac OS X 10.6.4
VMM VirtualBox 3.2.12
ゲストOS Linux 2.6.33 (x86_64) (Fedora13)

ゲストLinuxは64bit版じゃないとダメだそうです。8CPUとあるのは、たぶん、ゲストに割り当てる仮想CPUのことだと思われ。
おそらく上は誤訳で、仮想CPUが8個より多い場合でやる時は64bit版ゲストLinuxが必要だよ、ということだと思います。
なので32bit版Linuxでも出来るんじゃないかと(試してませんが)。

http://www.virtualbox.org/manual/ch09.html#cpuhotplug

Windows supports only hot-add while Linux supports hot-add and hot-remove but to use this feature with more than 8 CPUs a 64bit Linux guest is required.

まずは、VMの起動前にやること。

ホストOSから、VMのCPU hotplug機能をONにして、最大CPU数を8に設定してみます
GUIからは設定できないので、コマンドライン(ターミナル.appとか)から。

HostOS:$ VBoxManage modifyvm  --cpuhotplug on
HostOS:$ VBoxManage modifyvm  --cpus 8

には、自分で設定したVMの名前を指定しましょう。

次にVMを起動します。これはGUIからでOK。コマンドラインからやりたければ、次のような感じ(たぶん)。

HostOS:$ VBoxManage startvm 

ゲストOSが起動したら、ゲストから見えるCPU数を見てみましょう。

GuestOS:$ grep processor /proc/cpuinfo
processor	: 0

現在のところ、1個(CPU0のみ)です。

では、CPUを1個追加(hot-add)してみましょう。

HostOS:$ VBoxManage controlvm  plugcpu 

具体的には、CPU3を追加したいなら、次のような感じ。

HostOS:$ VBoxManage controlvm "fed13-64-vbox1" plugcpu 3

増えたかどうか、ゲストで確認しましょう。

GuestOS:$ grep processor /proc/cpuinfo
processor	: 0
processor	: 1

ゲストにはCPU1として認識されるようです。
hot-add成功ですね!
さらにもう1個追加しましょう。

HostOS:$ VBoxManage controlvm "fed13-64-vbox1" plugcpu 1
GuestOS:$ grep processor /proc/cpuinfo
processor	: 0
processor	: 1
processor	: 2

今の状態は、こんな感じでしょうか。

仮想CPU ゲストから見えるCPU
CPU 0 CPU 0
CPU 3 CPU 1
CPU 1 CPU 2

さて、次に削除(hot-remove)を試してみましょう。今度はunplugcpuです。

HostOS:$ VBoxManage controlvm "fed13-64-vbox1" unplugcpu 3
GuestOS:$ grep processor /proc/cpuinfo
processor	: 0
processor	: 2

ゲストからはCPU1がなくなったように見えます。

仮想CPU ゲストから見えるCPU
CPU 0 CPU 0
CPU 1 CPU 2

CPU online/offlineコード

それでは、CPU hotplugを行った時にLinuxの中でどのようなコードが実行されているのか、追いかけてみましょう。

と思ったのですが、時間的に無理でした。。。><
という訳で、この話は後日書きたいと思います。