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のインストールができます。
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
以上