KVMの準備

sudo yum install libvirt libvirt-client qemu-kvm-ev virt-manager virt-top virt-viewer virt-install bridge-utils libguestfs-tools-c
sudo systemctl start libvirtd

default ネットワークの削除

普通にVMを作成して動作させるだけならば、default networkを使っても良いが、dnsmasqが動いたりしてちょっと面倒なので、削除しておく。

sudo virsh net-destroy --network default

VMの起動/削除

VMの起動は多くの場合は、define xmlを書いて行う。

: 起動
sudo virsh define /path/to/define.xml

: 削除
sudo virsh destroy /path/to/define.xml

define xml

基本的には以下のような感じで書いておけば良い。 Nameは分かりやすいように。UUIDは被らないように設定する。 MemoryとCPUに関しては使いたいだけ使う。

<domain type='kvm'>
  <name>instance-name</name>
  <uuid>03035244-4b6b-11ec-81d3-0242ac130003</uuid>
  <memory unit='KiB'>1000000000</memory>
  <currentMemory unit='KiB'>1000000000</currentMemory>
  <vcpu placement='static'>4</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode="host-passthrough" match="exact">
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <devices>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <controller type='virtio-serial' index='0'></controller>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <video>
      <model type="cirrus"/>
    </video>
  </devices>
</domain>

ネットワークデバイス

libvirtdが管理しているnetworkを利用したい場合には device に type が networkinterface を追加する。

  <devices>
    <interface type='network'>
      <source network='default'/>
      <model type='virtio'/>
    </interface>
  </devices>

また、さらに細かく設定したい場合には、以下ようにIPアドレスや、MACアドレスなど、ネットワークの設定に応じて設定する事も出来る。 IPアドレスだけだとかMACアドレスだけといった設定も出来る。

  <devices>
    <interface type='network'>
      <source network='default'/>
      <model type='virtio'/>
      <mac address='00:00:5e:00:53:01'/>
      <ip address='192.168.122.1' netmask='255.255.255.0'>
    </interface>
  </devices>

また、networkではなく、type ethernetを利用する事でより柔軟にコントロールも出来る。 以下のように typeethernet となったインターフェースも追加する事が出来る。

  <devices>
    <interface type="ethernet">
      <model type="virtio"/>
      <driver name="vhost">
      </driver>
      <script path=""/>
      <target dev='tap-name'/>
      <mac address='00:00:5e:00:53:03'/>
    </interface>
  </devices>

このインターフェースを追加すると、VMのインターフェースに1対1対応する、 target devに指定されたtapがHV上に作成されて通信が可能になる。 ただ、 ethernet ではIPアドレスの指定などが出来ないため、そのハンドリングを行う必要がある。 具体的には、dnsmasqを用いてDHCPでVMにIPアドレスを採番するか、ConsoleでログインしてIPアドレスを手動で割り当てる必要がある。 より柔軟にコントロール出来るため、OpenStackなどでは基本的に ethernet が用いられる。

VMへのConsole経由の接続

ネットワークから接続出来る場合には必要ないが、まぁ、往々にして、ネットワークの設定は失敗するので、Consoleからのアクセスも必要

sudo virsh console --domain instance-name