KVM用仮想マシンをVagrantで手軽に作る
さまざまなOS環境を仮想マシン上に簡単に作成できるVagrantが近年注目を集めている。今回はこのVagrantを使って、KVM上で動作する仮想マシンの作成や実行を可能にする「vagrant-libvirt」および「vagrant-kvm」を紹介する。
目次
Linuxサーバー上ではVagrantを使いにくい?
近年では仮想マシンを使ってソフトウェアやWebサイトの開発およびテストを行うことが増えている。最近のPCは仮想マシンを稼動させるのに十分なリソースを備えており、1台のサーバー上で複数の仮想マシンを稼動させたり、開発者のPC上で仮想マシンを稼動させることで、開発者ごとの開発/テスト環境を簡単に用意できるようになっている。
とはいえ、仮想マシンを使った場合でも、開発/テスト環境の構築はやはり手間がかかることが多い。OSや各種ソフトウェアのインストールや設定といった作業は仮想マシンごとに必要となり、また開発者ごとのテスト環境と実運用環境をそろえる必要もある。そこで近年ではChefやPuppetに代表される設定自動化ツールを使用したり、Vagrantのような仮想環境構築ツールを利用してこの作業を効率化する動きが盛んである。
Vagrantは簡単な設定ファイルを用意するだけで、仮想マシンの作成やOSインストール済み仮想ディスクイメージのダウンロード、ソフトウェアのインストール/設定といった作業を自動化できるツールだ(図1)。
以前『仮想環境構築ツール「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を選択したほうが便利な場合もある。ケースバイケースで使い分けてほしい。