分享如何設定KasmVNC,以Ubuntu為例子。
KasmVNC為一款開源的VNC伺服器,不需要VNC客戶端軟體,只需要瀏覽器便能存取Linux遠端桌面。
內建許多實用功能,比如讓你用客戶端的輸入法打字、共享剪貼簿、虛擬多螢幕等。所有的操作都能夠在網頁內完成。
什麼是虛擬多重螢幕?以兩個獨立的瀏覽器視窗顯示螢幕,方便遠端工作的時候展示桌面畫面給他人觀看!
1. KasmVNC技術背景#
講到Web-Native的VNC方案,就會想到 noVNC吧。但KasmVNC不像noVNC需要依賴其他VNC伺服器才能運作,它本身就有websocket的功能。一條指令即可啟動VNC伺服器,讓你用瀏覽器登入遠端桌面。
KasmVNC使用方式很靈活,預設操作模式類似TigerVNC,透過Xvnc在headless的Linux系統啟動一個桌面。你還可以像x11VNC一樣,登入現有的X工作階段,當作遠端桌面使用。
改善了傳統VNC的問題,KasmVNC支援VirtualGL啟用3D加速,需要GPU驅動支援DRI3。但是畫面串流品質不足以玩遊戲,只能用於軟體彩現。
KasmVNC採用現代的串流技術優化使用者體驗,但是從原理來看,因為拋棄了RFB協定,KasmVNC並不是傳統意義上的VNC,不相容現有的VNC客戶端,只能用瀏覽器連線。 Hacker News上也有人質疑這點,就當作商業行銷手法吧。
關於KasmVNC的瀏覽器相容性,官方建議使用Chromium系瀏覽器,我自己測試Firefox也可以。但是Safari不推薦,尤其是iOS 18的Safari會有重新整理網頁後無法連線到伺服器的Bug,要刪除cookie才能解決。
你可能會在某些文件看到KasmVNC支援音訊串流,這並不正確,那個是桌面虛擬化套裝軟體 Kasm Workspaces整合的功能,KasmVNC本體只有遠端桌面的而已,PulseAudio的串流需要自行處理。
我個人覺得KasmVNC就是整合了各種前人方案的綜合體,也就是TigerVNC + noVNC + VirtualGL,並且比Apache Guacamole更容易安裝,瀏覽器操作十分順暢。
2. 準備Linux桌面環境#
VNC遠端桌面推薦用XFCE或者KDE Plasma,GNOME問題很多。
因此,請先在Ubuntu安裝XFCE桌面:
sudo apt install xfce4
3. 安裝KasmVNC套件#
- 從 GitHub下載對應架構的deb套件
wget https://github.com/kasmtech/KasmVNC/releases/download/v1.3.3/kasmvncserver_noble_1.3.3_amd64.deb
- 安裝套件
sudo apt install ./kasmvncserver_*.deb
sudo adduser $USER ssl-cert
警告:KasmVNC會建立符號連結
/usr/bin/vncserver
,指向/usr/bin/kasmvncserver
,可能會蓋掉現有的VNC伺服器。重新登入。
4. 啟動KasmVNC伺服器服務#
此處假定Linux電腦為headless模式,沒有接上任何螢幕。
- 初始化KasmVNC,它應該會自動偵測到XFCE,依照指示新增使用者和密碼,將變更寫入到
~/.vnc/xstartup
vncserver -select-de
- 之後KasmVNC伺服器便會啟動,KasmVNC預設使用的通訊埠是8444 + DISPLAY數字,你可能需要開放8444通訊埠
sudo ufw allow 8444
sudo ufw reload
- 取得Linux的區域IP
ip addr
接著用其他電腦瀏覽器,輸入
https://Linux電腦IP:8444
即可登入:要關閉VNC伺服器,使用此指令:
vncserver -kill :1
- 你可以調整個別使用者的KasmVNC設定檔
~/.vnc/kasmvnc.yaml
(全域設定檔位於/etc/kasmvnc/kasmvnc.yaml
),視需求關閉SSL和啟用3D加速
desktop:
resolution:
width: 1024
height: 768
allow_resize: true # 依照客戶端瀏覽器視窗自動調整桌面解析度,或是固定解析度
pixel_depth: 24
gpu: # 啟用GPU加速
hw3d: true
drinode: /dev/dri/renderD128
network:
protocol: http
interface: 0.0.0.0
websocket_port: auto
use_ipv4: true
use_ipv6: true
udp:
public_ip: auto
port: auto
stun_server: auto
ssl:
pem_certificate: /etc/ssl/certs/ssl-cert-snakeoil.pem
pem_key: /etc/ssl/private/ssl-cert-snakeoil.key
require_ssl: true # 是否需要SSL
- 重新啟動VNC伺服器:
vncserver :1
5. 使用kasmxproxy存取現有X工作階段#
上面講的KasmVNC會在啟動VNC伺服器的時候開一個新的遠端桌面工作階段,適合headless系統使用,但是你不能存取離開電腦前所登入的桌面。
如果你的Linux電腦有螢幕,已經登入X工作階段,那麼你可以用kasmvncproxy
這個工具,將現有的X11工作階段畫面轉發給VNC伺服器,順便啟用GPU加速。
簡言之,就是類似x11VNC的用法。
登入Linux的桌面環境,請使用X11工作階段。通常登入X11的時候桌面都是顯示在DISPLAY:0
透過SSH執行以下指令,啟動一個空白的vncserver,不使用xstartup
vncserver -noxstartup :1
- 將
DISPLAY:0
的畫面轉發給vncserver:1
kasmxproxy -a :0 -v :1 &
- 這樣瀏覽器登入之後,就會看到遠端電腦的畫面了。
6. 將KasmVNC做成Systemd服務#
將KasmVNC與Kasmxproxy設定為登入桌面後自動啟動的服務。
- 在
~/.config/systemd/kasmvncserver.service
填入以下內容:
[Unit]
Description=KasmVNCServer
PartOf=graphical-session.target
After=graphical-session.target
[Service]
Type=forking
ExecStart=/usr/bin/kasmvncserver -noxstartup :1
[Install]
WantedBy=graphical-session.target
- 在
~/.config/systemd/kasmxproxy.service
填入以下內容:
[Unit]
Description=Kasmxproxy
PartOf=graphical-session.target
After=graphical-session.target
Requires=kasm-vnc-server.service
After=kasm-vnc-server.service
[Service]
Type=simple
ExecStart=/usr/bin/kasmxproxy -a :0 -v :1
[Install]
WantedBy=graphical-session.target
- 設定為開機登入自動啟動的服務
systemctl --user enable --now kasmvncserver.service
systemctl --user enable --now Kasmxproxy.service
- 透過 內網穿透軟體讓外網能夠存取。