Windows Server 2003 のサーバを Xen に P2V した後 KVM に P2V し直した話

# 概要

de:codeやAWS Summitなどで最新技術が華やかに発表されている昨今、今更 Windows Server 2003 とかいう、Microsoftさんもサポート終了して久しいOSで動いているサーバをP2Vする哀しいお仕事をし、哀しい目に何度か遭ったのでノウハウを書き留めておきます。

# 結論

以下の点を守れば簡単です。

* 起動時にIDEドライバを読み込むようにする。(`mergeide`でググる)
* V2Vをしない。
* KVMを使う。(Xenは使わない)

# 今回作業を行った環境

* P2Vする対象ホスト: 1Uラックマウントサーバ、Windows Server 2003 (x86)
* P2V先ホスト: Ubuntu Linux 18.04、KVM、headlessなサーバ

# 移行手順

## 起動時にIDEドライバを読み込むようにする

これをやらないと、Windows起動時にストレージが見つからず、BSoD `STOP 0x0000007B` が出る。

### `C:\Windows\system32\drivers\` にドライバファイルを置く

`atapi.sys`, `intelide.sys`, `pciide.sys`, `pciidex.sys` が必要。

無ければ `C:\Windows\Driver Cache\I386\Driver.cab` からコピーする…と書いてある記事も見たけど、今回はそのファイルが無かったのでインストールCDから取り出した。

インストールCDに入ってるファイル名は拡張子が .SY_ になっているが、これは .cab ファイルなので、名前を変更してエクスプローラーで開けば中に .sys ファイルが入っている。

### レジストリを変更する

以下のような内容で `*.reg` というテキストファイルを作り、実行する。(本当はこんなにたくさんエントリ必要ない気がするけど検証はしていない)

ググって探すとISOイメージやFDイメージを作ってくれてる人もいたりするので、それらを使っても良いかも知れない(自己責任で)。

```mergeide.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\primary_ide_channel]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\secondary_ide_channel]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\*pnp0600]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\*azt0502]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\gendisk]
"ClassGUID"="{4D36E967-E325-11CE-BFC1-08002BE10318}"
"Service"="disk"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#cc_0101]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_0e11&dev_ae33]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1039&dev_0601]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1039&dev_5513]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1042&dev_1000]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_105a&dev_4d33]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0640]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0646]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0646&REV_05]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0646&REV_07]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0648]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0649]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1097&dev_0038]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_10ad&dev_0001]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_10ad&dev_0150]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_10b9&dev_5215]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_10b9&dev_5219]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_10b9&dev_5229]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1106&dev_0571]
"Service"="pciide"
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_1222]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_1230]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_2411]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_2421]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7010]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7111]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7199]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"

;Add driver for Atapi (requires Atapi.sys in Drivers directory)

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\atapi]
"ErrorControl"=dword:00000001
"Group"="SCSI miniport"
"Start"=dword:00000000
"Tag"=dword:00000019
"Type"=dword:00000001
"DisplayName"="Standard IDE/ESDI Hard Disk Controller"
"ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
  52,00,49,00,56,00,45,00,52,00,53,00,5c,00,61,00,74,00,61,00,70,00,69,00,2e,\
  00,73,00,79,00,73,00,00,00

;Add driver for intelide (requires intelide.sys in drivers directory)

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\IntelIde]
"ErrorControl"=dword:00000001
"Group"="System Bus Extender"
"Start"=dword:00000000
"Tag"=dword:00000004
"Type"=dword:00000001
"ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
  52,00,49,00,56,00,45,00,52,00,53,00,5c,00,69,00,6e,00,74,00,65,00,6c,00,69,\
  00,64,00,65,00,2e,00,73,00,79,00,73,00,00,00


;Add driver for Pciide (requires Pciide.sys and Pciidex.sys in Drivers directory)

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\PCIIde]
"ErrorControl"=dword:00000001
"Group"="System Bus Extender"
"Start"=dword:00000000
"Tag"=dword:00000003
"Type"=dword:00000001
"ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
  52,00,49,00,56,00,45,00,52,00,53,00,5c,00,70,00,63,00,69,00,69,00,64,00,65,\
  00,2e,00,73,00,79,00,73,00,00,00
```

## 物理ストレージをディスクイメージに変換する

今回は以下の方法を使った。

1. vCenter Converter Standalone 6.2.0.1 を使用して 物理HDD → vmdk
2. qemu-img convert を使用して vmdk → raw

Disk2vhd や dd なんかを使っても良いと思う。

## Xen PV driver を使おうとしてつらくなった

Xen の最新 [PV driver](https://www.xenproject.org/developers/teams/windows-pv-drivers.html) は結局インストールできなかった。もうXenなんてXen Xen使われてないのかな。知らんけど。

Xen GPL PV Driver (開発が止まってるぽい)というのを2014年にダウンロードしていたのでそれを使ってみたが、ネットワークのアップロードが異常に遅い(140Kbpsくらいしか出ない)という問題が発生した。この問題については、ドライバのプロパティで `Large send offload` を `Disable` にすれば回避できることがわかったが、うーん…あんまり使いたくないという気持ちになった。

## Xen から KVM への V2V

もう誰も使ってないXenを捨てて、結構使われていると思われるKVMを使うことにしたが、V2Vをやろうとしてハマった。mergeide をやっても `STOP 0x0000007B` が出る。Xen GPL PV Driver をきれいさっぱり消せれば大丈夫なんだろうけど、やり方がわからなかった(Windows難しい)。

なお、今回の環境ではZFSを使っており、P2V直後の状態でsnapshotを作っていたので、その時点のディスクイメージを簡単に戻すことができた。ZFS最高。みんなも使うといいよ。

## KVM + virtio

というわけでP2V直後の状態からやり直し。なお、ホストがXen kernelで起動している場合は通常のkernelで再起動する必要がある。

```
# ツールをインストール
$ sudo apt install libvirt-daemon-system libvirt-clients bridge-utils libvirt-bin virtinst
$ sudo adduser username libvirt-qemu

# ホスト設定を作る
$ virt-install --name hostname --ram 4096 -v --os-variant=win2k3 --vcpus 2 --disk path=/path/to/disk.img,bus=ide --cdrom=/path/to/virtio-win.iso --graphics vnc,listen=0.0.0.0

# 適当な virtio ディスクを追加する
$ dd if=/dev/zero of=/path/to/disk2.img bs=1M seek=10
$ virsh edit
## こんな感じで
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/path/to/disk2.img'/>
      <target dev='hdc' bus='virtio'/>
    </disk>

# 起動してWindowsにログオンしてvirtioドライバを入れ、終わったらシャットダウンする
$ virsh start hostname

# 適当に追加した virtio ディスクを削除し、起動ディスクをvirtioにする
$ virsh edit
## こんな感じで
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/path/to/disk.img'/>
      <target dev='hda' bus='virtio'/>
    </disk>

# 起動して使いましょう
$ virsh start
```

virtio、ちゃんと動くしI/Oも明らかに速くなって良かった。CrystalDiskMarkで雑に(buffer/cacheのクリアを考慮せずに)計測するとこうなった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/46275/714751b8-d253-9e9f-9cc2-60d6c9d8e52b.png)

これくらいの速度が出れば、P2Vするような古いサーバで困ることはなさそうだ。

# あとがき

クソレガシー環境をはやく捨てたいですね。バッドノウハウばかりが溜まっていく…