KVM と VirtualBox を共存させる方法 ― アンインストールも再起動も不要なモジュール切り替え術
KVM と VirtualBox は「共存できない」とよく言われます。正確には、KVM のカーネルモジュールがメモリにロードされている間、VirtualBox が起動できなくなるというものです。逆に KVM の方は VirtualBox と並行しても問題なく動作するため、実質的には一方向だけの問題です。しかも解決は非常に簡単です。残念ながら、「どちらかをアンインストールしろ」という酷いチュートリアルを数多く見かけます。また、もう少しまともな解説でも、単に「rmmod しろ」と書いてあるだけで、元に戻す方法まで説明しているものはほとんどありません。
この記事では、何もアンインストールせず、使用のたびに再起動することもなく、KVM と VirtualBox を並べて使う方法を紹介します。競合する相手側を動作させるために、それぞれの機能を無効化・有効化する手順を学びましょう。すべてライブで行い、再起動は一切不要です。それでは始めましょう。
症状 ― VirtualBox が起動しない
VirtualBox を起動すると、次のようなエラーが表示されることがあります。
「VirtualBox can't operate in VMX root mode. Please disable the KVM kernel extension, recompile your kernel and reboot.」(VirtualBox は VMX ルートモードでは動作できません。KVM カーネル拡張を無効にし、カーネルを再コンパイルして再起動してください)
おっと、落ち着いてください。これは非常に技術的で恐ろしく見えるメッセージですが、何かを再コンパイルする必要は一切ありません。修正にかかる時間はわずか5秒で、システムへの破壊もまったくありません。
問題の仕組み
VirtualBox と KVM は同時に動作できないため、VirtualBox を使いたい場合は KVM を無効化する必要があります。問題は「どうやって」無効化するかです。答えは、カーネルモジュールの組み込みと取り外しです。
Linux はカーネルモジュールの動的な挿入・削除をサポートしており、再起動なしでメモリ上のモジュールをロード・アンロードできます。詳細については、Linux コマンド関連の記事や Crash Book を参照してください。
ここでは insmod コマンドと rmmod コマンドを使用します。
モジュールの取り外し
まずカーネル空間を確認しましょう。lsmod コマンドを実行して、メモリにロードされているモジュールの一覧を見てみます。
ご覧のとおり、VirtualBox は vboxdrv と vboxnetflt ドライバを使用し、KVM は kvm と kvm_intel ドライバを使用しています。なお、kvm_intel は Intel アーキテクチャ専用で、AMD プラットフォームの場合は kvm_amd になります。ここでは KVM のモジュールをアンロードします。
/sbin/rmmod kvm_intel
/sbin/rmmod kvm
大きな疑問:これで KVM が使えなくなってしまった。どうやって元に戻せばいいのか?
鋭い指摘です!それでは復旧方法を見ていきましょう。
モジュールの挿入
モジュールを取り外したのと同じ要領で、再度挿入することができます。ディスク上のモジュールの場所を特定してから挿入してください。依存関係がある場合に便利な modprobe コマンドを使うこともできます。
まずモジュールを探しましょう(コマンドには sudo を想定していますが、root として実行しても構いません)。
updatedb
locate kvm
検索結果は大量に出るので、kvm.ko と kvm-intel.ko に絞り込むとよいでしょう。
次に、実行中のカーネルに一致するモジュールを挿入します。カーネルバージョンは uname -r で確認できます。
/sbin/insmod /lib/modules/`uname -r`/kernel/arch/x86/kvm/kvm.ko
/sbin/insmod /lib/modules/`uname -r`/kernel/arch/x86/kvm/kvm-intel.ko
実際の操作画面の例を紹介します。まず lsmod で kvm モジュールがロードされていないことを確認し、次に kvm モジュールをロードしてから、再度 lsmod を実行します。
なお、スクリーンショット内のコマンドは上記のコードボックスとは少し異なります。/sbin が PATH に含まれている前提で、簡潔さのために短縮形の insmod コマンドを使っています。一方で、モジュールのフルパスも併用して、実際のパスの形式をお見せしました。この手順をスクリプト化する(ぜひそうすべきです)場合は、フルパスが必須となり、柔軟性を高めるためにバッククォートによるコマンド置換の利用をおすすめします。
スクリプト化
次はこの作業を自動化しましょう。必要なのは2つのスクリプトです。1つは KVM モジュールをアンロードするもの、もう1つはロードするものです。より厳密に運用したいなら、KVM 使用中は VirtualBox のサービスを停止し、KVM の使用後に開始するようにしてもよいでしょう。以下は VirtualBox ドライバを操作する例です。
したがって、VirtualBox を有効化して KVM を無効化するサンプルスクリプトは次のようになります。
#!/bin/bash
/sbin/rmmod kvm_intel
/sbin/rmmod kvm
/etc/init.d/vboxdrv start
逆に、KVM をロードして VirtualBox を停止するスクリプトはこちらです。
#!/bin/bash
/etc/init.d/vboxdrv stop
/sbin/insmod /lib/modules/`uname -r`/kernel/arch/x86/kvm/kvm.ko
/sbin/insmod /lib/modules/`uname -r`/kernel/arch/x86/kvm/kvm-intel.ko
AMD マシンの場合は、kvm-intel.ko を kvm-amd.ko に置き換えてください。また、すでに起動しているサービスを再度起動しようとしないよう、健全性チェック(状態確認処理)を追加する必要がある点にも注意してください。ここでは省略しましたので、宿題として考えてみてください。
同様に、CPU アーキテクチャにも注意が必要です。多くの人にとっては x86(x86_64 含む)で問題ありませんが、SPARC や ARM、Itanium など別のアーキテクチャを使用している場合は、パスを適宜変更してください。
あとは、これらのスクリプトへのデスクトップショートカットを作成すれば完成です。特定のカーネルバージョンではなく uname を使うことで、カーネルをアップグレードした後もスクリプトがそのまま動作します。
まとめ
ご覧のとおり、現実は思っていたほど厳しいものではありません。このチュートリアルでは、どちらかをアンインストールしたり、使用のたびに再起動したりすることなく、VirtualBox と KVM を協調させるシンプルな方法を紹介しました。Linux のアーキテクチャはモジュールのライブ挿入を可能にしているため、本当に再起動が必要になるのはカーネルのアップグレード時だけです。
このチュートリアルから学べることは複数あります。快適さと実用性を両立させる賢い方法、カーネルモジュールの挿入・削除の手順、作業のスクリプト化の手法、そして KVM と VirtualBox を並べて使うという目標の達成方法です。
この記事がお役に立てば幸いです。
それでは、また。
-
VirtualBoxでディスクをクローンする方法【VBoxManage活用チュートリアル】
仮想化を業務でも趣味でも利用している方なら、VirtualBoxという強力かつ多用途な無料ソリューションを目にしたことがあるかもしれません。VirtualBoxは、デスクトップユーザーに対して、あらゆる形でOSを展開できる大きな柔軟性を提供してくれます。さらに、単なる趣味として仮想化を楽しんでいるだけでなく、仮想化を通じて新しいOSを学ぼうとする熱心なソフトウェア愛好家の方であれば、次のような場面に必ず直面することでしょう。それは「大量の仮想マシンを展開する必要がある」というシナリオです。一台ずつインストール作業を行う時間的な余裕はないはずです。実際、大規模に環境を展開する際に手動で一つずつマ
-
VirtualBox 3.0.0 徹底レビュー!DirectX対応とネットワーク機能強化がすごい
私のお気に入りのデスクトップ仮想化ソフトウェアといえば、VirtualBoxとVMware Serverです。どちらも愛用しており、それぞれに魅力があります。全体的にはよく似た製品ですが、片方にしかない独自の機能を持っており、互いをうまく補完し合う関係にあると言えます。 つい先日、VirtualBox 3.0.0が大きな話題とともにリリースされました。これは、旧バージョンやVMware Serverと比べてどこまで進化したのかを確かめる絶好の機会です。深呼吸して、私と一緒にツアーに出かけましょう。長めの前置きで少々お付き合いいただきますが、きっと価値のある内容のはずです。 VirtualBo