追記(注意): この件, 結局一年後にVMwareに戻すことに... VMでWindowsを使用するときの体感速度がそっちが良い.
週末, とうとうKVMに手を染めてしまった...
以前からLinuxラップトップを友とし, WinなんとかをVMware playerによる仮想マシン(VM)として(やむを得ないこと, 例えば韓国での買物とかのために)Linuxの中に飼っていたのだが, Linuxカーネルの機能として仮想化を実装したというウワサのKVMなるものが最近使いやすくなっているらしいという話を見るので, 気になっていたところ.
やったのはWebページから集めた参考情報をもとに, Ubuntu 16.04上のVMware仮想マシン(Windows 10 Home)をKVMに移行すること.
参考にしたWebページ
http://netlog.jpn.org/r271-635/2017/01/ubuntu_kvm_install.html
Tutorial: Migrate a Windows VM from vSphere to KVM
https://platform9.com/support/migrate-a-windows-vm-from-vsphere-to-kvm/
1. qemu-kvm 関連パッケージインストール
$ sudo apt-get install kvm qemu-kvm libvirt-bin virt-manager bridge-utils
2. VMware VMのWindows 10にqemu用のドライバとゲストエージェントをインストール
- VMware仮想マシンのファイルを一式バックアップ
- VMware仮想マシンを起動してVirtioドライバ(KVM用のドライバ)をインストール
Fedoraからダウンロードできる:
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/
ここからstable-virtioのISOをダウンロード, VMでマウントしてそこからインストール.
マウントしたISOにあるBalloon, NetKVM, qemupciserial, viorng, vioscsi, vioserial, viostorをWindowsのDevice managerから.
いちばん上のデバイスを選択してAction -> "Add legacy hardware", Nest -> "Install the hardware ... manually select", Next -> "Hard disk ..." -> "Browse.." -> ISOの中の該当ドライバのフォルダ内で該当するWindowsバージョンとアーキテクチャの*.infファイルを指定(例: win10, amd64), インストール.
ISOに含まれているQEMU guest agent (*.msi)もインストール.
Virtio関連のレジストリをインストール.
ここからダウンロードできる: http://migration.platform9.com.s3-us-west-1.amazonaws.com/virtio.reg
内容はこんなかんじ.
-----
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1af4&dev_1001&subsys_00000000]
"Service"="viostor"
"ClassGUID"="{4D36E97B-E325-11CE-BFC1-08002BE10318}"
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1af4&dev_1001&subsys_00020000]
"Service"="viostor"
"ClassGUID"="{4D36E97B-E325-11CE-BFC1-08002BE10318}"
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1af4&dev_1001&subsys_00021af4]
"Service"="viostor"
"ClassGUID"="{4D36E97B-E325-11CE-BFC1-08002BE10318}"
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\viostor]
"Type"=dword:00000001
"Start"=dword:00000000
"Group"="SCSI miniport"
"ErrorControl"=dword:00000001
"ImagePath"="system32\\drivers\\viostor.sys"
"Tag"=dword:00000021
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\viostor\Parameters]
"BusType"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\viostor\Parameters\MaxTransferSize]
"ParamDesc"="Maximum Transfer Size"
"type"="enum"
"default"="0"
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\viostor\Parameters\MaxTransferSize\enum]
"0"="64 KB"
"1"="128 KB"
"2"="256 KB"
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\viostor\Parameters\PnpInterface]
"5"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\viostor\Enum]
"0"="PCI\\VEN_1AF4&DEV_1001&SUBSYS_00021AF4&REV_00\\3&13c0b0c5&0&20"
"Count"=dword:00000001
"NextInstance"=dword:00000001
----------
VMにダウンロードして, regedit.exeでFile -> Importで.
- VMのWindowsでVMware Toolsをアンインストール.
アンインストール後に再起動するというかも. 再起動してシャットダウン.
3. VMの変換
VMware仮想ディスクのファイルが分割されていたので
$ qemu-img convert -p -f vmdk -O qcow2 *-s???.vmdk disk.qcow2
4. virt-managerでVMを定義
File -> "New virtual machine" -> "Import existing disk image"
Provide the existing...で /home/VM/win10.qcow2 を指定.
OS type: Windows
Version: Microsoft Windows 8.1
Memory and CPUは適当に. 4096MB, 2 core
VMに適当な名前をつけて一応完了. virt-managerのマネージャウィンドウでOpen, それでコンソールウィンドウが開きRun(再生マーク)で(うまく行っていれば)起動.
VMの定義ファイル*.xmlの位置は /etc/libvirt/qemu/...
VMの仮想ディスクは新らしく作れば /var/lib/libvirt/... にできるようだが既存のを使うときは, ある場所のまま.
コマンドラインから起動する場合は, 以下のようにできる. (VMの名前をwin10とする)
$ virsh start win10 => これでバックグラウンドで起動してる.
$ virt-viewer win10 => GUIのコンソールでVMに接続.
virt-viewerはvirt-managerのコンソールとは別のソフトらしいが, 中身(Win...)を使う分にはさして違いはない. 両方ともフルスクリーン表示/解除できるし, マウスクリックで中に入り, Ctrl+Altでマウスカーソルを解放する.
vncを使ってリモートでもできるらしい.(まあ当然) LinuxをVMにしてでサーバに使う場合はそっちの使い方が多そう.
5. ディスクをIDEからVirtIOに変更(そっちの方が速いとのこと)
VMを定義するときにDetailのタブ(View -> Detailまたは(i)のアイコン)でディスクを選択し, Advanced optionsでDisk bus: VirtIOとしてもダメ.
前にドライバはインストールしてあるが, 実際にデバイスがないと読み込まれない?
そこで, ダミーのVirtIOディスクを余分に作り(容量はわずかでよい. 例8GB), それを認識させることによりVirtIOディスクのドライバを読ませる.
WindowsのDevice managerでDiskを見るとVirtIOディスクができているはず.
そのあとでShutdown, 本体のディスクの方のAdvance optionをVirtIOに変更してから起動すると, ディスクが2つともVirtIOになっている.
ダミーの方はあとで削除.
virt-managerによるVMの各種設定はVMplayerと似ている.
ちなみに, ビデオドライバは速いと言われるQXLに最初からなってた.
6. VMのネットワーク設定
VMのネットワークはNAT (ホスト側でみるとvirbr0 192.168.122...というのができていた.). Linuxホスト側にSambaでアクセスできるようにしている.
KVMの仮想ネットワークのIPに対してアクセスを許可するようにsambaの設定を変更.
これでホストとのファイル転送もOK.
VMwareではシェアフォルダとかいうのがあってネットワークで共有しなくてもホストとファイル転送ができる仕掛けがあったが, 結局ネットワークでSambaでやるほうが便利なのでVMwareでもそうしていた. Linuxのシンボリックリンクを切らないで見せてくれるから(最近のSambaはそうしない設定がデフォルトの場合もあるが).
7. 仮想ディスクのコンパクト化(今後の運用のため)
VMの仮想ディスクは例えばサイズ100GBと指定して作成しても最初から100GBのスペースを食うわけではなく, 中身のデータが増えるに連れてサイズが大きくなる. しかし, 中身のデータを削除しても仮想ディスクファイルサイズは減らない. 開放されたスペースをファイルからすぐには削除しないから.
VMware playerではVirtual machine settingsのHardwareタブでHard diskに対して"Compact"をやると使ってないスペースを解放して仮想ディスクファイルを小さくできる. KVMではvirt-managerにはこういうのが見当たらないが, ディスクの変換ツールでできるらしい.
$ mv disk.qcow2 disk-org.qcow2
$ qemu-img convert -O qcow2 disk-org.qcow2 disk.qcow2
同じqcow2フォーマットの新しいディスクに変換すると不使用スペースを除外して小さくなる, とのこと. (バックアップはとりましょう)
8. Windowsの中の諸事情
KVMに引っ越し完了すると, Windowsにインストールされたアプリケーションたちはハードウェアが変更されたと認識して再度ライセンスの認証せよと言ってくることがある.
ライセンスによりインストールできるPCの台数を超えていると認証ができない. もとのVMでアンインストールをして, MSのサポートに連絡したら認証できるようにしてくれるという話...
おわりに: VMwareと比べて
KVMという仮想化ソフトがLinuxカーネルの機能としてできたという話は何年も前からちらほらと聞いていたが, VMware player (個人利用は無料)でとりあえず何とかなるのと, KVMを実際に使うのがちょっとややこしそうなので今まで手を出していなかった.
ところがふと思い立って調べてみると, ここ数年で関連するブログ記事などがWeb上に増え, Ubuntuなどでも簡単にKVMがインストールできるようになっていた.
仮想マシンを作ったり, VMwareから変換して持ってきたりするためのツールである virt-manager も便利になって使い勝手はVMwareとさして変わらない.
ゲストマシンにKVM用のドライバを入れたりするところはVMwareより多少面倒だが, ブログ記事などの資料を参考にしてやればそれほど難しくはない.
ソフトのインストール容量を比べると, qemu-kvmと関連するツール類で約40MB, VMware-playerは100MBくらい.
仮想マシンの速さは変わらない気がする.
VMwareを使ってたときはWinなんとかが何もしないときにCPUを100%食ってファンが回り出すことがあったが, そういう怪しいのが無くなったかも...
KVMはWindowsをバックグラウンドで起動しておいてGUIコンソールに接続するとか切り離すとか融通が効く.
唯一の問題は(当たり前だけど)Linuxだけだということ? Windowsでは他のもの(VMwareかHyper-V?)を使わなければいけない?
Hyper-VはWindowsの仮想化機能でWebの解説記事もあるようだが, Windows 10 Proとか以上が必要でHomeでは使えないらしい. 職場などでまだ多いWindows 7 Proもダメ.
ということで, LinuxでKVMで仮想マシンというのが安く(ライセンス問題なく)高機能で使い勝手もよく, めでたし, ということのようだ.
LinuxでVMware playerをずっと使っている人はそろそろKVMの考え時, ということかも.
--- 追記 9/19 ---
キー入力遅い?
KVMにしてから仮想マシン内のキータイプが少しだけ遅い気がする. ブラインドで打ってるぶんにはちゃんと入っているが表示を見てるとフィードバックにズレがあるのが...グラフィクスは問題ではなくキーだけが問題.
http://mynixworld.info/2015/03/04/fix-keyboard-delay-kvm-windows-guest/
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters
PollStatusIterations REG_DWORD 0x00000001 (1)
https://serverfault.com/questions/624690/windows-guest-on-kvm-qemu-suffers-horrible-key-lag
"If this value is already in the Registry, disable the key by renaming it to xxPollStatusIterations (right-click, Rename). Reboot and test."
ていうのもある.
=> あまり大きな違いはないような, やや速くなった? まあいいや, という程度.
Spicy viewer
VMの設定を見ると, Spice Displayというのがある. Spiceというのを使った接続ができるということらしい. Spiceについてはグラフィックが速いとかUSBの転送ができるとかいい話が多い. そのviewerというのはspicyというプログラムらしい.
$ sudo apt install spice-client-gtk
$ spicy -h win10
spiceはポートNo.で識別するらしく, まずポートNo.が表示され, 選択してConnect.
Full screen Shift F11, Release Shift F12 で他のとちょっと違う.
メニュー Option -> "Auto redirect newly plugged in USB..." にチェック.
これでUSBを挿したら認識.
Spicyというviewer自体はグラフィックが遅い気がする.(ワードやAdobeのスクロールがちらつく) 普通は上に述べたvirt-viewerで良さそう.
--- 追記 9/21 ---
Copy & Paste --- SPICE again
ゲスト−ホスト間でcopy & pasteができないことに気づく. SPICEがあればできるらしい. ゲスト側にSPICE guest toolなるものが必要とのこと.
https://www.spice-space.org/download/windows/spice-guest-tools/spice-guest-tools-latest.exe
ダウンロードが遅く途中で落ちること数回, なんとか完了. ゲストのWin10にインストール. 一件落着.
=> copy & paste (clipboard共有), USBの接続もできるようになった!
virt-viewer はSPICEなビューアだった.
Win10ゲストにspice-guest-tool (latestが必要, 0.74だとWin10ではイントールできないみたい)を入れるとSPICEの機能がフルに使える.
Linux ホスト側では spice-vdagent, spice-client-gtk, libspice-client-gtk は不要.
まとめると:
結局SPICEのご利益は
必要なのはゲスト(Windows)にspice-guest-tools-latestをインストール.
virt-viewerでSPICEの機能は使える.
--- 追記 9/30 ---
KVMにしてLinuxでの生活は良くなった気がする(VM起動が速く以前ほど億劫でない)が, ひとつだけできなくなったことがある. 同じVMを他のPC(Windows)で使うこと. 何かの事情でLinux/KVMが使えないときに他のところでVMを動かしたいとき...KVMにしちゃったからLinux環境がないとダメ. 見回すとLinuxはこの目の前のやつの他にはWindows上のVMしか見当たらなかったりする...
その点, VMwareの場合はLinuxでもWindowsでもplayerがフリーで使えるからVMを起動できる環境はそこらじゅうにある.
簡単にどこでも使えて速いことがVMwareの強さであることに今更ながら気づく.
--- 追記10/14 ---
virsh vcpuinfo <VM> : 仮想CPUの情報確認.
virsh schedinfo <VM> : 仮想CPUの処理時間割当.
virsh domiftune <VM> : ネットワークトラフィックの制限.
--live をつけると今走ってるVMに適用され, --configをつけると/etc/libvirt/qemu/以下にある設定ファイル(*.xml)に書き込まれるみたい.
CPUの時間割当:
Virtual CPUが2個になってるので, 2個で1個100%分の占有時間に. (50ms中, 2個で50ms)
$ virsh schedinfo win10 --set vcpu_period=50000 vcpu_quota=50000 --config --live
ネットワークトラフィックの設定を調べるのは,
$ virsh domiftune win10 vnet0
ここMACアドレスではなく"vnet0"などで見られるみたい.
inbound (入力)のaverage(kB/s),peak (kB/s),burst(kB)を指定する. 一時的にpeakまで許可するが, その状態で合計burstまで流れると長期的な制限であるaverageまで落とすということらしい.
$ virsh domiftune win10 xx:xx:xx:xx:xx:xx --inbound '1024,4096,20480' --config --live
とやってみる.
MACアドレスは, Linuxホストでifconfigででてくるvnet0のMACアドレスではなく, WIndowsの中でipconfig /allで見えるPhysical addressを指定しないといけないみたい. (微妙に違う) Linuxの方で見えるのでやると
error: Unable to set interface parameters
error: invalid argument: Can't find device ......
と怒られる.
Linux側でVMのMACアドレスを見られるツールがあるみたい. (pythonスクリプト)
GitHub - enakai00/tapinfo: List tap device and bridge information for running KVM VMs.
$ tapinfo.py
Domain Tap MAC Address Network Bridge
------------------------------------------------------------------------------
win10 vnet0 52:xx:xx:xx:xx:xx default virbr0
$ ifconfig こっちだと
....
vnet0 Link encap:Ethernet HWaddr fe:xx:xx:xx:xx:xx
inet6 addr: ...... Scope:Link
....
頭のとこだけ違う.