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 をインストール
パッケージのインストール
$ sudo apt install qemu-kvm libvirt0 libvirt-bin virt-manager bridge-utils
libvirt-bin を systemd に登録
$ sudo systemctl enable libvirt-bin
libvirtd グループに所属していると sudo なしで virt-manager や virsh を実行できる
$ sudo gpasswd libvirtd -a ユーザ名
kvm 上のゲスト OS の VT-X を有効にする
あらたに conf ファイルを作成する
$ sudo vim /etc/modprobe.d/kvm-nested.conf
# 新規作成 options kvm_intel nested=1
モジュールのアンロード
$ sudo modprobe -r kvm_intel
モジュールのロード再ロード
$ sudo modprobe kvm_intel
確認
$ sudo cat /sys/module/kvm_intel/parameters/nested Y # 有効になった
vagrant-libvirt のインストール
ここでは,VirtualBox 用の Box をダウンロードし,それを libvirt 用に変換して利用します.
vagrat-libvirt と vagrant-mutate のインストール
$ vagrant plugin install vagrant-libvirt vagrant-mutate
VritualBox の Box をダウンロード
$ vagrant box add ubuntu/trusty64
virtualbox の box を libvirt に変換する
$ vagrant mutate ubuntu/trusty64 --input-provider virtualbox libvirt
確認
$ vagrant box list ubuntu/trusty64 (libvirt) ubuntu/trusty64 (virtualbox)
初期化と起動
$ vagrant init ubuntu/trusty64
仮想化支援機構を有効にする 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
起動
vagrant up --provider=libvirt
確認
$ vagrant ssh
$ cat /proc/cpuinfo | grep vmx
// なにか表示されればintel VT-xが有効になっている
表示されない場合(intel VT-x が有効になっていない)
ホスト OS に戻り,以下のコマンドを実行し,仮想マシンの設定ファイルを編集する.
$ sudo virsh edit 仮想マシン名
<cpu mode='custom' match='exact'>
を
<cpu mode='host-passthrough' match='exact'>
に変更
仮想マシン名は,virt-manager
コマンドとかで確認できます.
vagrant up 時に以下のエラーが表示される
$ 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)
プールをリフレッシュすることで解決できました
$ virsh pool-list
名前 状態 自動起動
-------------------------------------------
default 動作中 はい (yes)
$ sudo virsh pool-refresh default
$ sudo virsh pool-refresh その他