我在 Windows 7 和 CentOS 客户机上都使用 KVM qemu 进行 GPU 直通工作,但使用 Windows,我可以轻松地使用远程桌面 mstsc 进行 RDP,甚至运行将利用 OpenGL 加速等的 3D 加速应用程序。
我并不关心 VirtualGL 和类似的远程玩游戏技术,我只关心能够远程使用需要显卡的应用程序,所以我只希望 openGL glx 等在服务器上运行,并能够使用 nxclient(nomachine nx 或 vnc/xrdp)远程登录以远程使用这些程序,就像在 Windows 上只需通过 RDP(使用 mstsc.exe 远程桌面客户端)进入 Windows 7 客户机即可。但在 Linux 上,当我尝试运行需要 GPU 的软件时,我不断收到错误,例如找不到匹配的 glx visual、无法写入 SDL2 窗口等错误。并且 glxinfo 显示“直接渲染”:没有
因此,这在 Windows 7 客户机上再次完美运行,我将 GPU 传递到 Windows 7,我可以通过互联网将远程桌面 RDP 传递到 Windows7 客户机,并可以在 Windows7 或其他需要 GPU 的应用程序中运行 OpenGL 基准测试工具。但是,当我尝试在 Linux GUEST(centos 6.x)中执行此操作时,我也通过 GPU 传递了此操作,我收到错误,例如无法找到匹配的 glx visual。这是我的 glxinfo 和 lsmod | grep radeon 驱动程序(从 ATI 网站安装的专有驱动程序)。谢谢!
glxinfo
显示名称::50.0 显示::50 屏幕:0 直接渲染:否(如果您想找出原因,请尝试设置 LIBGL_DEBUG=verbose) 服务器 glx 供应商字符串:SGI 服务器 glx 版本字符串:1.2 服务器 glx 扩展: GLX_ARB_multisample,GLX_EXT_visual_info,GLX_EXT_visual_rating, GLX_EXT_import_context,GLX_OML_swap_method,GLX_SGI_make_current_read, GLX_SGIS_multisample,GLX_SGIX_hyperpipe,GLX_SGIX_swap_barrier, GLX_SGIX_fbconfig 客户端 glx 供应商字符串:ATI 客户端 glx 版本字符串:1.4 客户端 glx 扩展: GLX_ARB_create_context,GLX_ARB_create_context_profile, GLX_ARB_get_proc_address,GLX_ARB_multisample,GLX_EXT_import_context, GLX_EXT_swap_control,GLX_EXT_visual_info,GLX_EXT_visual_rating, GLX_MESA_allocate_memory、GLX_MESA_copy_sub_buffer、GLX_MESA_swap_control, GLX_MESA_swap_frame_usage,GLX_NV_swap_group,GLX_OML_swap_method, GLX_SGI_make_current_read、GLX_SGI_swap_control、GLX_SGI_video_sync、 GLX_SGIS_multisample,GLX_SGIX_fbconfig,GLX_SGIX_pbuffer, GLX_SGIX_swap_barrier,GLX_SGIX_swap_group,GLX_SGIX_visual_select_group, GLX_EXT_texture_from_pixmap,GLX_EXT_framebuffer_sRGB, GLX_ARB_fbconfig_float、GLX_AMD_gpu_association、GLX_EXT_buffer_age GLX 版本:1.2 GLX 扩展: GLX_ARB_get_proc_address,GLX_ARB_multisample,GLX_EXT_import_context, GLX_EXT_visual_info,GLX_EXT_visual_rating,GLX_OML_swap_method, GLX_SGI_make_current_read,GLX_SGIS_multisample,GLX_SGIX_fbconfig, GLX_SGIX_swap_barrier OpenGL 供应商字符串:Mesa 项目:www.mesa3d.org OpenGL 渲染器字符串:Mesa GLX Indirect OpenGL 版本字符串:1.2(1.5 Mesa 6.4.1) OpenGL 扩展: GL_ARB_depth_texture、GL_ARB_imaging、GL_ARB_multitexture, GL_ARB_point_parameters、GL_ARB_point_sprite、GL_ARB_shadow、 GL_ARB_shadow_ambient,GL_ARB_texture_border_clamp, GL_ARB_texture_cube_map,GL_ARB_texture_env_add, GL_ARB_texture_env_combine,GL_ARB_texture_env_crossbar, GL_ARB_texture_env_dot3, GL_ARB_texture_mirrored_repeat, GL_ARB_texture_rectangle,GL_ARB_transpose_matrix,GL_ARB_window_pos, GL_EXT_abgr,GL_EXT_bgra,GL_EXT_blend_color,GL_EXT_blend_func_separate, GL_EXT_blend_logic_op,GL_EXT_blend_minmax,GL_EXT_blend_subtract, GL_EXT_clip_volume_hint,GL_EXT_copy_texture,GL_EXT_draw_range_elements, GL_EXT_fog_coord、GL_EXT_multi_draw_arrays、GL_EXT_packed_pixels、 GL_EXT_point_parameters、GL_EXT_polygon_offset、GL_EXT_rescale_normal, GL_EXT_secondary_color,GL_EXT_separate_specular_color, GL_EXT_shadow_funcs,GL_EXT_stencil_two_side,GL_EXT_stencil_wrap, GL_EXT_子纹理,GL_EXT_纹理,GL_EXT_纹理3D, GL_EXT_texture_edge_clamp,GL_EXT_texture_env_add, GL_EXT_texture_env_combine,GL_EXT_texture_env_dot3, GL_EXT_texture_lod_bias,GL_EXT_texture_object,GL_EXT_texture_rectangle, GL_EXT_vertex_array,GL_APPLE_packed_pixels,GL_ATI_texture_env_combine3, GL_ATI_texture_mirror_once,GL_ATIX_texture_env_combine3, GL_HP_occlusion_test,GL_IBM_texture_mirrored_repeat, GL_INGR_blend_func_separate,GL_MESA_pack_invert,GL_MESA_ycbcr_texture, GL_SGIS_generate_mipmap,GL_SGIS_texture_border_clamp, GL_SGIS_texture_edge_clamp,GL_SGIS_texture_lod,GL_SGIX_depth_texture, GL_SGIX_shadow,GL_SGIX_shadow_ambient,GL_SUN_multi_draw_arrays 5 GLX 视觉效果 视觉 x bf lv rg d st 颜色缓冲区 sr ax dp st 累积缓冲区 ms cav id dep cl sp sz l ci b ro rgba F gb bf th cl rgbas ns beat ---------------------------------------------------------------------------- 0x04f 24 tc 0 24 0 ry . 8 8 8 0 . . 0 16 0 0 0 0 0 0 0 无 0x050 24 tc 0 24 0 ry . 8 8 8 0 . . 0 16 8 16 16 16 0 0 0 无 0x051 24 tc 0 32 0 ry . 8 8 8 8 . . 0 16 8 16 16 16 16 0 0 无 0x052 24 tc 0 32 0 r..8 8 8 8..0 16 8 16 16 16 16 0 0 无 0x053 24 sc 0 24 0 cy . 8 8 8 0 . . 0 16 0 0 0 0 0 0 0 无 11 GLXFB配置: 视觉 x bf lv rg d st 颜色缓冲区 sr ax dp st 累积缓冲区 ms cav id dep cl sp sz l ci b ro rgba F gb bf th cl rgbas ns beat ---------------------------------------------------------------------------- 0x04f 24 tc 0 24 0 ry . 8 8 8 0 . . 0 16 0 0 0 0 0 0 0 无 0x050 24 tc 0 24 0 ry . 8 8 8 0 . . 0 16 8 16 16 16 0 0 0 无 0x051 24 tc 0 32 0 ry . 8 8 8 8 . . 0 16 8 16 16 16 16 0 0 无 0x052 24 tc 0 32 0 r..8 8 8 8..0 16 8 16 16 16 16 0 0 无 0x053 24 sc 0 24 0 cy . 8 8 8 0 . . 0 16 0 0 0 0 0 0 0 无 0x053 0 tc 0 128 0 y . 32 32 32 32 . . 0 24 0 0 0 0 0 0 0 无 0x053 0 tc 0 128 0..32 32 32 32..0 24 0 0 0 0 0 0 0 无 0x053 0 tc 0 64 0 y . 16 16 16 16 . . 0 24 0 0 0 0 0 0 0 无 0x053 0 tc 0 64 0..16 16 16 16..0 24 0 0 0 0 0 0 0 无 0x053 0 tc 0 32 0 y . 11 11 10 0 . . 0 24 0 0 0 0 0 0 0 无 0x053 0 tc 0 32 0..11 11 10 0..0 24 0 0 0 0 0 0 0 无
lsmod | grep radeon
radeon 917108 2 ttm 80957 1 radeon drm_kms_helper 40087 1 radeon drm 265638 4 radeon,ttm,drm_kms_helper i2c_algo_bit 5935 1 radeon i2c_core 31084 5 i2c_i801,radeon,drm_kms_helper,drm,i2c_algo_bit
看来 VirtualGL 确实做了一些符合我要求的事情。我现在可以运行 3D opengl,当我使用“vglrun glxinfo”和 vglrun glxgears 等时,得到“直接渲染”的“是”。(有趣的是,glxgears 在没有 vglrun 的情况下在软件渲染上运行得更快,但与使用 mesa 软件渲染相比,使用 vglrun 的 glxspheres 运行得更快。)
无论如何,我发现 vglrun 无法与 Android Emulator 配合使用,因为我猜它无法处理它想要进行的 OpenGL“ES”模拟或类似的问题。我无法摆脱这个错误:
无法打开 lib64EGL_translator 无法 init_egl_dispatch 模拟器:错误:OpenGLES 初始化失败! 模拟器:错误:无法初始化 OpenGLES 模拟库! 模拟器:警告:无法使用软件渲染器初始化 OpenglES 仿真。
总之,我认为我唯一的解决方案是让我的 GPU 直通作为主卡工作,而不是使用模拟 cirrus logic 启动,然后使用通过的 AMD GPU 和 vglrun/virtualgl。如果我删除模拟 cirruslogic,那么我可以直接在通过的 GPU 上启动主机控制台。然后,我将能够运行 x11vnc 或类似的 vnc,允许在通过的 GPU 上的本地 :0 显示器上进行绑定。这意味着我只需在远程机器上执行 NX,然后使用 tigervnc 或 turbovnc 或 tightvnc 连接到本地显示器上的 x11vnc 会话,这样我就可以在所有内容上直接使用 OPENGL,整个会话无需依赖 VirtualGL 和 vglrun,因为对于 android 模拟器来说,它们无论如何都不起作用,lib64EGL 转换器也存在一些问题。 (是的,我需要在路径和 ldconfig 等中使用 .so,正确的 64 位文件就在那里,它不是那么简单,我想 vglrun 可能无法处理 opengl es 翻译?)
无论如何,我现在唯一的问题是,虽然我以前确实让它工作过,但现在如果我尝试从我的虚拟映像中删除 cirruslogic vga,虚拟机在尝试启动时就会进入“暂停状态”。 (我可以修改内核启动参数,但只要我告诉它启动正常,它就会在 KVM 中进入“暂停”状态)但至少如果我能解决这个问题,我似乎就可以解决我的 android 模拟器问题。