KVM用仮想マシンをVagrantで手軽に作る

main_kvm

さまざまなOS環境を仮想マシン上に簡単に作成できるVagrantが近年注目を集めている。今回はこのVagrantを使って、KVM上で動作する仮想マシンの作成や実行を可能にする「vagrant-libvirt」および「vagrant-kvm」を紹介する。

Linuxサーバー上ではVagrantを使いにくい?

近年では仮想マシンを使ってソフトウェアやWebサイトの開発およびテストを行うことが増えている。最近のPCは仮想マシンを稼動させるのに十分なリソースを備えており、1台のサーバー上で複数の仮想マシンを稼動させたり、開発者のPC上で仮想マシンを稼動させることで、開発者ごとの開発/テスト環境を簡単に用意できるようになっている。

とはいえ、仮想マシンを使った場合でも、開発/テスト環境の構築はやはり手間がかかることが多い。OSや各種ソフトウェアのインストールや設定といった作業は仮想マシンごとに必要となり、また開発者ごとのテスト環境と実運用環境をそろえる必要もある。そこで近年ではChefやPuppetに代表される設定自動化ツールを使用したり、Vagrantのような仮想環境構築ツールを利用してこの作業を効率化する動きが盛んである。

Vagrantは簡単な設定ファイルを用意するだけで、仮想マシンの作成やOSインストール済み仮想ディスクイメージのダウンロード、ソフトウェアのインストール/設定といった作業を自動化できるツールだ(図1)。

図1 VagrantのWebサイト
図1 VagrantのWebサイト

以前『仮想環境構築ツール「Vagrant」で開発環境を仮想マシン上に自動作成する』という記事で解説しているため、その詳細については今回は割愛するが、Linuxユーザーにとって使いにくい点として、標準ではVirtualBoxやVMware、Docker、Hyper-Vといった仮想化ソフトウェアにしか対応していないことがある。さまざまなLinuxディストリビューションに標準で搭載されているXenやKVMといった仮想化ソフトウェアには対応していないため、Vagrantを使うには別途VirtualBoxのインストールや設定が必要となっていた。

今回紹介するvagrant-libvirtは、さまざまな仮想化ソフトウェアに対応した仮想化管理APIである「libvirt」を使って、VagrantにKVMやXenなどの仮想化ソフトウェアサポートを追加するVagrantプラグインだ。これを利用することで、KVMを使った仮想マシンをVagrantで簡単に作成できるようになる。

libvirtはRed Hat Enterprise Linux(RHEL)で仮想化技術を利用するための標準機能となっており、RHELやそのクローンであるCentOSなどでは簡単にインストールが可能だ。もちろん、ほかのLinuxディストリビューションでも利用できる。

以下では、RHEL 7と互換性のあるCentOS 7.0を使ってvagrant-libvirtのインストールおよび利用方法を解説する。もちろん、それ以外のLinuxディストリビューションでもvagrant-libvirtは利用可能だが、その場合libvirt関連の設定方法が異なる場合があるので、それらについては別途ディストリビューションのドキュメントなどを参照してほしい。

libvirtおよびKVM、qemuのインストールと設定

vagrant-libvirtを利用するには、libvirtのインストールおよび設定が別途必要になる。また、使用する仮想化ソフトウェアであるKVMやqemuといった仮想化ソフトウェアも同時にインストールしておこう。

CentOS 7では、yumコマンドでこれらをインストールできる。必要となるのは「qemu-kvm」および「libvirt」パッケージだ。また、vagrant-libvirtのインストール時にlibvirtの開発用ライブラリやコンパイル環境、patchコマンドが必要となるなので、これらについてもインストールしておく。

# yum install qemu-kvm libvirt libvirt-devel gcc patch

インストールが完了したら、続けてlibvirtの管理用デーモンであるlibvirtdの設定を行う。libvirtdでは、デフォルト設定ではrootユーザーのみがlibvirtdにアクセスできるようになっているが、Vagrant経由で仮想マシンを作成する場合は、一般ユーザー権限で操作できるように設定したほうが都合が良い。そのための設定を、libvirtdの設定ファイルである/etc/libvirt/libvirtd.confに追加する。

具体的には、まずコメントアウトされている以下の2つの行に対し、行頭の「#」を外してこれら設定を有効にする。

#unix_sock_group = "libvirtd"
#unix_sock_ro_perms = "0777"

これで、「libvirt」というグループに所属しているユーザーがlibvirtdにアクセスできるようになる。また、同様にコメントアウトされている下記の2行についても有効にする。

#auth_unix_ro = "none"
#auth_unix_rw = "none"

これで、認証無しでのlibvirtdの操作が可能となる。

続いて、libvirtdの操作につかうグループを作成する。ここではグループIDとして900を指定しているが、もしこのIDがほかのグループで使われている場合は適当なほかの数字を指定してほしい。

# groupadd -g 900 libvirtd

次に、vagrant-libvirtを使いたいユーザーをlibvirtdグループに追加する。

# usermod -G libvirtd -a hylom

最後にsystemctlコマンドでlibvirtdを再起動し、設定を反映させる。

# systemctl restart libvirtd

以上でlibvirt関連の設定は完了だ。

vagrant-libvirtのインストール

次に、vagrant-libvirtプラグインのインストールを行う。こちらは、vagrant用プラグインをインストールするvagrant plugin installコマンドで実行できる。

$ vagrant plugin install vagrant-libvirt

vagrant-libvirtに対応するboxファイルを準備する

Vagrantでは、「box」と呼ばれる、あらかじめOSのインストールや各種設定が済んでいる仮想マシンイメージファイルを利用して仮想マシンを作成する。vagrant-libvirtを利用する場合、これに対応するboxファイルが必要となるが、vagrant-libvirtはVagrant本体には含まれていないサードパーティ製プラグインであるため、これに対応するboxファイルは少ない。そのため、VirtualBox向けのboxファイルをvagrant-libvirt向けのboxファイルに変換する「vagrant-mutate」プラグインを利用するのがおすすめだ。

vagrant-mutateは、vagrant-libvirtと同じくvagrant plugin installコマンドでインストールできる。

$ vagrant plugin install vagrant-mutate

vagrant-mutateを利用してvagrant-libvirtに対応するboxファイルを作成するには、まずvagrant box addコマンドを使って、変換元となるboxファイルをダウンロードしておく。たとえば、Chefの開発元であるChef社(旧名Opscode)が提供しているCentOS 6.5がインストールされているboxファイルを利用する場合、次のようになる。ここでは、ダウンロードしたboxファイルを「opscode-centos-6.5」という名前で参照できるよう設定している。

$ vagrant box add opscode-centos-6.5 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box

次に、vagrant mutateコマンドを使ってこのboxファイルをlibvirtを使って実行できるように変換する。

$ vagrant mutate opscode-centos-6.5 --input_provider virtualbox libvirt
Converting opscode-centos-6.5 from virtualbox to libvirt.
    (100.00/100%)
The box opscode-centos-6.5 (libvirt) is now ready to use.

ここでは、「–input_provider」オプションの引数に「virtualbox」を指定することで、virtualbox向けboxからlibvirt向けboxへの変換を行っている。変換の完了後にvagrant box listコマンドを実行すると、「opscode-centos-6.5」という名称でlibvirt用のboxファイルが追加されていることを確認できる。

$ vagrant box list
opscode-centos-6.5 (libvirt, 0)
opscode-centos-6.5 (virtualbox, 0)

以上でboxファイルの準備は完了だ。

vagrant-libvirtを使って仮想マシンを起動する

以上の作業が完了したら、vagrant initコマンドを使ってVagrant用の設定ファイルを作成する。

$ vagrant init opscode-centos-6.5

続いて、vagrant upコマンドで仮想マシンを起動する。このとき、「–provider=libvirt」オプションを付けることで、libvirtをおよびKVMを使って仮想マシンが起動される。

$ vagrant up --provider=libvirt
Bringing machine 'default' up with 'libvirt' provider...
==> default: Creating image (snapshot of base box volume).
==> default: Creating domain with the following settings...
==> default:  -- Name:          vagrant-libvirt_default
==> default:  -- Domain type:   kvm
==> default:  -- Cpus:          1
==> default:  -- Memory:        512M
==> default:  -- Base box:      opscode-centos-6.5
==> default:  -- Storage pool:  default
==> default:  -- Image:         /var/lib/libvirt/images/vagrant-libvirt_default.img
==> default:  -- Volume Cache:  default
==> default:  -- Kernel:
==> default:  -- Initrd:
==> default:  -- Command line :
==> default: Starting domain.
==> default: Waiting for domain to get an IP address...
==> default: Waiting for SSH to become available...
==> default: Starting domain.
==> default: Waiting for domain to get an IP address...
==> default: Waiting for SSH to become available...
==> default: Creating shared folders metadata...
==> default: Installing rsync to the VM...
==> default: Rsyncing folder: /home/hylom/vagrant-libvirt/ => /vagrant
==> default: Configuring and enabling network interfaces...

仮想マシン起動後は、VirtualBoxを使って仮想マシンを起動した場合と同様にvagrant sshコマンドで仮想マシンにログインしたり、vagrant haltコマンドで仮想マシンを停止させる、といった操作が可能だ。

KVMを使うための別の選択肢:vagrant-kvm

VagrantでKVMを利用するための選択肢には、今回紹介したvagrant-libvirt以外に「vagrant-kvm」もある。こちらもvagrant-libvirtと同様、vagrant plugin installコマンドでインストールできる。

vagrant plugin install vagrant-kvm

vagrant-kvmも内部的にlibvirtを使用しているので、libvirtdの設定も必要となる。必要な設定内容についてはvagrant-libvirtの場合とほぼ同じだ。また、vagrant mutateコマンドによるboxファイルの変換も実行できる。

vagrant mutate opscode-centos-6.5 --input_provider virtualbox kvm

各種設定およびboxファイルの準備ができたら、vagrant initコマンドで設定ファイルであるVagrantfileを生成する。

$ vagrant init opscode-centos-6.5

最後にvagrant upコマンドを実行すると、仮想マシンが起動される。

$ vagrant up --provider=kvm
Bringing machine 'default' up with 'kvm' provider...
==> default: Importing base box 'opscode-centos-6.5'...
==> default: Matching MAC address for NAT networking...
==> default: Preparing network interfaces based on configuration...
WARNING: Nokogiri was built against LibXML version 2.8.0, but has dynamically loaded 2.9.1
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 192.168.123.10:22
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Host unreachable. Retrying...
    default: Warning: Host unreachable. Retrying...
==> default: Machine booted and ready!
==> default: Creating shared folders metadata...
==> default: Installing rsync to the VM...
==> default: Rsyncing folder: /home/hylom/vagrant-kvm/ => /vagrant

ただし筆者が試したところ、CentOS 7.0上で利用する際には以下の設定が必要となった。まず、libvirt-kvmではKVMを使って仮想化を行うqemu-kvmコマンドが/usr/binディレクトリ以下にあることを想定している。そのため、Cent0S 7環境では以下のように実行して/usr/libexec/qemu-kvmのシンボリックリンクを/usr/bin以下に作成する必要がある。

# ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm

また、qemu-kvm実行時のデフォルトのマシンタイプが「pc-1.2」となっているが、CentOS 7.0のqemu-kvmはこれをサポートしていない。そのため、Vagrantfile内に以下の設定を追加し、「pc」というマシンタイプを使用するよう設定する必要がある。

  config.vm.provider "kvm" do |kvm|
    # machie type for KVM
    kvm.machine_type = "pc"
  end

そのほか、仮想マシンのシャットダウン時にroot権限が必要となるという問題も確認されている。root権限がない場合、エラーメッセージは表示されるものの、仮想マシンの停止自体は完了する。

Linux環境のみを考慮するならVirtualBoxよりもKVMを利用するのがおすすめ

前述のとおり、VagrantではKVMを公式にはサポートしていないが、KVMは多くのLinuxディストリビューションで公式パッケージが提供されており、簡単にインストールできる。いっぽう、VirtualBoxはドライバのインストールなどが必要で、またGUIでの設定ツールは高機能だが、CUIでの設定はやや複雑だ。そのため、Linux環境においては仮想マシンとしてKVMを利用したほうが使いやすいだろう。

ただし、VirtualBoxはLinuxだけでなくMac OS XやWindows環境でも利用できるというメリットがある。KVMはLinux以外では利用できないので、複数のプラットフォームでVagrantを利用するという場合は、KVMではなくVirtualBoxを選択したほうが便利な場合もある。ケースバイケースで使い分けてほしい。

おしらせ

banner_vps