wiki:linux/kvm

Version 22 (modified by yuna, 55 years ago) (diff)

--

KVMメモ

このページは、KVMのメモです。簡単に使いたい人は、virt-managerを使ってください。

Windowsゲストドライバ

Windowsゲストドライバを利用すると、ネットワークI/OやディスクI/Oが速くなります。 ゲストドライバの取得とインストール方法は下記のURLを参照。

準備

kvmを利用するのに、libvirtを利用します。libvirtをインストールしておきます。virt-managerをインストールすると必要なパッケージが一通り入って便利です。また、kvmで仮想マシンを実行するのに必要なqemu-kvmもインストールしておきます。

# yum install virt-manager
# yum install qemu-kvm

次に、kvmのモジュールをカーネルにロードします。AMDの場合は、kvm_intelの代わりにkvm_amdを使ってください。

# modprobe kvm
# modprobe kvm_intel

libvirtを利用するには、libvirtdの起動が必要です。libvirtdを起動しておきます。

# /etc/init.d/libvirtd start

virshを利用したKVM仮想マシンの作り方

イメージ作成

# qemu-img create -f raw ubuntu.img 10G

libvirt XMLファイルの作成方法

下記のXMLを適当に編集。特に、

  • name(他の仮想マシンとユニークな名前になるように)
  • memory(メモリ容量)
  • vcpu(CPUの数)
  • diskとcdromのsource file
  • clock offsetをWindowsの場合localtimeに。
  • mac addressを他と被らないように

辺りに注意しておく。

<domain type='kvm' id='3'>
  <name>UbuntuVM</name>
  <memory>524288</memory>
  <currentMemory>524288</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='x86_64' machine='fedora-13'>hvm</type>
    <boot dev='hd'/>
    <boot dev='cdrom'/>
  </os>

  <clock offset='utc'/>
  <devices>
    <emulator>/usr/bin/qemu-kvm</emulator>
    
    <!-- DISKの定義 -->
    <disk type='file' device='disk'>  
      <driver name='qemu' type='raw'/>
      <source file='/mnt/sda5/ubuntu.img'/>
      <target dev='hda' bus='ide'/>
    </disk>
    
    <!-- CDROMの定義 -->
    <disk type='file' device='cdrom'>
      <driver name='qemu'/>
      <source file='/mnt/sda5/iso/ubuntu-ja-10.04-desktop-i386-20100512.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
    
    <!-- ネットワークインタフェースの定義 -->       
    <interface type='network'>
      <mac address='52:54:00:1d:18:5e'/>
      <source network='default'/>
      <target dev='vnet0'/>  
    </interface>
    
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5902' autoport='yes' keymap='ja'/>
  </devices>

</domain>

virshに登録して起動

# virsh  (virsh実行。以下、virshのコンソールで実行)
virsh # define virt-kvm.xml

defineで仮想マシンを定義したXMLを登録すると、/etc/libvirt/qemuディレクトリに定義ファイルが作られる。

# ls /etc/libvirt/qemu
UbuntuVM.xml  hoge.xml  kvmtest.xml  networks
virsh # start UbuntuVM
virsh # list 
 Id 名前               状態
----------------------------------
  1 UbuntuVM           実行中

VNCクライアントのスクリーン1で接続可能( vnc://localhost:1)

停止はshutdownを使う。

virsh # shutdown UbuntuVM

ハイバネートとレジューム

virsh # save UbuntuVM UbuntuVM.mem
virsh # restore UbuntuVM UbuntuVM.mem

ネットワーク接続

  • ゲスト側のネットワークを適当設定(例えば192.168.100.2,GWを192.168.100.1)。ネットワークセグメントはホストと別にする。
  • ホスト側のネットワークを設定する。
    # ifconfig vnet0 192.168.100.1 netmask 255.255.255.0
    

IPフォワードの設定をしていなければ、IPフォワードの設定を行う。

# echo  1 >  /proc/sys/net/ipv4/ip_forward 

図で説明すると、上記の設定で次のようなネットワークが構築できる。

         +--------------+            +---------------+
      +--+-+          +-+---+     +--+-+             |
LAN---|eth0| ホストOS |vnet0|-----|eth0|  仮想マシン |
      +--+-+          +-+---+     +--+-+             |
         +--------------+            +---------------+
             vnet0:192.168.100.1   eth0:192.168.100.2

NATによるLAN上のIPからの接続

         +--------------+            +---------------+
      +--+-+          +-+---+     +--+-+             |
LAN---|eth0| ホストOS |vnet0|-----|eth0|  仮想マシン |
      +--+-+          +-+---+     +--+-+             |
         +--------------+            +---------------+
         vnet0:192.168.100.1   eth0:192.168.100.2
  • eth0に10.8.99.6でアクセスするとホストOSに接続。
  • eth0に10.8.99.7でアクセスすると仮想マシン(192.168.100.2)に接続。

するように設定してみる。普通にeth0に10.8.99.6を設定しておく。 次にNAT用のnat.iptファイルを用意する。

*nat
:PREROUTING ACCEPT [5318:237514]
:POSTROUTING ACCEPT [162:9112]
:OUTPUT ACCEPT [14132:847744]
-A PREROUTING -d 10.8.99.7 -j DNAT --to-destination 192.168.100.2
-A POSTROUTING -d ! 192.168.100.0/255.255.255.0 -j MASQUERADE
-A POSTROUTING -s 192.168.100.2  -j SNAT --to-source 10.8.99.7
-A OUTPUT -d 10.8.99.7 -j DNAT --to-destination 192.168.100.2
COMMIT

NATを読み込む。

# cat nat.ipt | iptables-restore

eth0に10.8.99.7を割り振らないとLAN上のマシンからアクセスできないので、ipコマンドでNICにIPを割り振る。

# ip addr add 10.8.99.7 dev eth0

ポートフォワードによる仮想マシンIPを利用したルートコンソールの接続

ゲストOSの5900番(VNCのデフォルトポート)をホストOS上の仮想マシンのコンソールのポートに転送するようにすれば、VNCで仮想マシンに接続するとルートコンソールが取れるようになる。

*nat
:PREROUTING ACCEPT [5318:237514]
:POSTROUTING ACCEPT [162:9112]
:OUTPUT ACCEPT [14132:847744]
-A PREROUTING -d 10.8.99.7 -p tcp --dport 5900 -j DNAT --to-destination 10.8.99.6:5900
-A PREROUTING -d 10.8.99.7 -j DNAT --to-destination 192.168.100.2
-A POSTROUTING -d ! 192.168.100.0/255.255.255.0 -j MASQUERADE
-A POSTROUTING -s 192.168.100.2  -j SNAT --to-source 10.8.99.7
-A OUTPUT -d 10.8.99.7 -j DNAT --to-destination 192.168.100.2
COMMIT

ブリッジによる接続

下準備。eth0で外に繋いでいたのをbr0経由に変更する。

# brctl addbr br0
# brctl addif br0 eth0
# ifconfig br0 192.168.1.25 netmask 255.255.255.0
# route del default
# route add default 192.168.1.1

libvirt.xmlのネットワークの設定を下記のように変更。

    <interface type='bridge'>
      <mac address='52:54:00:1d:18:5e'/>
          <source bridge='br0' />
    </interface>

あとは、仮想マシンを起動すればブリッジで接続される。仮想マシンには、192.168.1.xのアドレスを付与すればok。

DHCPでIPを付与

/var/lib/libvirt/network/default.xmlを次のように編集。

<network>
  <name>default</name>
  <uuid>631f86c8-5469-468a-a361-3a91d4b99a35</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0' />
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.100' end='192.168.122.254' />
      <host mac='52:54:00:1d:18:5e' name='foo.com' ip='192.168.122.28' />
    </dhcp>
  </ip>
</network>

上記のネットワーク設定ファイルを再設定して、ネットワークを再起動(net-destroy,net-start)する。

virsh # net-define /var/lib/libvirt/network/default.xml
ネットワーク default が /var/lib/libvirt/network/default.xml から定義されました

virsh # net-destroy default 
ネットワーク default は停止されました

virsh # net-start default 
ネットワーク default が起動されました

KVMのもうちょっと高度な使い方

そのうち書く予定

  • リソースの取得方法
  • iscsiのDISKから起動
  • ライブマイグレーション
  • block migration
  • pythonからの操作