KVMインストール(ホスト、ゲスト)設定

KVMのインストール手順なんかは私以外にも沢山書かれていると思いますので
自分の作業メモな感じで共有します

あと、この記事と類似している内容のブログ記事があると思われるのですが
元ネタが自分なので Qiita側に自身の備忘録兼ねてアップしました

また今回ホスト・ゲスト共に
Miracle Linux社のAsianux4を使用しています
（RHELベースなのでRHEL、CentOSもほぼ同じです。パッケージ名称等が変わると思いますが）

ゲスト側のCLI操作については`GUEST側操作`の目印を付けました

#AsianuxをKVM等で使う
公式Webより
http://www.miraclelinux.com/product-service/server-linux/linux/axs4/function
>仮想化環境に優位なライセンス
>
>Asianux Server 4 == MIRACLE LINUX V6は、仮想化機能としてKVMを提供しています。1ライセンスでKVM上のゲストOSやVMware上のゲストOSの仮想化ライセンスとして無制限にご利用いただけます。（1物理サーバごとにライセンスが必要となります）

#検証環境
マシン：メモリ32Gくらい、CPU Xeon 2.6GHz 12core
（今回は、ホスト側のOSインストール、設定とBondingの設定まで完了している）
OS：Asianux4

#ホスト側準備
OSのインストールイメージを判り易い場所へ配置しておく
`/iso/Asianux-4-x86_64-dvd.iso`
今回は判り易いように/の下にISOディレクトリを作成

Kickstart形式で今回はインストールしたいと思いますので
anaconda.cfgを作成
こちらも前途作成した/iso/に置く事にします
中身は適宜使いたい環境に合わせる

```:anaconda.cfg
# Kickstart file automatically generated by anaconda.

#version=DEVEL
install
cdrom
lang ja_JP.UTF-8
keyboard jp106
# The Network config as describe below
network  --bootproto=static --device=eth0 --onboot=no --nameserver=[使うDNSサーバ] --hostname=[使うホスト名]
# Account
rootpw  --iscrypted [SHADOW入れれば大丈夫]
firewall --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --disabled
timezone Asia/Tokyo
# DISK settig
bootloader --location=partition --append="crashkernel=auto rhgb quiet"
clearpart --all --initlabel
part /boot --fstype=ext4 --size=500
part swap --size=2048
part / --fstype=ext4 --grow --size=1

#repo --name="Asianux Server"  --baseurl=cdrom:sr0 --cost=100
#
%packages
@base
@client-mgmt-tools
@console-internet
@core
@debugging
@directory-client
@hardware-monitoring
@java-platform
@large-systems
@network-file-system-client
@performance
@perl-runtime
@server-platform
@server-policy
pax
python-dmidecode
oddjob
sgpio
device-mapper-persistent-data
systemtap-client
samba-winbind
certmonger
pam_krb5
krb5-workstation
perl-DBD-SQLite
%end
```

サンプルのanacondaだと以下を想定して・・・
・IPアドレスはstaticだが、ゲスト構築時にコンソールからログインして毎回アサインする想定
・パッケージは基本サーバ選択時のもの（その時のanacondaをベースに作成したので問題ないはず）

ゲストOSをチームの人とかに使ってもらう場合はシンプルな基本設定だけ入れて
あとはカスタマイズしてもらうのが良いでしょう
またパーティションはチーム等でお決まりの切り方が有ると思うのでここでテンプレ化しておきましょう

#KVMインストール作業

##モジュールを確認する
KVMモジュールが入っている事を確認

```
$ lsmod | grep kvm
kvm_intel              55496  20
kvm                   337900  1 kvm_intel
```

##KVMを使うために、必要なパッケージを入れる
Distributionによっては名前が違うと思いますので参考まで

```
# yum groupinstall "virtualization" "virtualization-client" "virtualization-platform" "virtualization-tools"
```

##ホスト側のNW設定
Bridgeのインターフェースを作成します
ゲスト側もホスト側と同一セグメントのNWでIPを振りたかったので
ホスト側のBridgeに接続する形をとる

```
# cp -p /etc/sysconfig/network-scripts/ifcfg-bond0 /etc/sysconfig/network-scripts/ifcfg-br0
```

中身を編集する
右：bond0
を
左：br0
のようにbond0の内容を使って今回は編集した
（サンプルなので内容は各自の環境に合わせて設定してください）
設定しなければいけないところは、DEVICE=br0 と TYPE=Bridge の部分

```
DEVICE=br0            | DEVICE=bond0
TYPE=Bridge           | #TYPE=Ethernet
ONBOOT=yes            | ONBOOT=yes
--------------------- | BRIDGE=br0
NM_CONTROLLED=yes     | #NM_CONTROLLED=yes
BOOTPROTO=none        | #BOOTPROTO=none
IPADDR=XXX.XXX.XXX.XX | #IPADDR=XXX.XXX.XXX.XX
PREFIX=XX             | #PREFIX=XX
GATEWAY=XXX.XXX.XXX.X | #GATEWAY=XXX.XXX.XXX.X
DNS1=XXX.XXX.XXX.XX   | #DNS1=XXX.XXX.XXX.XX
DEFROUTE=yes          | #DEFROUTE=yes
IPV4_FAILURE_FATAL=yes| #IPV4_FAILURE_FATAL=yes
IPV6INIT=no           | #IPV6INIT=no
ARPCHECK=no           | #ARPCHECK=no
USRCTL=no             | #USRCTL=no
```

編集が終わったらNetwork Interfaceを起動しておきます

```
# /etc/init.d/network restart
```

このタイミングで今回のKVM等に必要になる仮想管理のライブラリも起動してみる

```
# /etc/init.d/libvirtd start
```

###libvirtがrestartできない等
既に一度libvirtdを起動したりしていて
NW設定変更後にrestart等を実施しても起動しない場合

```
# /etc/init.d/libvirtd status
libvirtd dead but subsys locked
# /etc/init.d/libvirtd stop
Stopping libvirtd daemon:                                  [FAILED]
```

messagebusをインストールし起動するとlibvirtが起動できるようになる

```
# yum install dbus
#
# /etc/init.d/messagebus start
Starting system message bus:                               [  OK  ]
#
# /etc/init.d/libvirtd restart
Stopping libvirtd daemon:                                  [FAILED]
Starting libvirtd daemon:                                  [  OK  ]
```


##ホスト側のGUEST OSに絡む設定
（ゲストの起動停止コントロール設定）
特に設定は変更しなくとも良いと思う
好きなようにコントロールしたい人は設定する

```
# vim /etc/sysconfig/libvirt-guests
START_DELAY=30
ON_SHUTDOWN=shutdown
SHUTDOWN_TIMEOUT=60
```

#GUEST OSの作成
##仮想HDDイメージを作成する

```
# cd /var/lib/libvirt/images
```

qemu-imgコマンドでimageを作成
qemu-img create -f qcow2 [IMAGE NAME] [DISK SIZE]G こんな感じです

```
# qemu-img create -f qcow2 test.img 20G
Formatting 'test.img', fmt=qcow2 size=21474836480 encryption=off cluster_size=65536 
```

##kickstartでOSインストール
今回はGUEST環境スペック要件

```
仮想CPU:2
Memory:4G
```

virt-install -h でhelpが見れるはずなので
作成したい物に合わせてoptionを適宜入力

OSのイメージ、anacondaのcfgの場所も各自の環境に合わせる
--os-variantについてはどのdistributionがどの文字列なのかを調べるには
以下の様に調べる事ができる

```
# virt-install --os-variant list
win7                 : Microsoft Windows 7 or later
vista                : Microsoft Windows Vista
winxp64              : Microsoft Windows XP (x86_64)
winxp                : Microsoft Windows XP

axs4                 : Asianux Server 4
rhel7                : Red Hat Enterprise Linux 7 or later
rhel6                : Red Hat Enterprise Linux 6
rhel5.4              : Red Hat Enterprise Linux 5.4 or later


```

実際にinstallを実行

```
# virt-install --connect qemu:///system \
             --vcpus=2 \
             --name test-server \
             --ram=4096 \
             --hvm \
             --location /iso/Asianux-4-x86_64-dvd.iso  \
             --os-type=Linux \
             --os-variant=axs4 \
             --disk=/var/lib/libvirt/images/test.img,format=qcow2 \
             --network bridge=br0 \
             --autostart \
             --noautoconsole \
             --accelerate \
             --keymap ja \
             --initrd-inject=/iso/ks.cfg \
             --extra-args='ks=file:/ks.cfg console=tty0 console=ttyS0,115200n8'
```

##インストールしたGUEST OSへログイン
ks.cfgではNWの設定を入れていないのでconsole経由で接続します
ちなみにインストール時に`--noautoconsole`を付けなければ
インストール完了後に自動的にコンソール接続がされるはずです

接続先はinstall時に`--name`で設定した名前を使います

```
# virsh console test-server
```

このタイミングでGUEST OS側のNW設定をしたり
ソフトウエアの追加等をします

```:GUEST側操作:
# vim /etc/sysconfig/network
# vim /etc/sysconfig/network-script/ifcfg-eth0
```

acpidを動かしておく（virshでshutdown操作ができるように）

```:GUEST側操作:
#/etc/init.d/acpid start
```

ここまでできたらゲストへ割り当てたIPと同セグメントからログイン確認を行う
(ログイン確認ができたらiptables等閉めましょう)

##一度作成したimageをコピーして使う
test-serverのimgをtest-server2(test2.img)としてコピーする

```
# virt-clone --original test-server --name test-server2 --file /var/lib/libvirt/images/test2.img
```

imageをコピーしてGUESTを作成した場合は
コピー先のimageでMACアドレス、ホスト名の修正等が必要になります

コピー先のドメインに割当されたMACアドレスを仮想マシンの設定ファイル(xml)から調べます
`# virsh dumpxml test-server2 | grep mac`

コンソールでコピー先のimageにログイン

```
$ virsh console test-server2
```

```:GUEST側操作:
# vi /etc/udev/rules.d/70-persistent-net.rules
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
# vi /etc/sysconfig/network
```

編集が終わったらコピー先のGUESTをrebootし意図通りに設定されたか確認

```:GUEST側操作:
# reboot
```

```
$ virsh console test-server2
```

```:GUEST側操作:
# uname -n
# ifup eth0
# ip a
```
*まれにeth0以外で認識したりするが再起動とか繰り替えしてればなおるようだ

## コピー先GUESTをoffline状態でMAC等を修正する場合
virt-editのツールを使うと便利

yumでツールをinstall

```
# yum install libguestfs libguestfs-tools libguestfs-tools-c
```

以下のようにホストOSからオペレーションすると
指定したGUESTのファイルが編集可能
(GUESTは停止したままで編集操作をしましょう 破損する可能性も)

```
# virt-edit [DOMAIN NAME] /etc/sysconfig/network-scripts/ifcfg-eth0
# virt-edit [DOMAIN NAME] /etc/udev/rules.d/70-persistent-net.rules
# virt-edit [DOMAIN NAME] /etc/sysconfig/network
```

ちなみにeditだけではなく、catやlsなんかもできる
virt-ls,virt-cat等

#おまけ

GUESTの一覧（停止中も表示したい場合は--allをつける）
`# virsh list`

GUEST起動
`# virsh start [DOMAIN NAME]`

consoleでGUESTへ接続
`# virsh console [DOMAIN NAME]`
*途中でターミナルが落ちたりすると接続したままになってしまうので注意
*consoleは1GUESTに対して1consoleしかつなげられない模様

GUESTの停止（要acpid）
`# virsh shutdown  [DOMAIN NAME]`

強制停止
`# virsh destroy  [DOMAIN NAME]`

console接続がロックされえしまった場合
libvirtをrestartするとconsoleセッションがクリアされる
`# /etc/init.d/libvirtd restart`
（他にやり方があるのかもしれない）