Linux
KVM

逆引きKVM(Kernel-based Virtual Machine)

More than 1 year has passed since last update.

この記事はKVM(Kernel-based Virtual Machine)の逆引きTipsです。 CentOS 6.3のKVMを基にしています。

KVMのインストール

CentOS 6.3 64bitを最小構成でインストールする

SELinuxを切る

# setenforce 0
# vi /etc/sysconfig/selinux
---
SELINUX=disabled
---

Firewallを切る

# /etc/init.d/iptables stop
# chkconfig iptables off

ネットワークインターフェースをブリッジにする

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
---
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
---

# vi /etc/sysconfig/network-scripts/ifcfg-br0
---
DEVICE=br0
ONBOOT=yes
TYPE=Bridge
IPADDR=192.168.1.2
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
---

# /etc/init.d/network restart
# ifconfig eth0 0.0.0.0 promisc up

kvmをyumで入れる

# yum -y groupinstall "Virtualization" "Virtualization Client" "Virtualization Platform" "Virtualization Tools" "X Window System"

virt-manager用に日本語fontを入れる

# yum -y install "vlgothic-p-fonts"

mDNS クライアントの作成失敗のエラー回避のためavahiを入れる

# yum -y install avahi
# /etc/init.d/messagebus restart
# /etc/init.d/avahi-daemon restart
# chkconfig messagebus on
# chkconfig avahi-daemon on
# /etc/init.d/libvirtd start

libvirtdの起動

# /etc/init.d/libvirtd start
# chkconfig libvirtd on

KVMの管理

ssh経由でGUI(virt-manager)でKVMを管理する

Linux付属の仮想マシンマネージャ(virt-manager)を利用します。
virt-managerはX11のGUIアプリなので、リモートから画面を見るためには、画面を転送する必要があります。
そこでsshのX11 Forwadingという機能で、画面をローカル端末に転送して、そこで操作します。

手順

サーバ側でsshdの設定でX11Forwarding yesとして、X11フォワーディングを有効にします。

クライアントOSにX11サーバをインストールします

  • Windowsであればxmingがお勧め
  • MacOS XであればXQuartzなどがあります(2016/3追記:原因は定かではありませんが、私の環境だとXQuartzではVirtManagerから入力できない問題がありました。古いバージョンであるX11.appを使ったところ、うまくいきました)

sshクライアントで、X11のフォワーディングを有効にして接続します

  • puttyならば「メニュー」→「接続」→「SSH」→「X11」→「X11フォワーディングを有効にする」をチェック。その後接続
  • teratermならば「設定」→「SSH転送」→「リモートの(X)アプリケーションをローカルのXサーバに表示する」をチェックして、設定を保存。再度teratermを立ち上げる必要あり。その後SSH接続
  • OpenSSHであれば ssh -X root@(KVMホスト)と-Xオプションをつけて接続

ログインしたら「virt-manager」とコマンドを打てば、仮想マシンマネージャが起動します。

# virt-manager

snap.png

個別の仮想マシンの画面だけを見たいときは

# virt-viewer 仮想マシン名

注意

仮想マシンのコンソールにアクセスしたときに alt+ctrlが効かなくてマウスを出せなくなるので、

ユーザのホームディレクトリに .Xmodmapを作成して、下の設定する必要があります

# vi ~/.Xmodmap
---
clear Mod1
keycode 66 = Alt_L
keycode 69 = Alt_R
add Mod1 = Alt_L
add Mod1 = Alt_R
---

コンソールからvirshでKVMを管理する

コンソールでKVMを管理する場合、Linux付属のvirshコマンドを使います

起動中の仮想マシン一覧表示

# virsh list

全ての仮想マシン一覧表示

# virsh list --all

仮想マシンの情報

# virsh dominfo (仮想マシン名)

仮想マシンの起動

# virsh start (仮想マシン名)

仮想マシンの停止

# virsh shutdown (仮想マシン名)

仮想マシンの強制停止(電源OFF)

# virsh destroy (仮想マシン名)

仮想マシンの一時停止

# virsh suspend (仮想マシン名)

仮想マシンの一時停止の再開

# virsh resume (仮想マシン名)

仮想マシンの保存(メモリをファイルに書き出す)

# virsh save (仮想マシン名) (保存ファイル名)

保存した仮想マシンの復元(ファイルからメモリに戻す)

# virsh restore (保存ファイル名)

仮想マシンの構成変更(メモリ量変更など)

仮想マシン停止
/etc/libvirt/qemu/(仮想マシン名).xml を変更
変更を反映
# virsh define /etc/libvirt/qemu/(仮想マシン名).xml
起動

仮想マシンのコンソールログインする設定

通常の仮想マシンでは、コンソールにログインできない。
仮想マシンのOS起動オプションでシリアルコンソールを開けてあげると、ホストOSからvirsh consoleで接続できるようになる。

仮想マシンがCentOS 5,6の場合

grubの設定ファイル変更(CentOS 5系&6系共に実施が必要)

# vi /etc/grub.conf
---
serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1 # この行を追加
terminal --timeout=5 serial console # この行を追加
title CentOS (2.6.18-128.4.1.el5)
       root (hd0,0)
       kernel /vmlinuz (中略) console=tty0 console=ttyS0,115200n8 # console以降を追加
       initrd /initrd-2.6.18-128.4.1.el5.img
---

コンソール端末を作成 (CentOS 5 系のみで必要)

# vi /etc/inittab
---
S0:12345:respawn:/sbin/agetty ttyS0 115200 # この行を追加
1:2345:respawn:/sbin/mingetty tty1
---

コンソールからrootでログインできるようにする。(CentOS 5 系のみで必要)

# vi /etc/securetty
---
ttyS0 #追記
---

仮想マシンがCentOS 7の場合

GRUB2からは、直接設定ファイル/boot/grub2/grub.cfgをいじるのではなく、/etc/default/grubを編集したのち、grub2-mkconfigコマンドにてGRUB2用の設定ファイルを生成するのが作法(こちらのブログが大変参考になりました)。

なのでまずは/etc/default/grubを編集し、

GRUB_CMDLINE_LINUXにconsole=tty0 console=ttyS0,115200n8rを追記する。

GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos_centos70-template/root rd.lvm.lv=centos_cenn
tos70-template/swap console=tty0 console=ttyS0,115200n8r"  #ここを追記
GRUB_DISABLE_RECOVERY="true"

上記の例では、GRUB_CMDLINE_LINUXからrhgbquietのオプションは消しています。これは起動時の出力を抑止するオプションですが、トラブルシューティングしにくくなるだけなので、消しています。

次に、grub2-mkconfigコマンドにてGRUB2用の設定ファイルを生成します

# grub2-mkconfig -o /boot/grub2/grub.cfg

これでゲストマシンを再起動すればオーケー。

ゲストマシンのコンソールに接続

# virsh console (ドメイン名)

※ 抜ける場合はctrl + ]
仮想マシンを起動&そのままコンソール接続

# virsh start (ドメイン名) --console

KVMの運用

仮想マシンのバックアップ

基本的には、以下の二つのファイルをバックアップしておけばOK

仮想マシン設定ファイル
    /etc/libvirt/qemu/(仮想マシン名).xml
仮想ディスクイメージファイル
    上記設定ファイルにイメージファイルの場所は書いてあります
    通常は /var/lib/libvirt/images/(仮想マシン名).img

仮想マシンのバックアップからのリストア

仮想ディスクイメージファイルを適切な場所(設定ファイルあるパス)に置く
    通常は /var/lib/libvirt/images/(仮想マシン名).img
仮想マシン設定ファイルを適切な場所に置く
    通常は /etc/libvirt/qemu/(仮想マシン名).xml
以下のコマンドで仮想マシン設定ファイルの読み込み

# virsh define (仮想マシン設定ファイル)

バックアップスクリプト

rubyのバックアップスクリプト作ったので、もしよかったら使ってください→KVMバックアップスクリプト

VMWareの仮想ディスクマシンをKVM用に変換

vmwareの仮想ディスクイメージ(vmdk)をkvmに変換するときは以下のコマンドを打つ。

qemu-img convert (vmdkファイル) -O raw (kvmイメージファイル)

KVMのTips

ファイルの配置

  • 仮想マシン情報定義ファイル : /etc/libvirt/qemu/xxx.xml
  • 仮想マシンイメージ : /var/lib/libvirt/images/xxx.[img|qcow2]

KVMのトラブルシューティング(CentOS6系)

mDNS クライアントの作成に失敗

/var/log/libvirt/libvirtd.logのエラーメッセージ

2012-07-17 15:47:49.240+0000: 15548: info : libvirt version: 0.9.10,
package: 21.el6_3.1 (CentOS BuildSystem ,]
2012-07-03-16:15:49, c6b8.bsys.dev.centos.org)
2012-07-17 15:47:49.240+0000: 15548: error : virNetServerMDNSStart:460
: 内部エラー mDNS クライアントの作成に失敗しました: Daemon not running

対応

# yum -y install avahi
# /etc/init.d/messagebus restart
# /etc/init.d/avahi-daemon restart
# /etc/init.d/libvirtd restart
# chkconfig messagebus on
# chkconfig avahi-daemon on
# chkconfig libvirtd on

参考

http://quags.net/archives/53

virt-managerの日本語fontが表示されない

fontが足りていない

対応

# yum install "vlgothic-p-fonts"

適切なエミュレーターを見つけられない

/var/log/libvirt/libvirtd.logのエラー

2012-07-24 01:43:07.595+0000: 2126: error : qemuCapsExtractVersion:1566 : 内部エラー x86_64 の適切なエミュレーターを見つけられません

対応

# ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-system-x86_64
# /etc/init.d/libvirtd restart

KVMのカーネルモジュールが読み込まれない

KVM を利用できません。これは KVM パッケージがインストールされていない。また
は、KVM のカーネルモジュール (kvm.ko) が読み込まれていないことを意味します。
QEMU が使われるので動作が遅くなるでしょう。

warning: KVM is not available. This may mean the KVM package is not installed, or the KVM kernel modules are not loaded. Your virtual machines my perform poorly

一時的な対応はカーネルモジュールの読み込めばOK

# modprobe kvm
# modprobe kvm-intel

再起動後も設定を継続させる場合は、 /etc/rc.d/rc.sysinitに以下を記載

modprobe kvm
modprobe kvm-intel

仮想マシンがKVMの内部のネットワークから外に出れない

仮想マインのインターフェースがプロミスキャスになっていないことがある

対応

# ifconfig eth0 0.0.0.0 promisc up

virsh shutdownで仮想マシンが停止しない

acpidが入っていない可能性がある。インストールすればOK

# yum install acpid