QEMU をつかって仮想マシンを作成する

> [!NOTE]
> この記事は 2013/08/11 に [momoto.github.io](http://momoto.github.io) へ投稿した内容を Qiita へ移行してきたものです

　[QEMU](https://www.qemu.org) をつかって仮想マシンを作成する手順の記録です。ホスト側に仮想化機能が備わっていることを確かめたあと、QEMU をつかって ゲストOS を構築します。

## 1. 仮想化機能を確かめる

　ホストとなる GNU/Linux システムで、CPU のハードウェア仮想化支援機能と [Linux KVM](https://www.linux-kvm.org/page/Main_Page) のサポートを確かめます。

### ハードウェアサポートを確かめる

　[lscpu](http://manpages.courier-mta.org/htmlman1/lscpu.1.html) の仮想化（Virtualization）の行、または `/proc/cpuinfoのflags` の行から、ハードウェア仮想化支援機能（Hardware-Assisted Virtualization）を確認します。 この機能は CPU ベンダーごとに実装が異なるので、インテル製品であれば VT-x を、AMD製品であれば AMD-V を確かめます。

```shell-session:lscpu
$ lscpu | grep -Ei "(vt-x|amd-v)"
仮想化:             AMD-V
```

　`/proc/cpuinfo` では、VT-x の動作モード VMX、または、AMD-V の Secure virtual machine（svm）を確かめます。

```shell-session:cpuinfo
$ grep -E "(vmx|svm)" /proc/cpuinfo
flags : ... svm ... svm_lock ...
```

### カーネルサポートを確かめる

Linux KVM カーネルモジュールが有効になっていることを確認します。 `/proc/config.gz` または `lsmod` から確かめます。

```shell-session:config.gz
$ zgrep -E "KVM|VIRTUALIZATION" /proc/config.gz
CONFIG_KVM_GUEST=y
CONFIG_HAVE_KVM=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_IRQ_ROUTING=y
CONFIG_HAVE_KVM_EVENTFD=y
CONFIG_KVM_APIC_ARCHITECTURE=y
CONFIG_KVM_MMIO=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_HAVE_KVM_MSI=y
CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=m
CONFIG_KVM_INTEL=m
CONFIG_KVM_AMD=m
CONFIG_KVM_MMU_AUDIT=y
CONFIG_KVM_DEVICE_ASSIGNMENT=y
```

```shell-session:lsmod
$ lsmod | grep kvm
kvm_amd                52151  0
kvm                   376394  1 kvm_amd
```
　また、ユーザは `/dev/kvm` へアクセスできる権限が必要です。Arch Linux では kvm グループが用意されているので、ハイパーバイザを利用するユーザをこのグループに追加します。

```shell-session:gpasswd
$ sudo gpasswd -a $(whoami) kvm
```

## 2. ゲストOSを構築する

### 仮想ディスクイメージを作る

　`qemu-img` をつかって、ゲストOS のディスクイメージを作ります。 オプションとして、ディスクイメージのファイル形式、ファイル名、サイズを指定します。 `qcow2` は QEMU でつかわれるイメージファイル形式です。

```shell-session:qemu-img
$ qemu-img create -f qcow2 ~/Workspace/CentOS-6.4-x86_64-netinstall.qcow2 8G
Formatting '/home/guest/Workspace/CentOS-6.4-x86_64-netinstall.qcow2', fmt=qcow2 size=8589934592 encryption=off cluster_size=65536 lazy_refcounts=off
```

### ゲストOSをインストールする

　ゲストOSをインストールするために `qemu-system-<architecture>` をつかって仮想マシンを起動します。 このときのオプションには、OSインストールの方法にしたがって適当なオプションを付ける必要があります。 インストールメディアを `CentOS-6.4-x86_64-netinstall.iso` として、光学ドライブから起動させる場合は `-boot order=d` と `-cdrom <file>` のオプションを付けます。

```shell-session:qemu-system-x86_64
$ qemu-system-x86_64 \
-enable-kvm \
-m 512 \
-boot order=d \
-cdrom ~/Downloads/CentOS-6.4-x86_64-netinstall.iso \
~/Workspace/CentOS-6.4-x86_64-netinstall.qcow2
```

![installing-centos-6-4-as-a-guest-os.png](https://qiita-image-store.s3.amazonaws.com/0/58/9f23bd51-6f19-c94b-d070-7588c2650488.png)

- `failed to initialize KVM: Device or resource busy` とでて先にすすめない場合は、ホスト側で別のハイパーバイザが起動していないか確認してください
- ゲスト側で `Trying to unpack rootfs image as initramfs` とでるところで起動がとまってしまう場合は、ゲストOSに必要なメモリが足りていないようです。 QEMUの `-m` オプションの値を引き上げて試してみてください。

　インストール後はインストールメディアのオプションを外して仮想マシンを起動します。

```shell-session:qemu-system-x86_64
$ qemu-system-x86_64 \
-enable-kvm \
-m 512 \
~/Workspace/CentOS-6.4-x86_64-netinstall.qcow2
```

![booting-guest-os.png](https://qiita-image-store.s3.amazonaws.com/0/58/d7ddcc84-9ff0-0f26-2a80-f7381a6f1cb1.png)

## 参考

- [QEMU](https://wiki.qemu.org/Main_Page)
- [The QCOW2 Image Format](https://people.gnome.org/~markmc/qcow-image-format.html)