Vagrant + KVM/Libvirt: Linuxで仮想マシンの速度を2倍に高速化する方法

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

LinuxにおけるVirtualBoxという苦悩

Linuxで開発しているのに、依然としてVirtualBoxを使い続けているなら、遅かれ早かれトラブルに見舞われるでしょう。よくあるシナリオ:朝、PCを起動するとシステムが自動的に新しいKernelをアップデートしており、vagrant upを実行するとエラーで動かなくなります。そして、絶望の中でsudo /sbin/vboxconfigを必死に実行する羽目になります。

VirtualBoxはType-2ハイパーバイザであり、OS上のアプリケーションとして動作するため、非常に多くのリソースを消費します。RAM 8GBや16GBのノートPCでは、仮想マシンを2台起動するだけで、CPUファンがドライヤーのように唸り始めます。私自身、コードを書くことよりも、VirtualBoxの細かなエラー修正に午前中を丸々費やしたことがありました。その時、Linuxにはより「ネイティブ」なソリューションが必要だと気づいたのです。

なぜKVM/Libvirtが最良の選択なのか?

KVM (Kernel-based Virtual Machine) は追加でインストールするアプリではなく、Linuxカーネル自体に組み込まれているコンポーネントです。KVMを使用すると、仮想マシンはハードウェアと直接通信します。これにより、実機に近いパフォーマンス (near-native performance) が得られます。

サーバー管理にProxmoxを使ったことがあるなら、それもKVMベースで動作していることがわかるでしょう。VirtualBoxからKVMへの移行は、驚くべき数値をもたらします:

  • 速度:Ubuntu仮想マシンの起動時間が45秒から15秒未満に短縮されます。
  • CPU:コードのコンパイルやDockerの入れ子構造 (Nested Virtualization) などの重いタスク処理時の遅延が20〜30%減少します。
  • 安定性:OSのKernelアップデート時にクラッシュする心配がなくなります。

VagrantとLibvirtを統合する手順

デフォルトでは、VagrantはVirtualBoxを優先します。KVMに切り替えるには、vagrant-libvirtプラグインをインストールする必要があります。以下は、私が実際に行って成功したクリーンアップと移行のプロセスです。

ステップ1:KVMと管理ツールのインストール

まず、仮想化サポートパッケージをインストールします。UbuntuまたはDebianでは、以下のコマンドを使用します:

sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager libvirt-dev -y

次に、毎回sudoを入力しなくて済むように、現在のユーザーに権限を付与します:

sudo adduser $USER libvirt
sudo adduser $USER kvm

ヒント:これらの権限変更を即座に反映させるために、一度ログアウトして再ログインすることをお勧めします。

ステップ2:vagrant-libvirtプラグインのインストール

このプラグインは、VagrantとKVMの架け橋となります。お使いの環境にlibvirt-devが不足していると、インストールに失敗する場合があるため注意してください。

vagrant plugin install vagrant-libvirt

インストール完了後、vagrant plugin listを実行して、正しくインストールされているか確認してください。

ステップ3:Libvirt対応のBoxを選択する

どのBoxでもKVMで動作すると勘違いされがちですが、実際にはVagrant Cloudでlibvirtラベルが付いているBoxを選択する必要があります。generic/ubuntu2204debian/12などの一般的なシリーズは、この形式を非常によくサポートしています。

最高のパフォーマンスを引き出すためのVagrantfileの最適化

Vagrantで常にLibvirtを使用するように強制するには、.bashrcファイルにexport VAGRANT_DEFAULT_PROVIDER=libvirtを追加します。以下は、CPUとネットワークを最適化するために私がよく使用する設定例です:

Vagrant.configure("2") do |config|
  config.vm.box = "generic/ubuntu2204"

  config.vm.provider :libvirt do |libvirt|
    # host-passthroughモードにより、仮想マシンがホストマシンのCPU命令セットを完全に認識できるようになります
    libvirt.cpu_mode = "host-passthrough"
    libvirt.memory = 2048
    libvirt.cpus = 2
    
    # ディスクの読み書き速度を向上させるためにvirtioを使用する
    libvirt.nic_model_type = "virtio"
  end

  config.vm.synced_folder ".", "/var/www/html", type: "nfs"
end

共有フォルダの問題を解決する

VirtualBoxは独自のドライバを使用してフォルダを共有しますが、KVMはより柔軟です。私はNFSの使用を推奨します。ホストマシンでコードを修正し、仮想マシンで実行した際のレスポンスはほぼ瞬時であり、9pやRsyncのような遅延はありません。

Virt-Managerでよりプロフェッショナルな仮想マシン管理を

最も興味深い点は、GUIツールであるVirt-Managerを使用して、Vagrantが作成した仮想マシンを監視できることです。ここでは、CPU、RAM、ネットワークトラフィックのリアルタイムグラフを確認できます。仮想マシンがフリーズした場合は、数回のクリックでハードウェアに深く介入したり、強制的に再起動したりできます。

Libvirtを通じてシステムを制御している感覚は、VirtualBoxの真っ暗なコンソールウィンドウを眺めているよりもずっと快適です。個人のPC上であっても、真のSysadmin(システム管理者)のような風格を与えてくれます。

結論

Windowsを使用しているなら、VirtualBoxでも問題ありません。しかし、Linux上ではKVM/Libvirtこそが真のスタンダードです。わずか15分の設定で、毎週の仮想マシンの起動待ちやドライバエラーの修正に費やす時間を何時間も節約できます。今すぐVirtualBoxをアンインストールして、このスムーズな体験を手に入れましょう!

Share: