modern.ieのwindowsをqemu/libvirtで快適に使う

もちろんkvm/qemu-x86環境です。快適と言ってもその他のハイパーバイザ比ではなく、あくまでqemuで快適に使う話です。といってもすごいことをやるわけではなくvirtio有効にするぐらいです。

#インストール
##ダウンロード
普通にダウンロードします。ライセンスはよく読んでおきましょう。
https://www.modern.ie/ja-jp/virtualization-tools#downloads

VirtualBoxイメージを使います。Windows用、Linux用、Mac用がありますが、違いがよくわかりません。私の環境ではWindows用でもLinux上で動きましたが、気になる場合はLinux用を落としてください。直観に反して、STEP2まで埋めると他の環境用のイメージがダウンロードできるようになります。
![modernie.png](https://qiita-image-store.s3.amazonaws.com/0/25493/78584a90-753f-9b38-f696-eb720f9e65c5.png)

イメージはWindows7が一番です。Windows8は現時点でビデオ周りのドライバが無いため描画が遅く、Windows10に至っては「デバイスシグネチャが違う」とかなんとか言われて起動しませんでした。

##フォーマット変換
落としてきた**.zip**ファイルをunzipすると**.ova**ファイルが出てきますが、これはただのtarファイルなので、tarで解凍できます。

```shell-session
$ unzip IE10.Win7.For.Windows.VirtualBox.zip 
Archive:  IE10.Win7.For.Windows.VirtualBox.zip
  inflating: IE10 - Win7.ova 
$
$ tar xvf IE10\ -\ Win7.ova 
IE10 - Win7.ovf
IE10 - Win7-disk1.vmdk
$ 
```
設定ファイルの**.ovf**ファイルとディスクイメージの**.vmdk**ファイルが出てきました。**.vmdk**ファイルをqemu用に変換します。

```shell-session
$ qemu-img convert -f vmdk -O qcow2 IE10\ -\ Win7-disk1.vmdk -p IE10-Win7-disk1.qcow2 
    (100.00/100%)
$
```
フォーマットはもちろんqcow2じゃなくてもいいんですが、127Gのイメージなのでrawなどにはしない方がいいでしょう。あとファイル名に空白が入ってて面倒なので適当に変えます。
欲しいのはこのイメージファイルだけなので、あとは削除しても大丈夫です。あ、再インストール用に、**.vmdk**ファイルは残しておくといいと思います。この時点での**.qcow2**ファイルを残しておくとかでもいいんですが、**.vmdk**の方が圧縮されているのか、かなりコンパクトです。
**.ovf**ファイルにはxmlでVirtualBoxでのデフォルト設定が書かれていますが、特に踏襲しなければならない設定はありません。

##libvirtへの登録
突然ですが、最初にダミーの空ディスクを生成しておきます。サイズはどうでもいいです。

```shell-session
$ qemu-img create -f qcow2 dummy.qcow2 10G
Formatting 'dummy.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off 
$
```
次にlibvirtに登録します。方法はなんでもいいですが、ここでは`virt-install`を使います。

```shell-session
$ virt-install -n IE10 -r 3072 -v --vcpus sockets=1,cores=1,threads=2 --cpu host-model --machine=pc --os-type=windows --os-variant=win7 --clock offset=utc --disk bus=ide,cache=writeback,format=qcow2,path=$(pwd)/IE10-Win7-disk1.qcow2 --disk bus=virtio,cache=none,format=qcow2,path=$(pwd)/dummy.qcow2 -w bridge=veth0,model=rtl8139,mac=RANDOM --serial pty --console=pty,target_type=serial --memballoon model=virtio --graphics spice,listen=0.0.0.0 --video qxl --channel spicevmc --noautoconsole --noreboot --import
```
ここの時点で大事なポイントは次の通りです。

* 最初のWindows Update地獄を乗り切るまでは大目にリソースを振りたいので、2コア3G。（modern.ieのイメージは32ビット版で、有効なメモリは3Gまで）
* videoは`qxl`で`vnc`ではなく`spice`接続
* ダミーディスクを`virtio`バスでくっつけておく
* ネットワークデバイスモデルは`rtl8139`（次節のゲストツールをネットワーク経由で取得する場合）
* OSディスクは`cache=writeback`にしてパフォーマンスを稼ぐ

それ以外のパラメータは環境・好みの問題です。
SPICEを有効にしたので、SPICE経由で接続してください。virt-managerであれば、自動的にSPICEになります。

##Windowsセットアップ
Windowsを起動したらvirtioその他のドライバ入りゲストツールをインストールします。

* Windows guest tools
http://www.spice-space.org/download.html

VM内のIE8ぐらいだとファイルが最後までダウンロードできないことがあったので、注意してください。

インストールしていくつかのデバイスが正しく認識されたらシャットダウンしてVMの設定を変更します。
変更内容は次の通りです。

1. ダミーディスクの役目は終わったので削除します
2. ネットワークデバイスのモデルを`rtl8139`から`virtio`にします
3. OSディスクのディスクバスを`ide`から`virtio`に変更します

```
[注釈]
ダミーディスクを最初に突っ込んでいるのは、virtioドライバをセットアップするためです。（便宜上セットアップと書いていますが、Windows用語で正しくは何と言うかよくわかりません）
virtioデバイスが無い状態でvirtioドライバをインストールしても、インストールだけでセットアップはされないため、そのままではOSディスクをvirtioバスに切り替えるとブート中にディスクを見失い、ブルースクリーンになります。
最初にダミーディスクを入れなかった場合は、OSがきちんと起動する状態でvirtioドライバインストール後に、OSディスクとは別にvirtioバス上の別のディスクを一度接続してセットアップを終えてからOSディスクをvirtioに切り替える必要があります。
```
#Windows Update地獄を乗り切る
##Windowsのチューニング
Windows Updateに入る前に、Windowsの方もチューニングしておきます。
デバイスマネージャを開いて、VirtIO SCSI Diskのプロパティを開きます。

![Screenshot_IE10_devm2.png](https://qiita-image-store.s3.amazonaws.com/0/25493/a7be531a-ed8c-c74f-e189-5051f6b43235.png)

ライトキャッシュのフラッシュをoffにします。
![ss.png](https://qiita-image-store.s3.amazonaws.com/0/25493/907af744-9857-efa3-cf18-15e6cf213fc8.png)


これでWindows Update時の書き込み待ちが消え、かなり高速化されます。それでも時間がかかるのは諦めてください。
なお、ディスクキャッシュのwriteback設定とフラッシュの無効化で、この仮想マシンは物理マシンのトラブルからはほぼ無防備です。この時点でqemuやLinuxが突然死した場合は潔く最初からやり直しましょう。

##ひたすらWindows Update
 Windows Update -> 再起動 -> 更新の確認
を更新が無くなるまで繰り返します。面倒なら自動設定で放置しておけば3日後ぐらいには解決できているかもしれません。

##おわり
最後にOSディスクの`cache=writeback`設定を`cache=none`に変更して、Windowsのライトキャッシュフラッシュ設定も元に戻す、というところですが戻さなくてもどうせ90日の命なので、この時点でディスクイメージのバックアップやスナップショットを取っておいて、いざとなれば巻き戻す運用でいいと思います。