逆引きKVM(Kernel-based Virtual Machine)

この記事は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](http://sourceforge.jp/projects/sfnet_xming/)がお勧め
* MacOS Xであれば[XQuartz](http://xquartz.macosforge.org/landing/)などがあります（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](https://qiita-image-store.s3.amazonaws.com/0/33447/8fe8b2b1-092a-3ac8-4471-0a7a1908c442.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用の設定ファイルを生成するのが作法（こちらの[ブログ](http://www.torutk.com/projects/swe/wiki/CentOS_7_KVM%E3%82%B2%E3%82%B9%E3%83%88%E3%81%A8%E3%81%97%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)が大変参考になりました）。

なのでまずは`/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から`rhgb`と `quiet`のオプションは消しています。これは起動時の出力を抑止するオプションですが、トラブルシューティングしにくくなるだけなので、消しています。*

次に、`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バックアップスクリプト](http://qiita.com/fetaro/items/6e4c88fa9b5e5346eae4)

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
```