qemu仮想マシンで解像度を設定できないという問題を解決する
4132 ワード
質問説明:仮想マシンで解像度の変更テストを行い、win 7でokの設定をテストしました.Centos 7、Ubuntu 16にある.04、Ubuntu18.04のテストはすべてできません.
システムで解像度を設定してもwin 7だけ有効で、残りは無効で、QXL駆動の問題だと疑っています.
問題の調査分析は以下の通りである.
Jul 2 15:22:28 Ubuntu 1604 kernel:[6288.266180]qxl 0000:00:02.0:object_init failed for (4104192, 0x00000002) Jul 2 15:22:28 Ubuntu1604 kernel: [ 6288.266190] [drm:qxl_gem_object_create [qxl]] ERROR Failed to allocate GEM object (4101120, 2, 4096, -12) Jul 2 15:22:28 Ubuntu1604 kernel: [ 6288.266194] [drm:qxl_alloc_surf_ioctl [qxl]] ERROR qxl_alloc_surf_ioctl: failed to create gem ret=-12
まずLinuxの解像度設定の実行フローを分析する:1)xorgはpciグラフィックスカードを自動的に認識し、対応する駆動xorg-serverを使用してまずこのpciデバイスのvendor_を取得するidは、その後、0 x 1 b 36の値でqxlグラフィックスデバイスと判断し、/usr/lib/xorg/modules/driverでデバイスのアプリケーション層駆動を探し、qxlアプリケーション層駆動名qxl_drv.so.
2)xorgでの解像度設定実行フロー
Created with Rapha澫l 2.2.0解像度drmmode_を設定xf86crtc_resize(すべてのライブラリに同じエントリがあります)
3)xf 86-qxlでの解像度設定実行フロー
Created with Raphaël 2.2.0 drmmode_xf86crtc_resize create_primary qxl_bo_create_primary drmIoctl(DRM_IOCTL_QXL_ALLOC_SURF) libdrmでの解像度設定実行フロー Created with Raphaël 2.2.0 DRM_IOCTL(DRM_IOCTL_QXL_ALLOC_SURF) ioctl(DRM_IOCTL_QXL_ALLOC_SURF) kernelでの解像度設定実行フロー Created with Raphaël 2.2.0 qxl_alloc_surf_ioctl qxl_gem_object_create_with_handle qxl_gem_object_create qxl_bo_create ttm_bo_init
主なエラーポイントはttm_bo_initのdrm_vma_offset_add、割り当てsizeはdrmmode_xf86crtc_resizeは、主にアプリケーション層とカーネルが共有するfamebufferのメモリ領域に使用され、xorgが画像を格納し、カーネルが読み取るために使用されるメモリ領域を決定し、転送する.計算式は、size=(width*cpp+1)*heightのcpp=(scrn->bitsPerPixel+7)/8のうちbppは一般的に32であり、この記憶領域を割り当てたときに前の記憶領域が破棄されていないため、実際のサイズは1920と大まかに計算される× 4 × 1080=8 Mは、framebufferのためにカーネルに約8 Mの共有空間を割り当てるべきである.
実際に割り当てられるメモリの上限は、初期化関数ttm_から来ている.bo_init_mmにおける表示メモリの設定については、以下の呼び出し関数を参照してください:ttm_bo_init_mm(&qdev->mman.bdev, TTM_PL_VRAM, num_io_pages); 初期化の最大値はnum_に依存しますio_pages、この値は以下の計算によってvram_を得ることができる.size: vram_size = num_io_pages * PAGE_SIZE/(1024*1024)値vram_sizeはqemu-system-x 86_に由来する64実行で使用されるパラメータvram_size=8388608であり、このパラメータはovirtによってプログラムに固定される.
クライアントで実行:
fc 00000のvram_が表示されます.sizeは8 Mで、前に計算したnew_に基づいてframebuffer + old_framebufferのサイズ8 M+n>vram_sizeのため、framebufferの割り当てに失敗したため、解像度設定に失敗しました.
データベースの更新コマンド:update vmDeviceSET vmDevice=「{"specParams":{"vgamem":"65536","heads":"1","vram":"65536","ram":"65536"},"type":"video","device":"qxl","deviceId":"026 af 321-efc 4-4859-9 c 13-5 fcffd 3 f 9 c 06"}」where vmDevice=「{ specParamammDevice=「{specParamamammDeviceSET vmDeviceSET vmDeviceSET vmDevice SET vmDevice=「{"specParammDes"{"vgamem":"16384","heads":"1","vram":"8192","ram":“65536”},“type”:“video”,“device”:“qxl”,“deviceId”:“026af321-efc4-4859-9c13-5fcffd3f9c06”}";
仮想マシンをシャットダウン、再起動し、次のようにします.
テスト結果:vram_sizeサイズは64 Mに増大し、ubuntu 16で実測された.04, ubuntu18.04,Centos 7で設定した解像度はすべて正常です.
システムで解像度を設定してもwin 7だけ有効で、残りは無効で、QXL駆動の問題だと疑っています.
問題の調査分析は以下の通りである.
Jul 2 15:22:28 Ubuntu 1604 kernel:[6288.266180]qxl 0000:00:02.0:object_init failed for (4104192, 0x00000002) Jul 2 15:22:28 Ubuntu1604 kernel: [ 6288.266190] [drm:qxl_gem_object_create [qxl]] ERROR Failed to allocate GEM object (4101120, 2, 4096, -12) Jul 2 15:22:28 Ubuntu1604 kernel: [ 6288.266194] [drm:qxl_alloc_surf_ioctl [qxl]] ERROR qxl_alloc_surf_ioctl: failed to create gem ret=-12
まずLinuxの解像度設定の実行フローを分析する:1)xorgはpciグラフィックスカードを自動的に認識し、対応する駆動xorg-serverを使用してまずこのpciデバイスのvendor_を取得するidは、その後、0 x 1 b 36の値でqxlグラフィックスデバイスと判断し、/usr/lib/xorg/modules/driverでデバイスのアプリケーション層駆動を探し、qxlアプリケーション層駆動名qxl_drv.so.
2)xorgでの解像度設定実行フロー
Created with Rapha澫l 2.2.0解像度drmmode_を設定xf86crtc_resize(すべてのライブラリに同じエントリがあります)
3)xf 86-qxlでの解像度設定実行フロー
Created with Raphaël 2.2.0 drmmode_xf86crtc_resize create_primary qxl_bo_create_primary drmIoctl(DRM_IOCTL_QXL_ALLOC_SURF)
主なエラーポイントはttm_bo_initのdrm_vma_offset_add、割り当てsizeはdrmmode_xf86crtc_resizeは、主にアプリケーション層とカーネルが共有するfamebufferのメモリ領域に使用され、xorgが画像を格納し、カーネルが読み取るために使用されるメモリ領域を決定し、転送する.計算式は、size=(width*cpp+1)*heightのcpp=(scrn->bitsPerPixel+7)/8のうちbppは一般的に32であり、この記憶領域を割り当てたときに前の記憶領域が破棄されていないため、実際のサイズは1920と大まかに計算される× 4 × 1080=8 Mは、framebufferのためにカーネルに約8 Mの共有空間を割り当てるべきである.
実際に割り当てられるメモリの上限は、初期化関数ttm_から来ている.bo_init_mmにおける表示メモリの設定については、以下の呼び出し関数を参照してください:ttm_bo_init_mm(&qdev->mman.bdev, TTM_PL_VRAM, num_io_pages); 初期化の最大値はnum_に依存しますio_pages、この値は以下の計算によってvram_を得ることができる.size: vram_size = num_io_pages * PAGE_SIZE/(1024*1024)値vram_sizeはqemu-system-x 86_に由来する64実行で使用されるパラメータvram_size=8388608であり、このパラメータはovirtによってプログラムに固定される.
クライアントで実行:
$ lspci -v -s 00:02.0
00:02.0 VGA compatible controller: Red Hat, Inc. QXL paravirtual graphic card (rev 04) (prog-if 00 [VGA controller])
Subsystem: Red Hat, Inc QEMU Virtual Machine
Flags: fast devsel, IRQ 10
Memory at f8000000 (32-bit, non-prefetchable) [size=64M]
Memory at fc000000 (32-bit, non-prefetchable) [size=8M]
Memory at fc850000 (32-bit, non-prefetchable) [size=8K]
I/O ports at c040 [size=32]
Expansion ROM at fc840000 [disabled] [size=64K]
Kernel driver in use: qxl
Kernel modules: qxl
fc 00000のvram_が表示されます.sizeは8 Mで、前に計算したnew_に基づいてframebuffer + old_framebufferのサイズ8 M+n>vram_sizeのため、framebufferの割り当てに失敗したため、解像度設定に失敗しました.
データベースの更新コマンド:update vmDeviceSET vmDevice=「{"specParams":{"vgamem":"65536","heads":"1","vram":"65536","ram":"65536"},"type":"video","device":"qxl","deviceId":"026 af 321-efc 4-4859-9 c 13-5 fcffd 3 f 9 c 06"}」where vmDevice=「{ specParamammDevice=「{specParamamammDeviceSET vmDeviceSET vmDeviceSET vmDevice SET vmDevice=「{"specParammDes"{"vgamem":"16384","heads":"1","vram":"8192","ram":“65536”},“type”:“video”,“device”:“qxl”,“deviceId”:“026af321-efc4-4859-9c13-5fcffd3f9c06”}";
仮想マシンをシャットダウン、再起動し、次のようにします.
$ lspci -v -s 00:02.0
00:02.0 VGA compatible controller: Red Hat, Inc. QXL paravirtual graphic card (rev 04) (prog-if 00 [VGA controller])
Subsystem: Red Hat, Inc QEMU Virtual Machine
Flags: fast devsel, IRQ 10
Memory at f0000000 (32-bit, non-prefetchable) [size=128M]
Memory at f8000000 (32-bit, non-prefetchable) [size=64M]
Memory at fc050000 (32-bit, non-prefetchable) [size=8K]
I/O ports at c040 [size=32]
Expansion ROM at fc040000 [disabled] [size=64K]
Kernel driver in use: qxl
Kernel modules: qxl
テスト結果:vram_sizeサイズは64 Mに増大し、ubuntu 16で実測された.04, ubuntu18.04,Centos 7で設定した解像度はすべて正常です.