2024年2月18日 星期日

遠端桌面連線軟體 VNC 也可以當成電子白板或廣播教學軟體來用, 2024 版

在 tigervnc 裡面以 gcin 輸入中文 這幾天正在 用虛擬機安裝 debian 12.5 "bookworm" 。 今天先把 bookworm 上面安裝 tigervnc 及中文輸入法時遇到的問題記錄下來。

一、 tigervnc

如上所述, 我的環境是 debian 12, KDE plasma 版, 選擇預設的 wayland 架構登入, 預設的輸入法是 fcitx。 終端機開兩個分頁, 一個用 root 的身份做事; 另一個維持 stux, 等一下要切來切去。 一如 以往, 先以 root 身份安裝 tigervnc, 以及完全錯開的桌面環境與輸入法: apt install tigervnc-standalone-server tigervnc-viewer tint2 openbox gcin

現代版的 vnc 採用 systemctl 控制。 請先閱讀 /usr/lib/systemd/system/tigervncserver@.service 我大致就是照著裡面的 Quick HowTo 做的。 我新安裝的 debian 裡面, 用戶名稱是 stux; vnc 使用的 port 是 5900 到 5999, 所以等一下設定的 DISPLAY 代號可以是 :0 到 :99。 可是 X window 的預設 DISPLAY 是 :0, 要避開。 所以我在 /etc/tigervnc/vncserver.users 裡面加一句: :99=stux 表示 DISPLAY :99 及 port 5999 要保留給 stux 使用。

其次是個人設定。 切換回 stux 身份的分頁, 先用 vncpasswd 設定密碼。 密碼至少要有6個字元; 至多8個字元; 存放在 ~/.vnc/passwd 裡面。 再用 man vncsessionman tigervnc.conf 了解一下設定檔的位置與順序:

  1. /etc/tigervnc/vncserver-config-defaults
  2. $HOME/.vnc/config 或 $HOME/.vnc/tigervnc.conf
  3. 命令列參數
  4. /etc/tigervnc/vncserver-config-mandatory

越後面才載入的, 優先順序越高 (會覆蓋掉先前的設定)。 第一個是系統預設值; 第二個是個人設定檔; 第三個是命令列參數; 最後載入的第四個, 掌握了最終話語權。

我建立 $HOME/.vnc/tigervnc.conf , 裡面長這樣:

$geometry="800x600";		# 指定桌面大小
# $localhost="no";		# 允許本機以外的機器連進來。 有可能危險!
# $AlwaysShared="true";		# 允許多人同時使用。 有可能危險!

如手冊所說, 採用的是 perl 語法。 後兩句設定有可能危險, 我只拿來測試, 平時註解掉。 如果用 ssh 鑿山洞 或是 novnc 轉成網頁界面, 就不需要設定 $localhost="no" , 而且有加密, 比較安全。 至於何時需要設定 $AlwaysShared="true" 呢? 以前在電腦教室, 我不喜歡用硬體廣播搶整個螢幕, 而是用 vnc 的唯讀模式作為軟體廣播, 讓很多學生同時連到我的桌面來看, 所以才設的。 又或者採用 novnc / ssh 且設定 $AlwaysShared="true", 好幾個彼此信任的朋友都用 read-write 的方式同時登入這一個帳號, 那就可以把這個共用的桌面當做電子白板, 任何人都可以搶滑鼠鍵盤操作。

然後建立 ~/.vnc/xstartup , 記得還要 chmod a+x ~/.vnc/xstartup

unset XDG_RUNTIME_DIR
#export DISPLAY=:99
export GTK_IM_MODULE=gcin
export QT_IM_MODULE=gcin
export SDL_IM_MODULE=gcin
export XMODIFIERS=@im=gcin
#gcin &
sakura -r 20 -c 60 -n 2 &
tint2 &
openbox

最後兩句是工具列跟視窗管理員; sakura 是我慣用的終端機; gcin 那幾句當然是輸入法設定; 其他的等一下解釋。

再切到 root 身份的分頁執行:

systemctl disable tigervncserver@:99.service
systemctl start tigervncserver@:99.service

最後切回 stux 身份的分頁執行: xtigervncviewer :99 是不是透過 vnc 視窗看到 openbox 清爽的桌面跟 sakura 終端機視窗了呢?

用完 vnc 之後一定要記得 systemctl stop tigervncserver@:99.service 尤其千萬不要讓它自動啟動, 不要 systemctl enable tigervncserver@:99.service。 萬一它自動啟動了, 下次開機會無法登入 wayland session; 下一節有解決方法。

二、 除錯

一開始沒有 unset XDG_RUNTIME_DIR 那一句, 從 xstartup 裡面啟動的所有 apps 都跑到登入桌面 (DISPLAY :0), 就像 firefox 開錯門 一樣。 在古代, 只需要設定正確的 DISPLAY, 也就是 export DISPLAY=:99 那一句, apps 就會開在正確的桌面裡; 可是現在 (因為 wayland 架構嗎?) 失效了。 搜尋很久, 終於找到 這個冷門的自問自答: 在 xstartup 的最前面加上 unset XDG_RUNTIME_DIR 那一句、 重新啟動 tigervncserver@:99.service , 就 ok 了! 很想幫那個問答 upvote, 可惜我沒有足夠的資格。 也找不到其他相關解說的文章, 只好在 tigervnc 的某個略微相關的 issue 留言。

每次更改過設定檔並且重新啟動 vnc 服務之後, 可以 cat ~/.vnc/k452b:99.log 查看 log 檔, 確認 tigervncserver 沒有抱怨看不懂語法。

測試過程當中, 有一次我的 KDE 虛擬機開機之後突然連 wayland 版的 KDE plasma 桌面都無法登入! (掉入 login loop) 改選 x11 版的 KDE plasma 桌面就可以。 原來是因為 (1) KDE plasma 桌面預設每次登入時會開啟上次登出時的 apps, 方便你接續先前的工作。 所以我先前忘記停掉的 tigervncserver 也自動啟動了。 (2) plasma 桌面看到 tigervncserver 在跑, 就拒絕讓用戶登入。 (archlinux 用戶類似經驗)

這時可以如上述改選 x11 版的 KDE plasma 登入, 或是改選 (本來要給 vnc 用的) openbox 桌面登入; 又或者是按 ctrl-alt-f2 切換到文字終端機畫面登入。 用 journalctl 可能會看到 Failed to activate /org/freedesktop/login1/session/_34 session. Maybe another compositor is running? 之類的錯誤訊息。 於是下: systemctl stop tigervncserver@:99.service 停掉 vnc。 之後就可以改回用 wayland 版的 KDE plasma 登入了。

三、 gcin

至於 gcin 呢, 好像並不需要在 xstartup 裡面手動啟動服務 (所以我把那句註解掉)。 好像是系統只要看到那幾句 *_IM_MODULE 的設定, 就會自動啟動 gcin。 可是它又跑到登入桌面的工具列去! 如附圖的右下角。 目前無解; 如果找到解法, 再補在這裡。 需要設定 gcin 時, 只好從 「設定」=>「gcin 輸入法設定」 或是命令列上 gcin-tools 把它叫出來。 另外, 一定要把 gcin-tools 裡面的 「外觀設定」 => 「狀態跳出顯示」 打勾, 輸入過程才知道自己在打什麼中文。

我都用嘸蝦米輸入法。 上網找一個 noseeing.cin, 用 gcin2tab noseeing.cin 產生 noseeing.gtab , 再搬到正確的位置: mv noseeing.* /usr/lib/x86_64-linux-gnu/gcin/table/ 下次登入時 不必登出, 馬上就有嘸蝦米可以用了。

ok, 十年前同樣標題的文章 可以退休了!

1 則留言:

  1. 關於 systemctl 的更正: 建議永遠不要 systemctl enable ... 也就是永遠不要讓 tigervncserver 自動啟動, 這樣最簡單。 需要用的時候,才下 systemctl start ... 就好; 用完就盡快 systemctl stop ... 。 這些都是為了避免它與 wayland 的主登入畫面衝突。

    回覆刪除

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。