因為某些原因我必須在遠端條件下使用帶圖形環境的Ubuntu工作。雖然說有向日葵和ToDesk這種遠端控制工具,但是後者經常莫名其妙蹦個錯誤告訴我連不上網路(指的是Mac上的這個軟體連不到它公司自己的網路,連我這個賬號在ToDesk上有哪些線上裝置都不知道),前者怎麼說呢... 我已經受夠遠端桌面那模糊的畫質和時長時短的操作時延了!
我打算試試用VNC或X這種遠端視窗方案。
ssh登入
網路拓撲是這樣的:
(Macbook筆記本) —— (Windows筆記本) —— (Ubuntu 22.04 虛擬機器)
其中Ubuntu是Windows上基於VMware執行的虛擬機器,而且Macbook和Windows分別在兩個大內網裡,沒法直連,這裡採用貝銳蒲公英提供的遠端組網方案(內網穿透好幫手),分別在Macbook和Windows上安裝並執行蒲公英,具體的教程就不需要展示了。
為了描述方便,下面Macbook簡稱Mac,Windows簡稱Win,Ubuntu簡稱VM。
總之,透過蒲公英兩邊都得到了一個虛擬區域網的IP,暫定為Mac得到了172.111.1.14而Win是172.111.1.15。同時Win和VM處於同一個由VMware構成的虛擬網路中,在這個網路中假定Win是192.168.168.1,VM是192.168.168.136。透過實驗可以確認Mac和Win、Mac和Ubuntu、Win和VM都是具有網路可達性的(可以互Ping成功),說明蒲公英組網之後可以正確地修改路由表,使得虛擬區域網中的Mac和虛擬區域網外的VM都能互相發現。
好,抽象的事情要來了。我們先試試能不能從Mac用ssh連線VM:(所有涉及使用者名稱的地方都用gua代替)
~/ $ ssh gua@192.168.168.136
kex_exchange_identification: read: Connection reset by peer
Connection reset by 192.168.168.136 port 22
我的第一個想法是:莫非VM設定出了問題,不允許連線?挨個排查:
- Mac和Win之間的網路可達性:互Ping有應答,沒問題
- Win和VM之間的網路可達性:互Ping有應答,沒問題
- Mac和VM之間的網路可達性:互Ping有應答,沒問題
- VM自身的sshd網路設定:從Win用ssh登入VM成功,沒問題
- 蒲公英鏈路不允許ssh:從Mac用ssh登入Win成功,不太像是主動的限制
- Win本身對ssh鏈路的影響:從Mac用ssh把Win作為跳板登入VM成功,不太像是Win的鍋
顯然,我覺得各個環節都不太可能有問題,除非:蒲公英虛擬組網本身有缺陷,或者Win作為網路節點會對ssh鏈路產生影響。
考慮到蒲公英之前在Linux上的服務端做得實在是太爛了,我傾向於是前者。
那麼,現在就只能用這種指令訪問了。
~/ $ ssh -J gua@172.111.1.15 gua@192.168.168.136
然後它成功了,難評蒲公英。
設定X遠端顯示
X是一套歷史悠久的視窗顯示體系,現在主流的版本號是11,因此也叫X11。在X11裡面:
- X Server是提供顯示資源的一端,即提供顯示器、鍵鼠輸入訊號的一端。
- X Client是需要顯示資源的一端,通常指的是應用程式,因為是應用程式有顯示畫面、接受輸入訊號的需求。
- X Protocol是所用的X協議,體系裡有這麼個概念,但是我們在此不用傾注過多關注。
在一般的使用場景裡,通常是使用者需要讓遠端服務主機上的應用程式(遠端主機通常配置很強效能更好,因此跑計算任務都在遠端主機上)在本地主機上顯示畫面(在本地主機上繪製Python跑出來的曲線圖之類的)。在這個場景中,遠端主機上輸出畫面的應用程式是X Client,而本地主機則需要執行X Server。
這裡Mac上執行X Server,接收來自VM上的X Client們的畫面訊號。
選擇合適的X Server程式
帶有X Server的程式有很多,在Windows上有MobaXterm(內建X Server)和PuTTY、VcXsrv(用X Launch啟動)等。其中以VcXsrv最為經典,可以設定X Server所使用的Display號和Screen號。由於我是在Mac上執行X Server,這裡用的是XQuartz。
有個小坑點,這裡如果用 brew install --cask XQuartz
如果網路變化的話會安裝一個殘缺的XQuartz,而你重新用 brew
安裝並不會告訴你有什麼異常,也不會重新給你裝好,因此建議去官網下載 .pkg 包進行安裝。
在X體系裡,最重要的環境變數是 $DISPLAY
,這個變數決定了X應用程式會往哪個方向建立X連線。在我們所要進行的整個過程中,你都沒有任何必要手動修改這個變數。這是因為:XQuartz會自動修改你在Mac上的 $DISPLAY
;而如果你使用 ssh -Y
連線遠端主機, ssh
會自動幫你修改遠端主機上的 $DISPLAY
數值。
# 在Mac上,當你從Launch Pad直接執行完XQuartz,會得到...
~/ $ echo $DISPLAY
/private/tmp/com.apple.launchd.57Nwhjt3kp/org.xquartz:0
# 得到形如上一行的文字
# 在遠端主機上,當你直接使用ssh連線而不配置任何X轉發選項時,會得到...
~/ $ echo $DISPLAY
# 得到空白,說明沒有設定
# 在遠端主機上,當你使用 ssh -Y 連線時,會得到...
~/ $ echo $DISPLAY
localhost:10.0
# 得到這個,說明ssh -Y主動設定了DISPLAY變數
# 當你用VMware直接在有圖形介面的Ubuntu裡執行終端時,會得到...
~/ $ echo $DISPLAY
:0
# 得到這個,這是因為用了預設的本地顯示器,在本地進行顯示
當X Server所在的本地主機和X Client所在的遠端主機的 $DISPLAY
變數都被正確設定時,X方面就沒什麼太大的問題了。
Mac:使用X Quartz實現遠端視窗
Mac上的X Quartz的使用具有比較鮮明的特色。怎麼說呢... 用起來感覺像“訪達”。XQuartz自己是一個程式,而遠端的X Client所產生的視窗則是屬於這個程式的子視窗。
使用X Quartz在Mac上實現遠端視窗的基本步驟如下:
- 啟動XQuartz,它應該在“應用程式” -> “其他”或者“實用工具” 裡。如果XQuartz很快就退出了,建議重灌一個。
- 在XQuartz中啟動終端
- 在終端中使用
ssh -Y gua@192.168.168.136
連線所需要的遠端主機 - 在終端中執行需要X Server的命令,這時候就會在你的本地主機建立視窗了
值得注意的是,其中的 ssh -Y
在man手冊中被指出是 “Trusted”。我一開始以為是透過 -Y
的話要額外經過身份驗證之類的,後來細究了一下發現 -Y
類似裸奔模式: -X
只允許部分X Client的操作,而 -Y
則沒有這種限制。因此比較正經的教程通常會告訴你應該多用 -X
避免安全問題,而網上的文章通常都會建議你用 -Y
避免在奇怪的地方被莫名其妙地攔住。
這樣的步驟只是讓讀者快速瞭解實現遠端視窗的全部流程,細究起來還是有很多問題,比如:
- XQuartz的終端非常難看,不能正確地顯示我的Powerline字型。
- 在
.ssh/config
中為目標主機配置快捷啟動和ForwardX11Trusted yes
好像沒有起到和-Y
一樣的用處,有待研究。
此外,這樣做的延時是比較恐怖的。雖然繪製的效果不錯,但是上面那個示意圖中xeyes對滑鼠的跟蹤效果的延時高達800ms;我透過終端啟動QtCreator之後,有關操作的延時可以高達13.92s。這樣的延時多少有點不可接受了。
有機會再做個對比實驗,看看網路鏈路在其中的影響有多大。