快轉到主要內容

KasmVNC用法,透過網頁VNC遠端Linux遠端桌面

分類   Linux系統 Self-hosting自架
標籤   KasmVNC Remote Desktop VNC VirtualGL
🗓️ 民國113年 甲辰年
✍ 切換正體/簡體字
目錄

分享如何設定KasmVNC,以Ubuntu為例子。

KasmVNC為一款開源的VNC伺服器,不需要VNC客戶端軟體,只需要瀏覽器便能存取Linux遠端桌面。

內建許多實用功能,比如讓你用客戶端的輸入法打字、共享剪貼簿、虛擬多螢幕等。所有的操作都能夠在網頁內完成。

什麼是虛擬多重螢幕?以兩個獨立的瀏覽器視窗顯示螢幕,方便遠端工作的時候展示桌面畫面給他人觀看!

1. KasmVNC技術背景
#

  1. 講到Web-Native的VNC方案,就會想到 noVNC吧。但KasmVNC不像noVNC需要依賴其他VNC伺服器才能運作,它本身就有websocket的功能。一條指令即可啟動VNC伺服器,讓你用瀏覽器登入遠端桌面。

  2. KasmVNC使用方式很靈活,預設操作模式類似TigerVNC,透過Xvnc在headless的Linux系統啟動一個桌面。你還可以像x11VNC一樣,登入現有的X工作階段,當作遠端桌面使用。

  3. 改善了傳統VNC的問題,KasmVNC支援VirtualGL啟用3D加速,需要GPU驅動支援DRI3。但是畫面串流品質不足以玩遊戲,只能用於軟體彩現。

  4. KasmVNC採用現代的串流技術優化使用者體驗,但是從原理來看,因為拋棄了RFB協定,KasmVNC並不是傳統意義上的VNC,不相容現有的VNC客戶端,只能用瀏覽器連線。 Hacker News上也有人質疑這點,就當作商業行銷手法吧。

  5. 關於KasmVNC的瀏覽器相容性,官方建議使用Chromium系瀏覽器,我自己測試Firefox也可以。但是Safari不推薦,尤其是iOS 18的Safari會有重新整理網頁後無法連線到伺服器的Bug,要刪除cookie才能解決。

  6. 你可能會在某些文件看到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套件
#

  1. GitHub下載對應架構的deb套件
wget https://github.com/kasmtech/KasmVNC/releases/download/v1.3.3/kasmvncserver_noble_1.3.3_amd64.deb
  1. 安裝套件
sudo apt install ./kasmvncserver_*.deb

sudo adduser $USER ssl-cert
  1. 警告:KasmVNC會建立符號連結/usr/bin/vncserver,指向/usr/bin/kasmvncserver,可能會蓋掉現有的VNC伺服器。

  2. 重新登入。

4. 啟動KasmVNC伺服器服務
#

此處假定Linux電腦為headless模式,沒有接上任何螢幕。

  1. 初始化KasmVNC,它應該會自動偵測到XFCE,依照指示新增使用者和密碼,將變更寫入到~/.vnc/xstartup
vncserver -select-de
  1. 之後KasmVNC伺服器便會啟動,KasmVNC預設使用的通訊埠是8444 + DISPLAY數字,你可能需要開放8444通訊埠
sudo ufw allow 8444
sudo ufw reload
  1. 取得Linux的區域IP
ip addr
  1. 接著用其他電腦瀏覽器,輸入https://Linux電腦IP:8444即可登入:

  2. 要關閉VNC伺服器,使用此指令:

vncserver -kill :1
  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
  1. 重新啟動VNC伺服器:
vncserver :1

5. 使用kasmxproxy存取現有X工作階段
#

上面講的KasmVNC會在啟動VNC伺服器的時候開一個新的遠端桌面工作階段,適合headless系統使用,但是你不能存取離開電腦前所登入的桌面。

如果你的Linux電腦有螢幕,已經登入X工作階段,那麼你可以用kasmvncproxy這個工具,將現有的X11工作階段畫面轉發給VNC伺服器,順便啟用GPU加速。

簡言之,就是類似x11VNC的用法。

  1. 登入Linux的桌面環境,請使用X11工作階段。通常登入X11的時候桌面都是顯示在DISPLAY:0

  2. 透過SSH執行以下指令,啟動一個空白的vncserver,不使用xstartup

vncserver -noxstartup :1
  1. DISPLAY:0的畫面轉發給vncserver:1
kasmxproxy -a :0 -v :1 &
  1. 這樣瀏覽器登入之後,就會看到遠端電腦的畫面了。

6. 將KasmVNC做成Systemd服務
#

將KasmVNC與Kasmxproxy設定為登入桌面後自動啟動的服務。

  1. ~/.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
  1. ~/.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
  1. 設定為開機登入自動啟動的服務
systemctl --user enable --now kasmvncserver.service
systemctl --user enable --now Kasmxproxy.service
  1. 透過 內網穿透軟體讓外網能夠存取。

參考資料
#

相關文章

給VNC遠端桌面啟用GPU加速,Linux VirtualGL設定方式
分類   Linux系統 Self-hosting自架
標籤   VNC VirtualGL Raspberry Pi
noVNC,用任意網頁瀏覽器存取Linux VNC遠端桌面
分類   Linux系統 Self-hosting自架
標籤   VNC Remote Desktop
Linux設定TigerVNC遠端桌面,用Systemd執行vncserver
分類   Linux系統 Self-hosting自架
標籤   VNC Remote Desktop

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur或Postimages。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。