先說結論,解決方法在最后:
啟動瀏覽器實質是啟動圖形界面,推廣到其他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