2017/01/30

iGVT-g(XenGT/KVMGT) 構築 パート1

Intel® Graphics Virtualization Technology (Intel® GVT)

これを簡単に言うと、Xen/KVMのゲストで1つの物理GPUをシェアする技術のこと。
普通のゲスト端末では通常FBやグラフィックスドライバは仮想なので物理GPUは利用できない。パススルーすれば1つのゲストのみ使用できる。
このiGVT-gは、その中間的な位置づけで、複数のゲストで物理GPUを共有できる。

自分がやりたかったことに近いと思い、今回頑張って動かしてみることにした。
以下、色々やってみたときの流れをまとめたもの。

これを使うためには普通のXen/KVMではだめで、専用のカーネルとQEmuが必要。それらを簡単にインストールすることが出来るISOファイルが提供されている。

ISOファイル
のDownload LinkからISOファイルをダウンロード
この記事を書いている時には、これが一番最新だった。

KVMGT ENVIRONMENT SETUP GUIDE BY USING GVT-G INSTALLATION ISO にWindowsでUSBFlashMemoryに焼く方法が書いてある。

LinuxのCUIで焼くには
# umount /dev/sdX
# dd if=/path/to/ubuntu.iso of=/dev/sdX bs=4M && sync
な感じで。

このISOは、インストールせずにXenGT/KVMGTを体験できるようになっている。そっちを選ぶと、Launch Guestアイコンが
デスクトップに置かれていて、クリックするだけで物理GPUイネーブルなguestVMが1つ起動できる。しかしここでは、体験ではなくInstallしてVGTイネーブルなゲストを自分で作るところまでやってみる。

ルート権限での操作ばかりなので
$ sudo su -
してから色々やる。

Install
USB Flashで起動してInstallを選んで進める。後で面倒になるのでLVMを選ぶ。
再起動。ほっておくとKVTGTが起動する。

とりあえず
# apt update
# apt install emacs
# apt upgrade -y

ネットワーク
# apt install bridge_utils すでに入っているが一応。
# emacs /etc/network/interface
auto xenbr0 enp0s31f6
iface enp0s31f6 inet manual
iface xenbr0 inet dhcp
bridge_ports enp0s31f6

付属品 全部コピー
# cp /media/ubuntu/Intel ¥GVT-g/guest.qcow2 .
# cp /usr/share/script/* .
# cp XenGT_boot.hvm guest.hvm
# emacs guest.hvm
--- XenGT_boot.hvm 2017-01-14 01:37:42.690241567 +0900
+++ guest.hvm 2017-01-14 01:40:02.713018599 +0900
@@ -1,11 +1,11 @@
-kernel="hvmloader"
+#kernel="hvmloader"
 builder='hvm'

 vcpu = 2

 memory = 1024
 name = "Guest"
-#vif = [ 'type=ioemu,mac=00:23:F7:34:69:9D,bridge=xenbr0,model=e1000' ]
+vif = [ 'type=ioemu,mac=00:23:F7:34:69:9D,bridge=xenbr0,model=e1000' ]
 disk=[ '/root/guest.qcow2, qcow2,hda,rw' ]
 device_model_version='qemu-xen'
 device_model_override='/usr/lib/xen/bin/qemu-system-i386'

KVMGTはひとまず置いておいて、ここではXenGTを使うことを前提に進める

XenGT Grub setup
# emacs /etc/grub.d/20_linux_xen
--- 20_linux_xen~ 2017-08-26 03:31:40.000000000 +0900
+++ 20_linux_xen 2017-01-14 10:10:50.086070770 +0900
@@ -132,7 +132,7 @@ linux_entry ()
  fi
  multiboot ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts}
  echo '$(echo "$lmessage" | grub_quote)'
- module ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args} i915.hvm_boot_foreground=1 i915.vgt=1
+ module ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args}
 EOF
  if test -n "${initrd}" ; then
  # TRANSLATORS: ramdisk isn't identifier. Should be translated.

# emacs /etc/default/grub
GRUB_DEFAULT="Advanced options for XenGT>0>XenGT, with Linux 4.3.0-rc6-vgt+"
GRUB_CMDLINE_XEN="dom0_mem=2048M loglvl=all guest_loglvl=all conring_size=4M noreboot"
GRUB_CMDLINE_LINUX="rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM ignore_loglevel console=tty0 console=hvc0 consoleblank=0 log_buf_len=4M i915.hvm_boot_foreground=1 i915.enable_cmd_parser=0"
apt upgradeで Grubメニュートップが Genericカーネルになってしまったので、GRUB_DEFAULTが複雑なことに。。
参考ページGrub2/Submenus

# update-grub
# reboot

その後はリモート操作で(自分はそうしたけど、直接デスクトップ操作でもかまわない。というかそのほうが普通)
# apt install x11vnc
# emacs .x11vncrc
#usepw # 最初はpw設定になるので、'o'オプションはコメントした方が良い
o x11vnc.log
nonc
shared
noxrecord
noxdamage
noxfixes
norc
xkb
repeat
scr_keyrepeat 4-10
x11vnc起動
# x11vnc -auth guess -display :0
リモートからVNCでつなぐ。TurboVNCがお勧め。

付属guest boot up
# xl cr guest.hvm
user: intel
pw: 123456

qemu console window内にマウスカーソルを入れておく。
ディスプレイがguestデスクトップに自動で切り替わる。demoを動かす程度は楽しめる。
どういうわけかnetworkがダメだ。
# xl destroy Guest

Guest作成
お気に入りの download Xenial netbook isoを使う。
# qemu-img-xen create -f qcow2 install.qcow2 30G
# cp guest.hvm install.hvm
# emacs install.hvm
--- guest.hvm 2017-01-14 01:40:02.713018599 +0900
+++ install.hvm 2017-01-14 11:19:03.538116270 +0900
@@ -3,10 +3,10 @@ builder='hvm'

 vcpu = 2

-memory = 1024
-name = "Guest"
-vif = [ 'type=ioemu,mac=00:23:F7:34:69:9D,bridge=xenbr0,model=e1000' ]
-disk=[ '/root/guest.qcow2, qcow2,hda,rw' ]
+memory = 2048
+name = "install"
+vif = [ 'type=ioemu,bridge=xenbr0,model=e1000' ]
+disk=[ '/root/install.qcow2, qcow2,hda,rw','file:/root/mini.iso,hdc,cdrom,r' ]
 device_model_version='qemu-xen'
 device_model_override='/usr/lib/xen/bin/qemu-system-i386'
 boot="dc"
ゲスト起動
# xl cr install.hvm
いつものCUIベースのインストーラ。Desktopが各種選べる。今回は'gnome desktop + OppenSSH'で。

リブードするけど一度落とす。
# xl destroy install

GuestへvGTカーネル インストール
一応、セットアップガイドに記述されている方法を書いておく。
パート2ではもっと簡単な方法で入れる方法を考えよう。

## Mount
modprobe nbd
qemu-nbd -c /dev/nbd0 $1
kpartx -av /dev/nbd0
mount /dev/mapper/nbd0p1 /mnt

## Install
cp /boot/initrd.img-4.3.0-rc6-vgt+ /mnt/boot
cp /boot/vmlinuz-4.3.0-rc6-vgt+ /mnt/boot
cp -r /lib/modules/4.3.0-rc6-vgt+ /mnt/lib/modules
cp /etc/udev/rules.d/vgt.rules /mnt/etc/udev/rules.d

## grub.cfg編集
# chmod 644 /mnt/boot/grub/grub.cfg
# emacs /mnt/boot/grub/grub.cfg
diff -up /mnt/boot/grub/grub.cfg~ /mnt/boot/grub/grub.cfg
--- /mnt/boot/grub/grub.cfg~ 2017-01-17 22:39:41.132555000 +0900
+++ /mnt/boot/grub/grub.cfg 2017-01-17 22:48:53.006084554 +0900
@@ -140,8 +140,8 @@ menuentry 'Ubuntu' --class ubuntu --clas
  else
  search --no-floppy --fs-uuid --set=root c6047092-6039-4614-a5b2-b708a39d7636
  fi
- linux /boot/vmlinuz-4.4.0-59-generic root=UUID=c6047092-6039-4614-a5b2-b708a39d7636 ro splash quiet $vt_handoff
- initrd /boot/initrd.img-4.4.0-59-generic
+ linux /boot/vmlinuz-4.3.0-rc6-vgt+ root=UUID=c6047092-6039-4614-a5b2-b708a39d7636 ro splash quiet $vt_handoff
+ initrd /boot/initrd.img-4.3.0-rc6-vgt+
 }
 submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-c6047092-6039-4614-a5b2-b708a39d7636' {
  menuentry 'Ubuntu, with Linux 4.4.0-59-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-59-generic-advanced-c6047092-6039-4614-a5b2-b708a39d7636' {
Guestのブートカーネルをvgt+に直接変更する。後で色々ブート設定整えるにしても、まずはこのカーネルじゃないと動かないので。

## Unmount
umount /mnt
kpartx -d /dev/nbd0
qemu-nbd -d /dev/nbd0
rmmod nbd

起動用hvm
# rm install..qcow2 gnome.qcow2
# cp install.hvm gnome.hvm
# emacs gnome.hvm
--- install.hvm 2017-01-14 11:19:03.538116270 +0900
+++ gnome.hvm 2017-01-14 11:34:47.606061409 +0900
@@ -4,9 +4,10 @@ builder='hvm'
 vcpu = 2

 memory = 2048
-name = "install"
-vif = [ 'type=ioemu,bridge=xenbr0,model=e1000' ]
-disk=[ '/root/install.qcow2, qcow2,hda,rw','file:/root/mini.iso,hdc,cdrom,r' ]
+name = "gnome"
+#vif = [ 'type=ioemu,bridge=xenbr0,model=e1000' ]
+vif = [ '' ]
+disk=[ '/root/gnome.qcow2, qcow2,hda,rw' ]
 device_model_version='qemu-xen'
 device_model_override='/usr/lib/xen/bin/qemu-system-i386'
 boot="dc"
@@ -23,4 +24,4 @@ vgt=1
 vgt_low_gm_sz=128
 vgt_high_gm_sz=384
 vgt_fence_sz=4
-soundhw="ac97"
+#soundhw="ac97"

ゲスト起動(vgtイネーブル)
# xl cr gnome.hvm

無事に起動しただろうか。デフォルト設定だとディスプレイがゲストに切り替わる。
x11vncを使って隣の端末からリモートで操作していると、様子がわかる。
マウスが動かないとかは、ホスト側でのqemuウインドウないにマウスカーソルが入ってないから。

起動したらゲストにログインして、まずはgrub設定だけやり直す。
# emacs /etc/default/grub
GRUB_DEFAULT='1>Ubuntu, with Linux 4.3.0-rc6-vgt+'
#GRUB_HIDDEN_TIMEOUT=0
#GRUB_HIDDEN_TIMEOUT_QUIET=true
# update-grub
これで、apt upgrade でいつの間にか新しいカーネルインストールされても大丈夫。

2個目のゲスト起動したら以下のようなエラーで起動できず・・・
libxl: error: libxl_dm.c:1914:device_model_spawn_outcome: domain 5 device model: spawn failed (rc=-3)
libxl: error: libxl_create.c:1345:domcreate_devmodel_started: device model did not start: -3
libxl: error: libxl_dm.c:2024:kill_device_model: Device Model already exited
libxl: error: libxl.c:1615:libxl__destroy_domid: non-existant domain 5
libxl: error: libxl.c:1573:domain_destroy_callback: unable to destroy guest with domid 5
libxl: error: libxl.c:1476:domain_destroy_cb: destruction of domain 5 failed
この辺は自分のマシンスペックの問題だった。次回(パート2)へ持ち越し。


次回は、ISOからのインストールではなく、カーネル、Qemuビルドするところからちゃんとやってみる。

0 件のコメント:

コメントを投稿