Ubuntu Weekly Recipe

第344回uvtoolでKVM/libvirt向け仮想マシンをお手軽に構築する

Ubuntu 14.04 LTSで進化したuvtoolは、Ubuntuにおける新しいKVM向け仮想マシン構築ツールです。

適切なイメージをこの手に

Ubuntuを使ううえで最初のハードルとなるのが、⁠インストールイメージのダウンロード」です。どこから、どのイメージを、どうやってダウンロードすれば良いか、初心者はもちろんのことそこそこ詳しい人でも悩むことはあるでしょう。

初心者であればリリースとフレーバーとアーキテクチャあたりが悩むポイントになりますし、詳しい人だとデイリーイメージにするのかどうかや、インストール済みイメージを使うのか、インストーラーはどれを使うのかも選択肢に出てきます。

そのためUbuntuでは数年前から、イメージのダウンロードスクリプトをいろいろ用意してきました。たとえば第317回で坂本さんが紹介したTestDriveはUbuntu開発者向け開発版デイリービルドのインストールイメージのダウンローダーとも言えます。第329回で使った、lxc-createのubuntu-cloudテンプレートは「--flush-cache」オプションを付ければ、毎回cloud-images.ubuntu.comから最新リリースビルドのクラウドイメージをダウンロードして使うようになっています[1]⁠。

そんな中、おもにKVM/libvirt向けのイメージダウンローダー兼ラッパースクリプトとして導入されたのがuvtoolです[2]⁠。このツールを使えば、cloud-images.ubuntu.comから最新のインストール済みqcow2イメージをダウンロードできるうえに、そのイメージを使って仮想マシンもコマンド1つで構築できます。Ubuntu 13.10のリリース直前に追加されたこのツールはUbuntu 14.04 LTSでようやくそれらしく使えるようになってきました[3]⁠。

手始めにuvtoolを

公式リポジトリにすでにパッケージが存在するため、Ubuntu 14.04 LTS以降ならインストールはとてもかんたんです。

$ sudo apt install uvtool

これだけ。uvtoolに加えてQEMUやsimplestreamsといったパッケージも一緒にインストールされます[4]⁠。ちなみにaptに「--no-install-recommends」オプションを追加している場合は、uvtool-libvirtなどがインストールされません。現時点ではほぼ必須なので明示的にインストールしましょう。

インストールするとlibvirtグループが追加され、sudoグループのユーザーがlibvirtグループに追加されます。今後の作業を管理者権限なしに実行するにはlibvirtグループに入っておく必要があるため、一度ログインしなおしてください。

uvt-simplestreams-libvirtでイメージのダウンロード

イメージのダウンロードにはuvt-simplestreams-libvirtのsyncサブコマンドを使用します。

$ uvt-simplestreams-libvirt sync release=trusty arch=amd64

releaseやarchはそれぞれ必要なリリース名やアーキテクチャ名です。どちらも省いた場合は、ホストのアーキテクチャと同じすべてのリリースのイメージをダウンロードしますので、ダウンロード完了まで時間がかかるでしょう。

ちなみにリリースイメージではなくテスト前のデイリーイメージを利用したい場合は、次のように「--source」オプションを追加します[5]⁠。

$ uvt-simplestreams-libvirt sync \
    --source http://cloud-images.ubuntu.com/daily \
    release=trusty arch=amd64

ダウンロードが完了したイメージはqueryサブコマンドで確認できます。

$ uvt-simplestreams-libvirt query
release=trusty arch=amd64 label=release (20140927)

このファイルの実体は/var/lib/uvtool/libvirt/images/にあり、/var/lib/uvtool/libvirt/metadata/にメタデータが存在しますので、一度覗いておくと良いでしょう。ちなみにダウンロードされたイメージはQCOW2フォーマットですので、必要ならqemu-imgコマンドで他のフォーマットに変更して利用することも可能です。

uvt-kvmで仮想マシンの構築

ダウンロードしたイメージをKVMで使えるようにセットアップするのがuvt-kvmコマンドです。さっそく仮想マシンを1つ作ってみましょう。なお、SSHの鍵を作成していない場合は、あらかじめ「ssh-keygen」で鍵を作成しておいてください。

$ uvt-kvm create hana release=trusty

ここで「hana」と指定しているところが仮想マシンの名前になります[6]⁠。virshなどではドメインと呼ばれるものです。release以降はフィルタールールで、uvt-simplestreams-libvirtでダウンロードしたイメージの中からルールにマッチするイメージを使用して仮想マシンを作成します。ちなみにreleaseを省略すると、最新の「LTSリリース」を利用します。

createサブコマンドは/usr/share/uvtool/libvirt/template.xmlを使って仮想マシンを作成します。このとき、いくつかのオプションを指定可能です。たとえば--memory、--disk、--cpuは仮想マシンのメモリ、ディスク容量、CPUコア数を設定します。初期値はそれぞれ512MiB、8GiB、1コアです。

クラウドイメージは最初からCloudInitがインストールされていますので、EC2などと同様に--user-dataオプションを渡せば構築時に追加の設定を行うことが可能です。さらに--packagesなど、userdataの一部の設定を上書きするオプションも存在します。

何も指定しない場合、仮想マシンの初期ユーザー名は「ubuntu」です。また、実行ユーザーの公開鍵(~/.ssh/id_rsa.pub)がauthorized_keysにコピーされるため、最初からsshログインできるようになっています。それに対して、パスワードは設定されないためパスワードログインはできません。VTログインなどを行う必要があるのなら--passwordオプションでパスワードを設定はできますが、--user-dataを使うほうが安全でしょう。なお--passwordは--user-dataオプションとは同時には使えません。

構築した仮想マシンは「uvt-kvm destroy」で削除できます。

他のオプションも含めて詳しいことはuvt-kvmのmanページに掲載されています。

uvt-kvmで仮想マシンの状態確認

作成した仮想マシンのリストは「uvt-kvm list」で確認できます。

$ uvt-kvm list
hana
naru
yaya
tami
machi

また起動中の仮想マシンへはsshサブコマンドでもログインできます。

$ uvt-kvm ssh hana --insecure

ここで「--insecure」オプションを付けているのは、このアクセスが自動的に以下のオプションを設定していることを明確にするためです。

UserKnownHostsFile=/dev/null
StrictHostKeyChecking=no
CheckHostIP=no

今のところ「--insecure」を付けない場合は単純にエラー終了するようになっています。将来的に「--insecure」オプションを付けないときは上記オプションを外してアクセスできるようにするかもしれません。sshサブコマンドの末尾には、通常のsshと同様のオプションを指定できます。

ところでKVMで作成した仮想マシンにsshアクセスできるようになるには、仮想マシンの作成が完了したうえで起動し、IPアドレスを割り当て、sshサーバーが起動していなければなりません。waitサブコマンドはその一通りの処理が完了するまで待つコマンドです。

$ uvt-kvm wait hana --insecure

と言ってもやっていることはlibvirtに問い合わせてIPアドレスが割り当てられているかどうかを確認し、割り当てられたらsshコマンドでログインし、/usr/share/uvtool/libvirt/remote-wait.shコマンドを実行して、runlevelコマンドが2を返し、/var/lib/cloud/instance/boot-finishedファイルが作成されるのを待つだけです。⁠--remote-wait-script」オプションを使えば、remote-wait.sh以外の任意のスクリプトも実行できますので、環境に合わせてカスタマイズするのも良いでしょう。

ちなみに割り当てられたIPアドレスを表示するだけであれば、⁠uvt-kvm ip hana」でも可能です。

他のツールとも一緒に

uvtoolはlibvirtを使っているため、libvirtと連携しているツールなら一緒に使うことが可能です。というよりも仮想マシンの作成と破棄以外の管理は他のツールを使わないとできません。

virshでも操作可能

libvirtに対応したツールといえばlibvirtdと一緒に付いてくるvirshでしょう。

$ virsh list --all
 Id    名前                         状態
----------------------------------------------------
 1     hana                           実行中
 -     machi                          シャットオフ
 2     naru                           実行中
 4     tami                           実行中
 3     yaya                           実行中

$ virsh start machi
ドメイン machi が起動されました

$ virsh shutdown machi
ドメイン machi はシャットダウン中です

$ virsh dominfo naru
Id:             2
名前:         naru
UUID:           b441ceaa-38e4-431d-8289-404b2df7f8b4
OS タイプ:   hvm
状態:         実行中
CPU:            1
CPU 時間:     17.4s
最大メモリー: 524288 KiB
使用メモリー: 524288 KiB
永続:         はい (yes)
自動起動:   無効にする
管理済み保存: いいえ (no)
セキュリティモデル: apparmor
セキュリティ DOI: 0
セキュリティラベル: libvirt-b441ceaa-38e4-431d-8289-404b2df7f8b4 (enforcing)

GNOME Boxesで管理する

GNOME BoxesはGNOMEで開発している仮想マシンを管理するGUIツールの1つです。libvirtのGUIツールと言えばvirt-managerが有名ですが、Boxesはよりデスクトップのエンドユーザー向けに使いやすさとシンプルさを重視した作りになっています。

$ sudo apt install gnome-boxes

Ubuntu 14.04 LTSでインストールされるBoxesは3.8とだいぶ古いバージョンであることに注意してください。第320回であわしろいくやさんが説明しているように、gnome3-staging PPAを使えば、3.12のBoxesをインストールすることも可能です。

VirtualBoxのようにISOインストールイメージから仮想マシンを作ることもできますが、今回は既に作成済みの仮想マシンに接続してみましょう。

図1 Boxesで検索、起動し「新規」ボタンをクリックする
図1 Boxesで検索、起動し「新規」ボタンをクリックする
図2 ⁠URLを入力」から「qemu:///system」を入力
図2 「URLを入力」から「qemu:///system」を入力
図3 最後に「作成」ボタンを押せば設定完了
図3 最後に「作成」ボタンを押せば設定完了
図4 一覧画面にuvt-kvmで作成した仮想マシンが表示される
図4 一覧画面にuvt-kvmで作成した仮想マシンが表示される
図5 プロパティでも基本的な設定は可能
図5 プロパティでも基本的な設定は可能

仮想マシンを右クリックするとプロパティの表示や仮想マシンのシャットダウンを行えます。左クリックするとコンソールに接続できます。ここからアクセスしたい場合は、アカウントのパスワードを設定し、ロックを解除しましょう。作成時に設定していない場合は、sshログインして次のように変更できます。

ubuntu@naru:~$ sudo passwd ubuntu
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
ubuntu@naru:~$ sudo passwd -u ubuntu
passwd: password expiry information changed.

ubuntu-desktopパッケージをインストールすればデスクトップとしてログインできます。ただしUnityの3Dアクセラレーションは動作しませんし、描画もたまにおかしくなります。日本語キーボードをつなぐ場合はいくつか設定を行わなくてはいけないので[7]⁠、デスクトップ用途ならVirtualBoxを使ったほうが良いかもしれません。

図6 Unityでもそれなりに動く
図6 Unityでもそれなりに動く

おすすめ記事

記事・ニュース一覧