VirshコマンドによるKVMゲストOSの管理

既にゲストOSのインストールは完了しているものとします。

# 履歴
2015/06/16: ngyuki さんコメントよりvirsh define コマンドの説明と、virsh edit コマンド周りについて加筆修正

# ゲストOSの登録 
もし他のホストマシンなどからイメージと定義ファイルをコピーしてきた場合、virsh コマンドでそのイメージを管理するには`virsh define` コマンドを使用してlibvirt 管理下に登録することができます。
例えば`/etc/libvirt/qemu` ディレクトリ配下に定義ファイルがある場合、その定義ファイルを指定して`virsh define` コマンドを実行することで、ゲストOS を`virsh` コマンドで管理できるようになります。

```console:コマンド例
# virsh define /etc/libvirt/qemu/kvm_centos7.xml
```

なお、このxml 定義ファイルは直接編集せず、`virsh edit` コマンドを使用して編集するようにしてください。
`virsh edit` コマンドを使用して編集することで、定義ファイルに誤りがあった場合に保存時にエラーとなるため、安全です。

# ゲストOSの確認 
追加したゲストOS を確認するには、`virsh list --all` コマンドを実行します。
停止状態のゲストOS も表示するには、`--all` オプションも追加します。


```console:コマンド例
# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     kvm_centos7                    shut off
```


# ゲストOSの起動 
登録されているゲストOS を起動するには、`virsh start DOMAIN_NAME_OR_UUID [--console]` コマンドを実行します。


```console:コマンド例
# virsh start kvm_centos7
```


`--console` オプションを指定すると、ゲストOS 起動と同時にコンソール接続をします。

## ゲストOSの停止 
`virsh shutdown DOMAIN_NAME` コマンドを使用することで、登録されているゲストOS を停止することができます。


```console:コマンド例
# virsh shutdown kvm_centos7
```


これで停止しない場合は、`destroy` オプションで強制終了してください。


```console:コマンド例
# virsh destroy kvm_centos7
```


# ゲストOS のコンソールに接続する 
`virsh console DOMAIN` コマンドを実行することで、ゲストOS のコンソールに接続することができます。


```console:コマンド例
# virsh console kvm_centos7
```


## ゲストOS へシリアル接続できない場合 
ゲストOS へシリアル接続する場合、ゲストOS 側でシリアル接続する設定が含まれている必要があります(ここでは説明を割愛)。

# OS起動時にゲストOS を起動する 
OS 起動時にゲストOS を起動する場合は、`virsh autostart` コマンドを使用します。


```console:コマンド例
$ sudo virsh autostart kvm_centos7
```


`/etc/libvirt/qemu/autostart/` ディレクトリ以下にファイルが作成されていれば、OKです。


```console:コマンド例
$ ls /etc/libvirt/qemu/autostart/
kvm_centos7.xml
```


# ゲストOS の自動起動を解除する 
`virsh autostart` によって、自動起動するよように設定されたゲストOS を元に戻す場合は、`virsh autostart --disable` コマンドを実行します。


```console:コマンド例
$ sudo virsh autostart --disable kvm_centos7
```


# ゲストOS の保存 
`virsh save DOMAIN_NAME FILE_NAME` ゲストOS の状態を保存し、ゲストOS を停止します。


```console:コマンド書式
# virsh save <domain_name> <file>
```



```console:コマンド例
# virsh save kvm_centos7 /var/kvm/save/kvm_centos7_01.vmsave
```


## ゲストOS のリストア 
`virsh restore FILE_NAME` コマンドを実行することで、ゲストOS の状態を保存したファイルからリストアすることができます。 


```console:コマンド例
# virsh restore /var/kvm/save/kvm_centos7_01.vmsave
```


# ゲストOSにCPU を追加する 
`virsh setvcpus [domain-name] [count]` コマンドを実行することで、ゲストOS に仮想CPU を追加することができます。


```console:コマンド例
# virsh setvcpus kvm_centos7 2
```


CPU の設定状況を確認するには、`virsh vcpuinfo [domain]` コマンドを実行します。


```console:コマンド例
# virsh vcpuinfo kvm_centos7
VCPU:           0
CPU:            3
State:          running
CPU time:       41.5s
CPU Affinity:   yyyy

VCPU:           1
CPU:            2
State:          running
CPU time:       15.2s
CPU Affinity:   yyyy
```


## 上限を超えてVCPU を追加することはできない 
KVM のゲストOS に追加できるVCPU の上限は、ゲストOS 作成時に指定したCPU 数が上限となっています。
上限を超えてVCPU を登録しようとすると次のようなエラーメッセージが出力されます。


```console:コマンド例
# virsh setvcpus kvm_centos7 4
error: invalid argument: requested vcpus is greater than max allowable vcpus for the domain: 4 > 2
```


既に作成されているゲストOS のVCPU 上限数を変更するには、一度`virsh edit [domain]` コマンドを実行し、vcpu の値を変更します。


```console:コマンド例
# sudo virsh edit kvm_centos7
```


vcpu　エレメントの値を変更します。今回は2 から4 に変更しました。


```console:コマンド例
<vcpu placement='static'>4</vcpu>
```


ゲストOS が既に起動している場合はshutdown してからstart します。(reboot では反映されませんでした(2015/01 現在))


```console:コマンド例
# virsh shutdown kvm_centos7
# virsh list --all

※停止しているのが確認できたら
# virsh start kvm_centos7
```


起動したら、`virsh vcpuinfo [domain]` コマンドを実行してcpu 数が増えて事を確認します。


```console:コマンド例
# virsh vcpuinfo kvm_centos7
```


# 動的にvcpu の数を変更する
※できませんでした・・・。今後できるようになるかもしれないので、備忘録として残しておきます

CPU のHot Plug 機能を利用するには、現状下記のような制限があります。
<dl>
  <dt> MAX CPU(KVM ゲストOS のXML に記載) は2 以上であること</dt>
  <dt> MAX CPU を超えるvcpu 数を追加することはできない(MAX CPU を増やす場合はゲストOS 再起動が必要)</dt>
  <dt> libvirt のバージョンが1.0.6.5 以上(Fedora の場合は1.0.5.5 とも)</dt>
</dl>

参考：

```text
http://blog.etsukata.com/2013/09/qemukvm-cpu-hotplug.html
```

なお、ここではゲストOS にログインして実施する方法と、ホストOS からゲストOS を操作するQemu guest agent を使用した方法を説明します。
Qemu guest agent を使用する場合は、ゲストOS 側にQemu guest agent パッケージをインストールできるOS でなければできません。
Qemu guest agent は次のコマンドでインストールすることができます。

```console:RedHat系
# yum install qemu-guest-agent
```

```console:Debian系
$ sudo apt-get install qemu-guest-agent
```

## チップセットエミュレータのバージョン指定 
チップセットエミュレータのバージョンが1.5 以上であることを確認してください。
1.5 未満の場合は1.5 以上になるように`virsh edit DOMAIN_NAME` で変更してください。
(※2015/01 現在、"machine='pc-i440fx-utopic'" のチップセットエミュレータでも問題なく動作しそうです)


```console:コマンド例
$ virsh edit kvm_centos7

<os>
  <type arch#"x86_64" machine"pc-1.2">hvm</type>
</os>

↓↓↓

<os>
  <type arch#"x86_64" machine"pc-1.5">hvm</type>
</os>
```


### vcpu の確認及び変更(ゲストOS から実行する場合) 
ゲストOS へログインし、vcpu の数を確認します。


```console:コマンド例
# egrep -c '^processor\s+' /proc/cpuinfo
8
```


## online なvcpu の確認(Qemu guest agent を使用する場合) 
TODO:
2015/01 現在、ホストOS からゲストOS を直接操作することはサポート対象外らしい。ゲストOS をCentOS 7 にして実施してみたが、そもそも`qemu-guest-agent` デーモンが起動しない。

```text:参考
http://wiki.libvirt.org/page/Qemu_guest_agent
http://blog.etsukata.com/2013/09/qemukvm-cpu-hotplug.html
http://lost-and-found-narihiro.blogspot.jp/2013/08/fedora-19-kvm-qemu-guest-agent.html
```

qemu-quest-agent を起動しようとすると次のようなエラーログ


```console:コマンド例
[root@localhost ~]# systemctl status qemu-guest-agent.service
qemu-guest-agent.service - QEMU Guest Agent
   Loaded: loaded (/usr/lib/systemd/system/qemu-guest-agent.service; static)
   Active: inactive (dead)

Jan 21 11:48:03 localhost.localdomain systemd[1]: Dependency failed for QEMU ...
Hint: Some lines were ellipsized, use -l to show in full.
```


# ゲストOS のIP アドレスを取得する (Cent OS ではできなかった)
`qemu-guest-agent` を使用してゲストOS のIPアドレスを取得する。
※現状CentOS 7 ではうまくいかないので保留。インターネットに出回っているサンプルではFedora が多い
http://d.hatena.ne.jp/NeoCat/20140401/1396304174

# ゲストOS メモリサイズを変更する 
ゲストOS を一旦停止させてからメモリを増設させる方法です。
ゲストOS を停止します(ドメイン名:kvm_centos7)。


```console:コマンド例
# virsh shutdown kvm_centos7
```


ゲストOS のxml ファイルを`virsh edit` コマンドで開き`memory` 要素(最大メモリ)と`currentMemory` 要素(実質メモリ)を編集します。


```sh:
virsh edit kvm_centos7
～～～抜粋～～～
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
～～～抜粋～～～
```

※上記のサンプルでは、`1 * 1024 * 1024 * 2` の2GiB を指定しています。

ゲストOS を起動したら、ゲストOS にログインし、`free` コマンドを実行してメモリを確認してください。

# ゲストOS メモリサイズを動的に変更する(結果・現段階では動的にメモリサイズの変更はできないっぽい) 
※これも今後できるようになるかもしれないので備忘録として残しておきます。
まず、最大メモリサイズを変更します。現在、最大メモリサイズとカレントメモリサイズが1G として、2G にメモリを増設する手順を説明します。


```console:コマンド例
# virsh setmaxmem kvm_centos7 2G --config
# echo $?
0
```


最大メモリサイズを変更したら、(動的には変更できないようなので)ゲストOS をシャットダウンします。


```console:コマンド例
# virsh shutdown kvm_centos7
```


ゲストOS が停止したら、次のコマンドで、カレントメモリサイズを変更します。


```console:コマンド例
# virsh setmem kvm_centos7 2G --config
```


設定を変更したら、ゲストOS を起動して反映完了です。


```console:コマンド例
# virsh start kvm_centos7
```