RHEL6.0でKVM環境を構築する

環境

  • rehel 6.0

KVM環境構築の流れ

  1. KVMの導入
  2. ネットワークの構成
  3. ストレージの接続設定
  4. 仮想マシンの構成

1. KVMの導入

RHELのインストールの項目と指定するパラーメーターを以下の表に記述する

項目 指定するパラメーター
インストーラーの言語 Japanese(日本語)ここはお好み
キーボード 日本語
ストレージデバイス 基本ストレージデバイス
ホスト名 hoge.hogehoge.com
ネットワークの設定 [eth0]
自動的に接続 -> チェックを入れる
IP -> 172.18.16.32
NetMask -> 255.255.255.0
ゲートウェイ -> 172.18.16.1
DNSサーバー -> 202.248.0.42
ドメインを検索 -> hogehoge.com
タイムゾーン アジア/東京
> システムクロックでUTCを使用 使用しない
rootパスワード redhat
インストールタイプ すべての領域を使用する
パッケージグループ 仮想化ホスト
> パッケージのカスタマイズ 今すぐカスタマイズ
パッケージの選択 ●デスクトップ
- X Window System
- グラフィカル管理ツール
- デスクトップ
- フォント
- レガシー X Windows システムの互換性
- 入力メソッド
- 汎用デスクトップ
●アプリケーション
- インターネットブラウザ

2. ネットワークの構成

OSインストール後のデフォルト構成ではNNATとなっているため、外部からアクセスする構成にはなっていない。 そのため、デフォルト環境を消し、L2スイッチを再度自分で構成する。

2-1 不要なネットワーク機能を停止

# virsh net-list

初期状態で上記を実行すると、defaltというネットワークブリッジが動作中であることがわかる。
以下のコマンドで停止する。

# virsh net-autostart --disable default
# virsh net-destroy default

また、ネットワークマネージャは、ネットワーク設定を勝手に書き換えるため、仮想化している場合はトラブルの元になるため、停止する。

# service NetworkManager stop
# chkconfig NetworkManager off

2-2 サービス提供用仮想ブリッジの構成

defaultに代わって、L2スイッチ相当の動作をする仮想スイッチを作成

# vi /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0"
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=none
IPADDR=172.18.16.32
PREFIX=24

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
ONBOOT=yes
HWADDR=F8:0F:41:12:64:66
BRIDGE=br0
#GATEWAY=172.18.16.1

ゲートウェイは1つのサーバで1つしか持てない。 /etc/sysconfig/networkを先に読み、ifcfg系を後に読む。記述が重複していると後に読まれるファイルifcfg系で上書きされる。 そのため、ゲートウェイはnetworkファイルにのみ記述することで、トラブルが減る。

ネットワークの再起動

# service network restart

brctlやifconfigでbr0が作成された事を確認

# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.f80f41126466   no      eth0

# ifconfig br0
br0       Link encap:Ethernet  HWaddr F8:0F:41:12:64:66  
          inet addr:172.18.16.32  Bcast:172.18.255.255  Mask:255.255.255.0
          inet6 addr: fe80::fa0f:41ff:fe12:6466/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:13018 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5576 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:11409776 (10.8 MiB)  TX bytes:859312 (839.1 KiB)

3. ストレージの接続設定

今回はローカルストレージを使用するため、特別な設定は無し。

構成にあたり、注意点を以下に記述

VMKVMホスト上のイメージファイルまたはブロックデバイスをディスクとして使用する

  • イメージファイル: ホストは単一ファイルとして管理するためcpなど単なるコピーでバックアップがとれる。標準の格納先は/var/lib/libvirt/images/配下
  • ブロックデバイス: 通常の物理的なデバイスとして認識するためdumpコマンドでバックアップ

4. 仮想マシンの構成

GUIで、CLIで以下のような構成の仮想マシンを作成する。

項目 オプション名 パラメーター
VM --name vm32-1(GUI)
vm32-2(CLI)
メモリ --ram 512MB
インストール先 --file イメージファイル vm32-2.img
ストレージサイズ --file-size 8G
接続するネットワーク bridge: br0
インストール用データ(ISOなど)格納場所 --location/--cdrom(ローカルインストールの場合) ftpサーバ
OSのタイプ --os-type Linux
OSの種類 --os-variant rhel6
# virt-install --name=vm32-2 --ram=512 \
> --file=/var/lib/libvirt/images/vm32-2.img --file-size=8 \
> --network=bridge:br0 \
> --location=ftp://172.18.16.32/pub/rhel6 \
> --os-type=linux --os-variant=rhel6 \
> --extra-args='console=tty0 console=ttyS0, 115200n8 utf8' \
> --nographics

ちなみに、既存のqcow2を利用したい場合は、以下のようにインポートする

# virt-install --connect=qemu:///system \
> --import --name=vmname --ram=1024 \
> --disk path=/var/lib/libvirt/images/path-to-img,size=20,device=disk,bus=virtio,format=qcow2 \
> --network=network:default --keymap=ja

CLIで作成したVMはグラフィカルログインできないため、以下のコマンドでログインする

# virsh console vm32-2

ログアウト時はexitでできるが、KVMホストに戻りたい場合は、[Ctrl] + }を押す。 exitを押さずにCtrl+} で接続を切ると、次回ログイン時に直前の状態が残っているためセキュリティ上まずい。きちんとexitしてから接続を切りましょう

その他コマンドや設定

仮想GUIコンソールをセットしたいとき

# vi /etc/libvirt/qemu.conf
vcn_listen="0.0.0" #追記

設定を反映

# /etc/init.d/libvirt restart

VM作成コマンド実行時に以下をカットする

--extra-args='console=tty0 console=ttyS0,115200n8 utf8' --nographics

かわりに以下をつける

--vnc --vncport=59XX --keymap=ja

vmの状態一覧

# virsh list --all
 Id 名前               状態
----------------------------------
  1 vm32-1               実行中
  2 vm32-2               一時停止中

VMの電源操作

ゲストOSの再起動では、仮想マシン構成ファイルは再読み込みされない。メモリやCPUの構成を変更したら、以下のVMの停止・起動をすることで設定が反映される

また、VMRHELを最小構成でインストールした場合、acpidのパッケージのインストールが必要

# yum install -y acpid
# service acpid start

vmの起動

# virsh start [VM名]

vmの停止

# virsh shutdown [VM名]

vmの削除

vmを停止した状態で実行する

# virsh destroy [VM名]

自動起動

物理マシン起動後、仮想マシンを自動で起動させる

自動起動設定

# virsh autostart [VM名]

自動起動解除

# virsh autostart [VM名] --disable 

ちなみに、VM自動起動設定すると
/etc/libvirt/qemu/autostart
配下に[VM名].xmlというシンボリックリンクが作成されているため、自動起動設定の確認はここをlsするとわかる。

# ls /etc/libvirt/qemu/autostart/
vm32-1.xml

VMをホストと時刻同期する

VMホストのntp設定と、ゲストOSへntpdをインストールして有効化

  1. KVMホストのNTP設定変更

ゲストからNTPアクセス受け入れを許可する

# vi /etc/ntp.conf
restrict [VMホストのネットワークアドレス] mask 255.255.255.0 nomodify notrap

server  127.127.1.0     # local clock コメントアウトを解除
fudge   127.127.1.0 stratum 10  # コメントアウトを解除

設定を反映

# service ntpd restart
  1. KVMゲストへのntpdのインストールと有効化 以下の操作はKVMゲスト側で行います。

ntpdをインストール

# yum install -y ntp

時刻設定を手動でKVMホストに同期する。
ntpdが有効になるまで時間がかかるため、10分後位に同期されているかをdateで確認する。

# ntpdate [KVMホストのIPアドレス]

上記では手動で設定しただけなので、ntpサービスを設定する

# vi /etc/ntp.conf

#server 0.rhel.pool.ntp.org コメントアウト
#server 1.rhel.pool.ntp.org コメントアウト
#server 2.rhel.pool.ntp.org コメントアウト
server 172.18.16.32 # KVMホストのIPアドレスを追記

ntpサービスを起動

# service ntpd start
# chkconfig ntpd on

ntpdの接続先がKVMホストになっていることを確認

# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*172.18.16.32    157.7.153.56     3 u   42   64  377    0.349    0.095   0.076 

仮想NICを追加する

  1. 仮想マシンの現在の構成を確認する
  2. 追加する構成ファイルを作成してアタッチする
  3. 追加されたNICMACアドレスを確認
  4. ゲストOS再起動
  5. ゲストOS上でIPやMACアドレスを設定

まずはVMの構成を確認

# virsh dumpxml vm32-1

(略)
<interface type='bridge'>
  <mac address='52:54:00:41:0b:11'/>
  <source bridge='br0'/>
  <target dev='vnet0'/>
  <model type='virtio'/>
  <alias name='net0'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
(略)

上記のように、interfaceにbr0がbridgeとして設定されていることがわかる

追加する構成をxml形式のファイルで作成

# vi add-if.xml

<interface type='bridge'>
  <source bridge='br1' />
  <model type='virtio' />
</interface>

設定をアタッチ

# virsh attach-device vm32-1 ./add-if.xml
Device attache successfully

アタッチしたNICMACアドレスを確認する

<interface type='bridge'>
  <mac address='52:54:00:41:0b:12'/> # ここ
  <source bridge='br1'/>
  <target dev='vnet0'/>
  <model type='virtio'/>
  <alias name='net0'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</interface>

ゲストOSを再起動

# shutdown -r now

作成したNICのIP、MACアドレスを手動で設定

# vi /etc/sysconfig/network-scripts/ifcfg-br1
DEVICE="br1"
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=none
IPADDR=172.18.16.33 #ここ
HWADDR=F8:0F:41:12:64:67 #ここ
PREFIX=24

有効化

ifup br1

pingで先ほど設定した172.18.16.33に通信が通ればOK。

補足

kvmのイメージをnfs上に置く場合は、selinuxを設定する必要がある。

# getsebool virt_use_nfs
virt_use_nfs --> on

参考

OSSはアルミニウムの翼で飛ぶ: KVM:イメージ保存先へ NFS を利用可能にする。