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支持,如果希望开发者提供该功能,不妨到以下链接去投个票。

https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/16108045-opencl-cuda-gpu-support   

 

此外,启动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

 

posted @ 2018-09-12 20:33  豆花三烧  阅读(6365)  评论(2编辑  收藏