nested kvmとvagrant-libvirt

概要

将来的に(個人的に)最近はやりの仮想マシンモニタ(VMM)を作成したいと思い始めました.そこで,開発環境として,ubuntu14.04 上に qemu-kvm をインストールし,仮想化支援機構(intel VT-x, EPT..)などが有効な仮想マシンを作成します.また,作成した仮想マシンを vagrant から操作できるようにします. これによって,vagrant を用いてトライアンドエラーをしながら,仮想マシン上で VMM の開発ができるようになります.
はじめ,VirtualBox+vagrant で開発を進めようと思いましたが,VirtualBox は,作成した仮想マシン上で仮想化支援機構(Nested VM)を有効にできないことがわかりました. VMware では Nested VM を有効にできるのですが,VMware に対応した Vagrant プラグインが有料であったので断念しました.

qemu-kvm と libvirt をインストール

  1. パッケージのインストール

    $ sudo apt install qemu-kvm libvirt0 libvirt-bin virt-manager bridge-utils

  2. libvirt-bin を systemd に登録

    $ sudo systemctl enable libvirt-bin

  3. libvirtd グループに所属していると sudo なしで virt-manager や virsh を実行できる

    $ sudo gpasswd libvirtd -a ユーザ名

kvm 上のゲスト OS の VT-X を有効にする

  1. あらたに conf ファイルを作成する

    $ sudo vim /etc/modprobe.d/kvm-nested.conf

    # 新規作成
    options kvm_intel nested=1
    
  2. モジュールのアンロード

    $ sudo modprobe -r kvm_intel

  3. モジュールのロード再ロード

    $ sudo modprobe kvm_intel

  4. 確認

    $ sudo cat /sys/module/kvm_intel/parameters/nested
    Y     # 有効になった
    

vagrant-libvirt のインストール

vagrant のダウンロード

ここでは,VirtualBox 用の Box をダウンロードし,それを libvirt 用に変換して利用します.

  1. vagrat-libvirt と vagrant-mutate のインストール

    $ vagrant plugin install vagrant-libvirt vagrant-mutate

  2. VritualBox の Box をダウンロード

    $ vagrant box add ubuntu/trusty64

  3. virtualbox の box を libvirt に変換する

    $ vagrant mutate ubuntu/trusty64 --input-provider virtualbox libvirt

  4. 確認

    $ vagrant box list
    
    ubuntu/trusty64 (libvirt)
    ubuntu/trusty64 (virtualbox)
    
  5. 初期化と起動

    $ vagrant init ubuntu/trusty64

  6. 仮想化支援機構を有効にする Vagrantfile 以下を追加する.

    config.vm.provider :libvirt do |v|
      # Customize the amount of memory on the VM:
      v.memory = "1024"
    
      # Virtualization
      v.nested = "true"
      v.cpu_mode = "host-passthrough"
    end
    
  7. 起動

    vagrant up --provider=libvirt

確認

1
2
3
$ vagrant ssh
$ cat /proc/cpuinfo | grep vmx
// なにか表示されればintel VT-xが有効になっている

表示されない場合(intel VT-x が有効になっていない)

ホスト OS に戻り,以下のコマンドを実行し,仮想マシンの設定ファイルを編集する.

1
2
3
4
5
$ sudo virsh edit 仮想マシン名
<cpu mode='custom' match='exact'>
<cpu mode='host-passthrough' match='exact'>
に変更

仮想マシン名は,virt-managerコマンドとかで確認できます.

vagrant up 時に以下のエラーが表示される

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ vagrant up --provider=libvirt

A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
Bringing machine 'default' up with 'libvirt' provider...
==> default: Uploading base box image as volume into libvirt storage...
/home/tanaka/.vagrant.d/gems/gems/fog-libvirt-0.3.0/lib/fog/libvirt/requests/compute/create_volume.rb:6:in `create_volume_xml': Call to virStorageVolCreateXML failed: ストレージボリューム 'ubuntu-VAGRANTSLASH-trusty64_vagrant_box_image_20170119.1.0.img' がすでに存在します (Libvirt::Error)

(snip)

プールをリフレッシュすることで解決できました

1
2
3
4
5
6
7
8
$ virsh pool-list

名前               状態     自動起動
-------------------------------------------
default              動作中  はい (yes)

$ sudo virsh pool-refresh default
$ sudo virsh pool-refresh その他