前言
在用vscode遠程連接linux服務器開發的時候有將可視化結果回傳到本地機器上的需求。
2023年11月29日修改:原文於研究生時期所寫,工作后有同樣需求於是對文中的配置進行了一些測試,發現如果是vscode+MobaXterm方案的話一些配置是多余的。
試驗環境
- 本地機器:Win10
- 遠程服務器:Ubuntu 20.04.2 LTS
- 已配置ssh
- 已安裝MobaXterm
原理介紹
X Window System
對於X Window System 的介紹引用自維基1:
X窗口系統(X Window System,也常稱為X11或X,天窗口系統)是一種以位圖方式顯示的軟件窗口系統。最初是1984年麻省理工學院的研究,之后變成UNIX、類UNIX、以及OpenVMS等操作系統所一致適用的標准化軟件工具包及顯示架構的運作協議。X窗口系統通過軟件工具及架構協議來創建操作系統所用的圖形用戶界面,此后則逐漸擴展適用到各形各色的其他操作系統上。現在幾乎所有的操作系統都能支持與使用X

X 協議2由 X server 和 X client 組成:
- X server 管理主機上與顯示相關的硬件設置(如顯卡、硬盤、鼠標等),它負責屏幕畫面的繪制與顯示,以及將輸入設置(如鍵盤、鼠標)的動作告知 X client。
- X client 則主要負責事件的處理(即程序的邏輯)。它會向X server反饋事件處理結果。
上圖表示 X server 和X client不在同一台主機上依然可以按照X協議進行通訊,也就是說我們可以將遠程服務器設置成X client,本地機器設置成X server,在兩者之間建立通訊即可達成遠程服務器處理生成圖像的事件,然后反饋到本地機器上讓本地機器生成結果。
實現步驟
本地端
1.X server准備
MobaXterm是集成了X server和ssh的一個非常好用的客戶端,可以很方便的查看服務器文件並且能拖拽文件達成在本地機器和服務器之間進行文件傳輸的目的。
安裝了MobaXterm后,在Settings->Configuration->X11將X11 remote access選項改選為full。
2.vscode設置
采用vscode遠程連接服務器,MobaXterm作為X server的情況下,在嘗試中發現通過使用vscode中的terminal運行python程序並不需要任何額外的vscode插件與設置。該部分僅作保留。
在vscode軟件中的extensions中搜索Remote X11,並點擊安裝。
打開remote-ssh設置。(在C:\Users\你的用戶名\.ssh\config)
在config文件中添加3行設置:
ForwardX11 yes ForwardX11Trusted yes ForwardAgent yes
服務端
1.檢查配置文件
sudo vim /etc/ssh/sshd_config
結果發現我的配置文件已經有相關設置。
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
結合資料應該是必須要設置這兩項。(我的配置文件沒有設置X11UseLocalhost,應該是默認該值為no)
X11Forwarding yes
X11UseLocalhost no #禁止將X11轉發請求綁定到本地回環地址上
2.設置環境變量
據查閱資料4,MobaXterm 上的X server啟動后默認會監聽本地6000端口,X client通過環境變量DISPLAY獲取X server服務地址,例如DISPLAY=本機ip地址:0.0代表X server在本機6000端口,DISPLAY=本機ip地址:1.0代表X server在本機6001端口依此類推。
~/.bashrc文件是用戶級的可以自定義的配置文件,當每次開啟新終端時系統都會讀取該文件執行其中的配置命令。
給服務器增加DISPLAY環境變量,修改.bashrc文件:
vim ~/.bashrc
在文件中加一句:
export DISPLAY=你的本地主機ip:0.0
最后輸入命令生效一下:
source ~/.bashrc
驗證
跑了一下mmdet,可以在本地輸出目標檢測結果圖了。
再嘗試跑了一下open3d,也可以可視化點雲了。
參考
- [1] Wikipedia
- [2] linux服務器通過X11實現圖形化界面顯示
- [3] Linux X11 遠程圖形顯示
- [4] SSH下Linux X Server的配置