Skip to main content

Linuxで高性能仮想マシンを作る(KVM+QEMU)

KVM (Kernel-based Virtual Machine)はLinuxのコアによってサポートされている仮想技術であり、ハードウェアベースの制御が可能、Intel VT-xとAMD-Vの仮想技術を利用し高性能の仮想CPUを作成できるという特徴があります。Qemuは仮想マシンCPU以外のシミュレート、メモリとリソース管理、外部との通信、付加ハードウェアの仮想化などを行うソフトです。さらに今回はlibvirtとvirshも利用して複数台マシンの作成や削除などを一元管理できる方法を紹介いたします。

LinuxのバージョンはUbuntu Linux Server 14.04 64bitです。仮想サーバーで複数台の仮想マシンを稼働し、ネットワークでそれぞれの仮想マシンを利用すると想定しています。

環境構築

ソフトウェア

必要なソフトを以下のコマンドでインストールします。

sudo apt-get update
sudo apt-get install qemu-kvm libvirt-bin virtinst

仮想用ネットワーク環境の構築

libvirt-binをインストールすると自動的にvirbr0の仮想ネットワークインターフェースを作成しますが、私の場合仮想マシンをローカルのネットワークに直接接続させたいため、Linuxサーバーにブリッジネットワークインターフェースを作成しています。以下のinterfacesファイルを編集します。

sudo nano /etc/network/interfaces

デフォルトでp3p1というEthernetのインターフェースがありますが、ブリッジネットワークを設定するためコメントアウトします。このホストサーバーに常に静的なIPアドレスを持たせるため、以下の設定を行います。

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
#auto p3p1
#iface p3p1 inet dhcp

auto br0
iface br0 inet static
  address 192.168.2.195
  netmask 255.255.255.0
  gateway 192.168.2.1
  dns-nameservers 10.2.0.2 10.2.0.1
  broadcast 192.168.2.255
  bridge_stp off
  bridge_ports p3p1
  bridge_maxwait 0

この設定を適用するためにはネットワークサービスの再起動が必要です。

sudo /etc/init.d/networking restat

一部環境でこのコマンドが利用できない場合、Linxuを再起動してください。

ゲストOSのインストール元を用意

ゲストOSのインストールISOを用意する必要がありますので、sftpや他の方法でISOファイルをアップロードします。Ubuntu Serverをインストールした際に、サービスOpenSSHを選択するとインストーラがSSHサーバーの構築を行います。OpenSSHをインストールしていない場合、以下のコマンドでのインストールもできます。

sudo apt-get install openssh-server

FileZillaというFTPクライアントはsftpに対応していますので、sftpでのアップロードが簡単にできます。sftpのログインアカウントはLinuxのログインアカウントと同じです。

VNCクライアントを用意

ネットワークで仮想マシンを利用するには、VNCクライアントからリモート接続してゲストOSのインストールを行います。このためVNCクライアントを用意する必要がありますので、ネコ技術では「vncviewer」という無料ソフトを利用しています。このURLの一番下にダウンロードリンクがあります:

公式サイト: http://tigervnc.org/

vncviewer実行ファイル: http://tigervnc.bphinz.com/nightly/

ファイル名: vncviewer64.exe または vncviewer.exe

仮想マシンのインストール

仮想マシンの作成

ゲストOSの作成にはvirt-installというコマンドを利用します。このコマンドは仮想マシン作成の面倒な初期処理をやってくれますので仮想マシンの作成が楽になります。

sudo virt-install --name VPC1 --ram 2048 --vcpus 2 --os-type 'windows' --disk path=/var/vhd/Guest1.disk,size=40,bus=sata --network bridge=br0 --graphics vnc,listen=0.0.0.0,port=5911 --controller=sata --cdrom file.iso

コマンドにある各パラメータの意味は:

  • name 仮想マシンの管理用名前を指定します
  • ram 仮想マシンのメモリ領域を指定します
  • vcpus 仮想CPU数を指定します(デフォルトでは1)
  • os-type ゲストOSのタイプです
  • disk ゲストOSの保存用ディスクを指定します。pathで指定したファイルが存在しなければ、自動的に作成してくれます。sizeはディスクを新規作成する際の初期化サイズです。busはディスクの通信タイプです。
  • network ゲストOSを利用するネットワークを指定します。bridge=br0は上記で設定したブリッジネットワークインターフェースです。
  • graphics VNC(仮想ネットワークコンピュータ)の接続先情報を設定します。listenは目標IPアドレス、portはポート番号です。VNCクライアントからリモートデスクトップ接続の場合、このアドレスは接続先となります。
  • controller ハードディスクコントローラーのタイプです
  • cdrom ゲストOSのインストールISOのファイルです

コマンドを実行すると以下の内容が出力されます。

Starting install...
Creating storage file VPC1.disk | 40 GB 00:00
Creating domain... | 0 B 00:00
WARNING Unable to connect to graphical console: virt-viewer not installed. Please install the 'virt-viewer' package.
Domain installation still in progress. Waiting for installation to complete.

Server版Ubuntuはxwindowをインストールしていないため「virt-viewerがインストールされていない」という警告が表示される場合があります。無視してもかまいません。

ゲストOSのインストール

今回ネコ技術がインストールしたのは最新のWindows 10のTechnical Previewです。VNCクライアントを起動し、接続サーバーのアドレスを入力します。接続先アドレスのフォーマットは「ipアドレス:port番号」となります。ここのipアドレスはUbuntuサーバーの外部IPアドレスです(上記で設定したブリッジネットワークインターフェースのIPアドレス)

192.168.2.195:5911

接続が成功した場合Windowsのインストール画面が表示されます。

windows_install_start

これで一般的な実機マシンと同じようにWindowsのインストールができます。

Windowsインストールの際に、仮想マシンが複数回再起動されます。再起動の場合VNCクライアントの受信が遮断されますので、再接続が必要です。また、先ほど実行したvirt-installコマンドはゲストOSのインストールが完了するまで、ステータスを監視して、インストールが完了したら自動的に終了します。

作成した仮想マシンの照会

virt-installで作成した仮想マシンは、virshというプログラムで一元管理できます。virsh listを実行すると現在稼働中の仮想マシンリストが表示されます。

jing@ktvs:~$ virsh list
 Id  Name             State
----------------------------------------------------
 1   VPC1             running

このコマンドはデフォルトでは稼働中の仮想マシンのみを表示しますが、virsh list --allを実行すると全ての登録中のマシンを表示できます。

シャットダウン

シャットダウンはゲストOS内部で一般的な実機マシンと同じくシャットダウンボタンを押すとシャットダウンができますが、virshコマンドによって外部からのシャットダウンもできます。

virsh shutdown VPC1

このコマンドは実機マシンの電源ボタンを直接押すのと同じ効果をシミュレートしています。

ちなみにWindowsでリモート接続を利用する場合、シャットダウンボタンが表示されない場合があります。この場合Windowsのコマンド shutdown /s /t 0 を実行するとすぐにシャットダウンができます。

起動

virsh startコマンドを実行し、起動したい仮想マシンの管理用名前を渡すと起動できます。

virsh start VPC1

強制シャットダウン

仮想マシンを強制的にシャットダウンをしたい場合、以下のコマンドを実行します。

virsh destroy VPC1

削除

virsh listで表示する仮想マシンのリストから、指定するマシンを削除する場合、undefineコマンドを利用します。

virsh undefine VPC1

仮想マシンの設定を変更

virshによって管理中の仮想マシンは、それぞれ自分のXMLファイルを生成しています。このXMLファイルにある設定を変更すると、仮想マシンの設定が変えられます。virsh editのコマンドを利用すると、XMLファイルを直接編集することが可能です。

virsh edit VPC1

デフォルトでvirsh editはvmをエディタとして利用していますが、自分の好きなエディタに変更すること可能です。

nano ~/.profile

最後に以下を追加します。

export EDITOR=/usr/bin/nano

次回ログインの後virsh editを実行すると、エディタがnanoに変更されます。

以下はXML内容のイメージです:

<domain type='kvm'>
  <name>Win10TP2</name>
  <uuid>9d100fe2-516c-c2de-b6e9-91627cf55691</uuid>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <os>
   <type arch='x86_64' machine='pc-i440fx-trusty'>hvm</type>
   <boot dev='hd'/>
 </os>
...
</domain>

このXMLを編集し、仮想マシンのCPU数やメモリサイズ、ディスクファイル、CDROM、ネットワーク通信タイプなどが変更できます。

設定をエクスポート(バックアップ)

上記で変更したXMLファイルは、virsh dumpxmlコマンドによって外にエクスポートすることが可能です。このエクスポートは仮想マシンの設定のバックアップや移行などに活用できます。

virsh dumpxml VPC1 > VPC1_backup.xml

エクスポートしたXMLファイルから仮想マシンを作成

virsh listに追加せず、直接xmlファイルから仮想マシンの作成と起動もできます。

virsh create VPC1_backup.xml

但し名前とマシンIDが他のマシンと一致すると同時に起動できないため、仮想マシンの名前とIDの変更が必要です。

エクスポートしたXMLファイルをvirsh listに追加

仮想マシンを起動せず、virsh listのリストに定義のみを追加することも可能です。この場合virsh defineコマンドを利用します。

virsh define VPC1_backup.xml

仮想マシンのCPU利用率の照会

virsh vcpuinfoコマンドを利用すると仮想CPU毎の利用率を照会できます。

virsh vcpuinfo VPC1

仮想マシンのディスクフォーマット

qemuで作成する仮想マシンは、多くのディスクフォーマットに対応しています。最もよく使われるフォーマットは以下の通りです。

  • raw デフォルトのファイルフォーマットです。データの加工や圧縮などの処理をせず、ゲストOSが保存したデータをそのままサーバーのファイルに書き込みますので、性能が高いですが、ディスク領域も一番大きいです。
  • qcow,qcow2 qemuのディスクフォーマットです。圧縮、暗号化に対応し、使用領域に合わせてファイルのサイズが徐々に拡張できるという特徴があります。
  • vdi VirtualBoxのディスクフォーマットです。qemuではそのまま使えます。
  • vmdk VMWareの仮想化製品のディスクフォーマットです。qemuでも利用できます。

ディスクファイルの作成

qemu-imgコマンドを利用してディスクファイルの作成が簡単にできます。-fパラメータでディスクを指定できます。また新規作成する際にディスクのサイズを指定する必要があります。

jing@ktvs:~$ qemu-img create -f raw /path/disk1.image 2G
Formatting 'disk1.image', fmt=raw size=2147483648

フォーマットがraw、サイズが2GBのディスクファイルを作成できました。以下はqcow2フォーマットのファイルを作成します。

jing@ktvs:~$ qemu-img create -f qcow2 disk2.qcow2 1G
Formatting 'disk2.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 lazy_refcounts=off

qcow2フォーマットはゲストOSの利用領域に合わせてファイルのサイズを拡張しますので、設定サイズ1Gのdisk2.qcow2が作成された際にわずか197KBのサイズしかありません。

フォーマットの転換

qemu-img convertを利用して指定するディスクファイルを他の対応中のフォーマットに転換することが可能です。例えば上記で作成したqcow2ファイルをrawフォーマットに転換するには以下のコマンドを利用します。

qemu-img convert -f qcow2 -O raw disk2.qcow2 disk2.image

-fは入力フォーマット、-Oは出力フォーマットです。(Oは大文字)

仮想マシンにディスクファイルを追加

直接XMLファイルを編集します。

virsh edit VPC1

diskの部分のXML内容をコピーし、もう一つdiskの記述を追加します。

<disk type='file' device='disk'>
  <driver name='qemu' type='raw'/>
  <source file='/var/vhd/VPC1.disk2'/>
  <target dev='sda' bus='sata'/>
  <address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>

このXMLを修正する際に、仮想マシンをシャットダウンすることを勧めます。

CDROMのisoを変更

コマンドvirsh change-mediaを利用するとcdromのisoを簡単に変更できます。

virsh change-media VPC1 /path/file.iso

以上

Jingwood

北海道の田舎で暮らしているプログラマーです。最近山登りにハマりました。

Leave a Reply

Your email address will not be published. Required fields are marked *