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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM