WSL下使用VcXsrv启动chromium browser及常见错误解析 (ubuntu18.04, 图形界面)
Posted 豆花三烧
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WSL下使用VcXsrv启动chromium browser及常见错误解析 (ubuntu18.04, 图形界面)相关的知识,希望对你有一定的参考价值。
先说结论,解决方法在最后:
启动浏览器实质是启动图形界面,推广到其他GUI程序同样适用。
目前在WSL环境下通过VcXsrv这个X server启动图形界面相对简单,但仍存在兼容性问题,配置仍需完善。
环境:
win10系统安装ubuntu18.04的命令行工具(通过Microsoft Store安装)
背景:
正在阅读headfirst C(即嗨翻C语言)的P445,涉及以下关于不同系统启动特定浏览器的代码,用于启动特定浏览器;
void open_url(char *url) { char launch[255]; sprintf(launch, "cmd /c start %s", url); system(launch);#windows sprintf(launch, "x-www-browser \'%s\' &", url); system(launch);#linux sprintf(launch, "open \'%s\'", url); system(launch);#mac os }
希望能在ubuntu命令行模拟linux下特定浏览器的启动。
过程:
最后选择安装chromium-browser, 一个开源的浏览器,运行以下命令即可:
$ sudo apt install chromium-browser
安装完毕后运行:
douhualele@Eric-Yang:~$ chromium-browser (chromium-browser:3733): Gtk-WARNING **: 22:32:21.618: cannot open display: :0.0
显示cannot open display, 即图形界面无法打开,;
起初以为是root权限问题,启动root,运行第一次,失败;
按提示加入--no-sandbox命令,运行第二次,失败,同样显示cannot open display;
结果如下:
root@Eric-Yang:~# chromium-browser [3764:3764:0911/223502.207627:ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180. root@Eric-Yang:~# chromium-browser --no-sandbox (chromium-browser:3771): Gtk-WARNING **: 22:37:11.445: cannot open display: :0.0
这里可以基本确定并非权限问题,但当时并没有反应过来,依旧以权限问题进行探索;
①有文章提到分别修改以下文件
/usr/share/lightdm/lightdm.conf.d/50-unity-greeter.conf
/etc/pam.d gdm-autologin和gdm-password
vi /root/.profile
测试结果:无效,如果你一样是安装了Ubuntu 18.04 LTS for Windows 10的话(当然还有个desktop版本的,有兴趣可尝试命令行下载),
会发现自己找不到前三个文件,即lightdm和gdm这两个关于图形管理器的package,均未安装,你还得安装后才能修改、测试。
②有文章提到命令“ xhost +”, 即授予所有用户接入X window server的权限,于是所有用户都可以使用当前图形界面。
首先必须明确运行这个命令,存在漏洞隐患,该隐患同样存在linux系统上。
通过xhost +"name",授予特定客户端权限即可,然而依旧无效,无法成功启动浏览器。
到这里,唯有换种思路,无意发现一个叫X server的package,
一番了解后才初步明白在原生的linux生态中,图形界面功能只有在需要时才会被调用,需有特定的协议,配置特定的管理器,服务器才能成功调用,这与windows界面和系统本身是一体化的特点完全不同。
ubuntu18.04 自带的X server启动后发现以下错误,并自行终止:
Fatal server error: (EE) parse_vt_settings: Cannot open /dev/tty0 (Input/output error) (EE) (EE) Please consult the The X.Org Foundation support at http://wiki.x.org for help. (EE) Please also check the log file at "/var/log/Xorg.0.log" for additional information. (EE) (EE) Server terminated with error (1). Closing log file.
实际上不存在/dev/tty0这个文件,查看log以及根据错误信息暂未能找到解决办法,基本确定是接口问题;
中间又尝试安装xinit package, 试图通过startx来启动X server, 但一直显示“unable to connect to X server: Connection refused”,多番尝试debug, 无果。
最终解决:
考虑换个x server, 经过简单筛选,发现VcXsrv非常适合在WSL环境下使用;
暂不支持直接bash命令安装,可在以下链接下载后安装,成功安装后启动,选择Display number(一般为0),一直“下一步”直到完成,此时该server应该已在后台运行。
VcXsrv下载链接 https://sourceforge.net/projects/vcxsrv/
启动chromium前, 先设置环境变量DISPALY:
$ export DISPALY=:0.0 #临时设置
$ sudo vim/etc/profile #永久设置
#添加如下语句, 保存
export DISPALY=:0.0
$ source profile #使之生效
设置完成后,终于可以成功启动chromium, 但仍旧会看到如下Error 信息:
[1999:2014:0910/221026.556210:ERROR:bus.cc(394)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_so shared memfd open() failed: Function not implemented [1999:2084:0910/221027.474278:ERROR:bus.cc(394)] Failed to connect to the bus: Could not parse server address: Unknown address type (e nd on UNIX "unix")
libGL error: No matching fbConfigs or visuals found libGL error: failed to load driver: swrast (chromium-browser:1999): LIBDBUSMENU-GLIB-WARNING **: 22:10:28.019: Unable to get session bus: Unknown or unsupported transport “disa [1999:1999:0910/221028.173247:ERROR:gpu_process_transport_factory.cc(1016)] Lost UI shared context. [4:12:0910/221028.255848:ERROR:command_buffer_proxy_impl.cc(113)] ContextResult::kFatalFailure: Shared memory handle is not valid
错误解析:
先说第一个ERROR:bus.cc(394), wsl下需要先手动启动dbus service, 才能建立与chromium socket 的连接。
$ sudo service dbus start
再说这个libGl error, 无匹配的帧缓存设置和视图, 无对应swrast驱动
可以发现在关闭openGL 选项,该错误即消失,说明wgl(windows自带图像处理器)跟chromium存在兼容问题。
最后一部分中关于GPU的错误信息暂无解决办法,可以明确的一点是Ubuntu 18.04 LTS for Windows 10 暂不提供GPU支持,如果希望开发者提供该功能,不妨到以下链接去投个票。
此外,启动chromium后将发现中文无法正常显示,这是因为缺少字体库,执行以下命令修复即可:
$ sudo apt install ttf-wqy-microhei $ sudo apt install fonts-wqy-microhei $ sudo apt install ttf-wqy-zenhei
拓展:
理解X server在图形界面调用时的作用
图形启动基本架构 操作系统-->X Server<-X 协议(server 与 manager之间进行通信)->窗口管理器(GDM)-->X应用程序
OS向X server 提出请求,server 通过X协议转发请求给manager,manager返回许可信息,如通过则继续向X应用发出启动进程指令,应用由此产生图形界面。
待解决:
①安装linux显卡驱动如navdia-390来解决swrast问题, 是否会与Windows驱动冲突?
②第二个ERROR:bus.cc(394)中基于windows的VcXsrv地址类型,dbus库明显无法对其解析,可通过何途径解决?
③ContextResult暂查不到相关信息,与shared memory 又有何关系?
重要参考链接:
https://github.com/Microsoft/WSL/issues/2941
https://github.com/Microsoft/WSL/issues/1788
https://www.ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.cmds6/xhost.htm
https://zh.wikipedia.org/wiki/X%E6%98%BE%E7%A4%BA%E7%AE%A1%E7%90%86%E5%99%A8
https://blog.csdn.net/xiongchun11/article/details/80606106
https://zhidao.baidu.com/question/18378361.html
以上是关于WSL下使用VcXsrv启动chromium browser及常见错误解析 (ubuntu18.04, 图形界面)的主要内容,如果未能解决你的问题,请参考以下文章