KVM

KVM は仮想化アーキテクチャーの一つです。
更新日 2016-05-27

KVM とは

後発の仮想化技術になりますが、早々にLinux カーネルにマージされています。CPU の仮想化アーキテクチャーを効率よく使い、 完全仮想化のみをサポートしています。

ホストの作成

CentOS7 で最小構成+仮想化ホストでインストールします。

ブリッジインターフェイスの作成

ホストOS の物理ネットワークとゲストOS の仮想NICを仮想ハブ(ブリッジ)に収容します。
// https://gist.github.com/hiroyuki-sato/2b7890338e5eca2c4931nm
// CentOS7

// Create Bridge. [/etc/sysconfig/network-scripts/ifcfg-bridge-br0]
nmcli connection add type bridge ifname br2

// Initialize bridge parameters.
nmcli connection modify bridge-br1 ipv4.method manual \
 ipv4.address "192.168.9.33/24" \
 ipv4.gateway "192.168.9.1" \
 ipv4.dns 192.168.9.1 \
 ipv4.dns-search redhat.com

// create slave. [/etc/sysconfig/network-scripts/ifconfig-bridge-slave-enp1s0f0]
nmcli connection add type bridge-slave ifname enp3s0 master br2
ifconfig-enp1s0f0とifconfig-bridge-slave-enp1s0f0の二種類の設定ファイルがあると、 ifconfig-enp1s0f0 が優先されるためブリッジに収容されません。下記のコマンドで 設定ファイル
// delete nic. [/etc/sysconfig/network-scripts/ifconfig-enp1s0f0]
nmcli con del enp1s0f0

// Reboot system.
reboot
cd /etc/sysconfig/network-scripts

// デフォルトインターフェイスの編集
vi ifcfg-eth0

 BOOTPROTO=dhcp
 BRIDGE=br0

// ブリッジインターフェイスの作成
vi ifcfg-br0

 DEVICE=br0
 TYPE=Bridge
 ONBOOT=yes
 BOOTPROTO=static

 IPADDR=192.168.23.3
 NETMASK=255.255.255.0
 DNS1=192.168.23.1
ネットワークを再起動すればbr0 というブリッジが出来てるはずです。またゲストもこのブリッジに接続する事にします。

ゲストの作成

ホスト(KVM サーバー) ではvirt-installが使えるので、簡単にインストールできます。

ゲストOS のインストール

dd コマンドで仮想ディスク(非スパースファイル)を作って、そこにインストールします。
今回はCentOS 7 をゲストOSにしますが、グラフィカルインストール環境が必要なのでインストールが始まったら VNCクライアント(例えば UltraVNC) を接続をします。
yum install virt-install virt-viewer

// Disk
dd if=/dev/zero of=/vm/centos7.img bs=1M count=9000

// インストールスクリプト(location はURL でも可)
virt-install \
 --connect qemu:///system \
 --name centos7 \
 --ram 1000 \
 --vcpus 1 \
 --disk path=/vm/centos7.img \
 --os-type linux \
 --os-variant virtio26 \
 --location 'http://ftp.riken.jp/Linux/centos/7/os/x86_64/' \
 --accelerate \
 --network bridge=br2 \
 --keymap ja \
 --hvm \
 --vnc \
 --vnclisten=192.168.23.33 \
 --vncport 5900
この後VNC クライアントを立ち上げてKVM サーバーのアドレス及びポート5900 にアクセスします。上手くいかない時は VNC クライアントを再接続・多重接続してみてください。グラフィカル画面が出たらマウスも使えるはずです。
ram が少ないとグラフィカルインストールにならない場合があります。
無事インストールが終わると再起動なんですが、実際には再起動されません。virsh start で起動します。

コンソールの設定

virsh console で接続する為の端末をブート時に指定しておきます。
vi /boot/grub/grub.conf

 
 console=tty0 console=ttyS0,115200n8

ゲストの操作

virsh コンソールを使ってコマンドラインから操作できます。

起動

コマンドです。
// ドメイン名から起動
virsh start Guest domain name// 設定ファイル(/etc/libvirt/qemu/)から起動
virsh create Guest domain xml file(fullpath)

終了

ゲスト側で終了するか、shutdown を指示できます。
// ドメイン名から終了
virsh shutdown Guest domain name(or ID number)// 電源オフ(強制)
virsh destroy Guest domain name(or ID number)

休止・復元

使用頻度はあまりありませんが、一時停止もできます。
// 休止
virsh suspend Guest domain name(or ID number)// 復帰
virsh resumeGuest domain name(or ID number)

ゲストの設定変更

/etc/libvirt/qemu 配下にあるxml ファイルを編集します。

HDD を追加する

設定ファイルに追記します。設定ファイルはvirsh コンソールがキャッシュする為、virsh define かlibvirtd の再起動が 必要になります。
vi /etc/libvirt/qemu/vm1.xml

 <disk type='file' device='disk'>
	 <driver name='qemu' type='raw' cache='none'/>
	 <source file='/ddrv/ddrv_for_ast.img'/>
 	 <target dev='vdb' bus='virtio'/>
 </disk>

// 設定ファイルから更新する
virsh define vm1 
変更が更新されると<address type='pci' ... > なる項目が 自動追記されます。

ディスクイメージをqcow2 フォーマットにする

サイズが小さくなります。
// ゲストOS にて空き領域のゼロクリア
dd if=/dev/zero of=zero bs=4k;
rm -f zero

// ホストOS にて
qemu-img convert -O qcow2 ddrv_for_ast.img ddrv_for_ast.qcow2