読者です 読者をやめる 読者になる 読者になる

私をペロペロするがよい

lazy_dog のブログです。

Arch Linux で KVM/qemu (環境構築から VM の作成まで)

Arch LinuxKVM/qemu (環境構築から VM の作成まで)

KVM/qemu でハイパーバイザを作ろう!

ということで、本エントリーでは、KVM/qemuLibvirt (virsh) で操作する、という環境構築を説明します。おいら、X は分からんので、Virt-Manager とかは説明できません。ネットワーク回りも極力シンプルにします。

KVM/qemu ってそもそもなんぞや?

これに

  • virsh ... KVM/qemu 環境を操作するシェル。他 ESXi、Xen とかもいけるらしい。仮想環境を管理する共通 API の「Libvirt」を使用している。

らしい。「KVM」と言われたら、とりあえずは「KVM/qemu による仮想環境・ハイパーバイザ」だと思っておkだと思う。

Arch Linux をハイパーバイザーにするメリット

へんなものを入れずに済む!

CentOS に入ってる SELi... とか。その他、必要最低限しか入れずに済むので、かなりこざっぱりする。ちなみに、デメリットはたまにコンフリクトおこすこと。。。KVM/qemu 回りはまだいいけど、正直、Arch LinuxZFS ファイルサーバはやめておいた方がいい。2014 年 7 月現状、パッケージの形式ががんがん変わってるし、しょっちゅう Kernel とコンフリクトをおこして、まともにアップデートができない。安定を求めるなら、CentOS とかの方がいい。

ドライバー回りを悩まずに済む

Linux なんで、蟹さん NIC も使えちゃいます。

KVM/qemu を使うメリット

CUI (ssh) で全て VM 操作が可能

これに限ります。。。

ESXi の方が処理速いのは百も承知だけど、全部 CUIスクリプトとかがんがん組んで使えるのは、とても魅力。ESXi は ssh でログインはできるけど、CUI の一部のコマンドは有償ライセンスが適応されていないと使えない。(VM のシャットダウンとか)

VM の構成ファイル (xml) をテキストで弄っちゃっていい

ネットワーク追加したかったら、テキストベースである xml に行を追加してデバイス加えられる。ちょっとだけ VNC が使いたかったら、ちょろっと書いてを加えてあげればいい。

ホスト側で自由が効く

ESXi と違い、ホスト (ハイパーバイザ) 側は Linux なので、X とかその他諸々起動できる。VM 動かしつつ、ビデオ出力でグラフィカルなログを出したりとか。ソフトウェアルータを追加したりとか。

ホスト側の環境構築

本環境は、

  • Arch Linux x86_64
  • HP Proliant ML110 G7

です。

OS インストール (解説しない)

参考ドキュメント: KVM (日本語) - ArchWiki
https://wiki.archlinux.org/index.php/KVM_%28%E6%97%A5%E6%9C%AC%E8%AA%9E%29

Arch Linux を、まずは適当なサーバに入れる。pacman -Syu してぼけーっと待つ。

Arch Linux Wiki だと、CPU が Virtualization に対応してるか確認、とか諸々書かれているけど、最近の CPU だったら普通対応していると思う。対応していれば、勝手に KVM が使われるようになっている。

[root@palestine ~]# lsmod | grep kvm
kvm_intel             135528  0
kvm                   408583  1 kvm_intel  # デフォルトで勝手にロードされてる

必要パッケージを入れる

qemu libvirt virt-manager ebtables を入れれば OK。物理 eth とブリッジするため netctl が必要だが、普通に Arch Linux をインストールすれば勝手に入ってくるので問題なし。

[root@palestine ~]# pacman -S qemu libvirt
resolving dependencies...
:: There are 3 providers available for libgl:
:: Repository extra
   1) mesa-libgl  2) nvidia-304xx-libgl  3) nvidia-libgl

Enter a number (default=1):
looking for inter-conflicts...

Packages (78): alsa-lib-1.0.28-1  avahi-0.6.31-12  bluez-libs-5.21-1  celt0.5.1-0.5.1.3-3  damageproto-1.2.1-3
               elfutils-0.158-3  fixesproto-5.0-3  flac-1.3.0-3  gnutls-3.3.5-1  inputproto-2.3.1-1  js17-17.0.0-1
               json-c-0.12-2  kbproto-1.0.6-2  libaio-0.3.109-7  libasyncns-0.8-5  libcacard-2.0.0-4  libcap-ng-0.7.4-1
               libogg-1.3.1-2  libpcap-1.5.3-1  libpciaccess-0.13.2-2  libpng-1.6.12-1  libpulse-5.0-1  libsm-1.2.2-2
               libsndfile-1.0.25-3  libtasn1-3.6-1  libvdpau-0.8-1  libvorbis-1.3.4-1  libx11-1.6.2-2  libxau-1.0.8-2
               libxcb-1.10-2  libxdamage-1.1.4-2  libxdmcp-1.1.1-2  libxext-1.3.2-1  libxfixes-5.0.1-1  libxi-1.7.2-1
               libxinerama-1.1.3-2  libxml2-2.9.1-5  libxrandr-1.4.2-2  libxrender-0.9.8-1  libxshmfence-1.1-1  libxtst-1.2.2-1
               libxxf86vm-1.1.3-1  llvm-libs-3.4.2-1  mesa-10.2.2-1  mesa-libgl-10.2.2-1  nettle-2.7.1-1  nspr-4.10.6-1
               nss-3.16.1-1  numactl-2.0.9-2  p11-kit-0.20.2-1  parted-3.1-4  pixman-0.32.6-1  polkit-0.112-2  python2-2.7.8-1
               randrproto-1.4.0-2  recordproto-1.14.2-2  renderproto-0.11.1-3  sdl-1.2.15-6  seabios-1.7.5-2  spice-0.12.5-1
               sqlite-3.8.5-1  usbredir-0.6-4  vde2-2.3.2-6  wayland-1.5.0-1  xcb-proto-1.10-2  xextproto-7.3.0-1
               xf86vidmodeproto-2.3.1-3  xineramaproto-1.2.1-3  xproto-7.0.26-1  yajl-2.1.0-1  libvirt-1.2.6-1  qemu-2.0.0-4

Total Download Size:    16.84 MiB
Total Installed Size:   407.82 MiB

:: Proceed with installation? [Y/n] y

## virt-manager、ebtables は後で入れました。。

VNC/Spice 関連が入るので、mesa などビデオドライバーもインストールされる。

インストール後、libvirtd が起動できて、virsh が適当に動くことを確認する。

[root@palestine ~]# systemctl start libvirtd
[root@palestine ~]#
[root@palestine ~]# virsh
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit

virsh #

libvirtd が起動してないと、virsh がエラー返すから注意な。(ありがち。。)

virsh # list
error: failed to connect to the hypervisor
error: no valid connection
error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory

virsh #

libvirtd は、さっさと systemctl で enable にして、起動時に立ち上がるように設定しておくとよい。

ホスト側ネットワーク設定

ホスト側のネットワークインターフェイスの設定を行う。現状、ethernet デバイスに下記の通りに設定されている。

[root@palestine ~]# cat /etc/netctl/enp2s0_config
Description='enp2s0_config'
Interface='enp2s0'
Connection='ethernet'
IP=static
Address='192.168.0.9/24'
Gateway='192.168.0.1'

これをブリッジに変更する。

[root@palestine netctl]# cat br0_config
Description='br0_config'
Interface='br0'
Connection='bridge'
BindsToInterfaces=(enp2s0)
IP=static
Address='192.168.0.9/24'
Gateway='192.168.0.1'

Connection= を bridge に変更し、BindsToInterfaces= に元のインターフェイス名を記載する。あとは適当にインターフェイス名を変える。変更したら、netctl コマンドで適応する。

[root@palestine netctl]# netctl enable br0_config
ln -s '/etc/systemd/system/netctl@br0_config.service' '/etc/systemd/system/multi-user.target.wants/netctl@br0_config.service'

裏のセグメントもあれば、同様に変更。これで、VM がホスト側と同じネットワークに接続できるようになる。

KVM/qemu 専用 private network 作成

VM 同士の間のみで使用できる仮想ネットワークを作成する。Linux のパッケージのレポジトリVM など、物理のネットワークにトラフィックを出したくないものなどに便利。

(ただ、ブリッジネットワークで物理に繋がる形で、VM 間が通信しても、トラフィックが物理側に影響してるかは不明。多分行ってない気がするが、気分的な問題で作る)

作成は簡単。名前だけ書いた xml ファイルを、Virsh に読み込ませるだけ。

[root@palestine 02_Network_xml]# cat Virt_01.xml
<network>
  <name>Virt_01</name>

</network>

これを Virsh から、

virsh # net-define Virt_01.xml
Network Virt_01 defined from Virt_01.xml

virsh #

すると、

virsh # net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              inactive   yes           yes
 Virt_01              inactive   no            yes

となる。net-start <ネットワーク名> で作成したネットワークを起動できる。作成したネットワークは Autostart (自動で有効化) されるようになる。ついでに default は使わないので消す。

virsh # net-start Virt_01
Network Virt_01 started

virsh # net-undefine default
Network default has been undefined

virsh #
virsh # net-autostart Virt_01
Network Virt_01 marked as autostarted

virsh #

net-start で作成した仮想ネットワークが起動できなかった場合、ebtables がインストールされていないと思われる。pacman でインストールして、libvirtd を再起動すれば OK。

VM を作成する

仮想 HDD を作成する

ストレージプールは作らなかったので、適当な場所に仮想 HDD を作成する。ワンコマンドで OK。

[root@palestine 01_data]# qemu-img create -f raw pal-testVM-01.img 32G
Formatting 'pal-testVM-01.img', fmt=raw size=34359738368

で、ぼこっとファイルが作られている。オプションの raw が、お察しの通り仮想 HDD のフォーマット形式の指定。Red Hat のドキュメントによれば、raw が一番パフォーマンスが出るみたいだ。qcow2 は AES 暗号化や圧縮ができるが、パフォーマンスは落ちる。他は、あんまりな感じ。

9.3. qemu-img の使い方
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Virtualization_Administration_Guide/sect-Virtualization-Tips_and_tricks-Using_qemu_img.html

VM を作成する

virt-install コマンドで VM を作成できる。

注意点: CIFS 越しには iso イメージをマウントできない

iso イメージは適当にどこかに置いておく。CIFS 共有で iso イメージをマウントしようとしても、(バグらしく?) できないので注意。

Bug 1012085 ? Can't attach iso from CIFS filesystem to VM because it can't be chowned
https://bugzilla.redhat.com/show_bug.cgi?id=1012085
Starting install...
ERROR    unable to set user and group to '99:78' on '/mnt/samba/01_israel/iso_image/Linux/Arch_Linux/archlinux-2014.07.03-dual.iso': Permission denied
Domain installation does not appear to have been successful.
If it was, you can restart your domain by running:
  virsh --connect qemu:///system start pal-testVM-01
otherwise, please restart your installation.

こうなる。

VM を作る

virt-install のオプションの内容は、別エントリーにします。

[root@palestine ~]# virt-install --name pal-testVM-01 \
> --connect=qemu:///system \
> --disk path=/data/sdb/kvm_work/01_data/pal-testVM-01.img \
> --network bridge=br0 \
> --network bridge=br1 \
> --network network=Virt_01 \
> --graphics vnc,listen=0.0.0.0,password=1234,keymap=ja,port=5911 \
> --hvm \
> -r 2048 \
> --vcpus=2 \
> --cdrom=/data/sdb/kvm_work/03_iso_image/archlinux-2014.07.03-dual.iso \
> --os-type=linux \
> --os-variant=virtio26

Starting install...
Creating domain...                                                                                       |    0 B  00:00:01
WARNING  Unable to connect to graphical console: virt-viewer not installed. Please install the 'virt-viewer' package.
Domain installation still in progress. You can reconnect to
the console to complete the installation process.
[root@palestine ~]#

WARNING が出ているが、virt-viewer がインストールされていないため。コマンド実行後、virsh から list で、作成した VM が動いていることを確認する。

virsh # list
 Id    Name                           State
----------------------------------------------------
 3     pal-testVM-01                  running

State が runnning になっていれば問題なし。VNC で繋げられるので繋いでみると...

正常に画面が表示された。

とりあえず覚えておけばいいコマンド

起動

start <VM 名>

終了

destroy <VM 名>

基本は、VM 側にログインしてシャットダウンすると思うが。。。

VM の削除

undefine <VM 名>

まとめ

次は運用編です。