器遠(yuǎn)程桌面:TigerVNC 安裝配置與避坑指南)
1. 為什么還要折騰一臺老系統(tǒng)的遠(yuǎn)程桌面手里頭還跑著 Ubuntu 14.04 的機(jī)器說實話現(xiàn)在不算少見。工控機(jī)、老舊的測試設(shè)備、某些只認(rèn)舊內(nèi)核的采集卡配套主機(jī)甚至一些嵌入式開發(fā)板系統(tǒng)版本被死死鎖在 14.04 上動都動不了。這些機(jī)器通常沒有接顯示器放在機(jī)柜里或者角落里需要圖形界面的時候只能靠遠(yuǎn)程桌面連過去操作。VNC 就是干這個的。它把整臺機(jī)器的桌面環(huán)境通過網(wǎng)絡(luò)搬到你眼前鼠標(biāo)鍵盤操作跟坐在機(jī)器前面幾乎一樣。跟 SSH 的區(qū)別在于SSH 只能敲命令而 VNC 能讓你看到完整的圖形界面跑那些必須點鼠標(biāo)才能用的工具比如某些老版本的配置軟件、波形查看器、或者基于 Qt 的采集程序。這篇文章面向的是手里有 Ubuntu 14.04 機(jī)器、需要遠(yuǎn)程圖形界面、但又不想重裝系統(tǒng)的朋友。我會把整個安裝配置過程拆開講清楚包括為什么這么選、每一步在干什么、參數(shù)怎么定、踩過的坑怎么繞。Ubuntu 14.04 這個版本比較特殊它的軟件源、桌面環(huán)境、初始化系統(tǒng)都跟后來的版本有差異網(wǎng)上很多新教程直接套用會出問題所以這里專門針對 14.04 來講。需要提前說明的是VNC 傳輸本身是不加密的默認(rèn)情況下數(shù)據(jù)在網(wǎng)絡(luò)上裸奔。所以這套方案只適合在受控的內(nèi)網(wǎng)環(huán)境里用比如機(jī)房內(nèi)部、實驗室局域網(wǎng)。如果要在不可信網(wǎng)絡(luò)里用得額外套一層加密通道這個后面會提。另外 Ubuntu 14.04 已經(jīng)停止官方支持很久了軟件源需要換成歸檔地址才能正常安裝這是第一個要解決的問題。2. 方案選型與前置準(zhǔn)備2.1 為什么選 TigerVNC 而不是其他Ubuntu 上能用的 VNC 服務(wù)端有好幾個常見的有 TightVNC、TigerVNC、x11vnc還有 RealVNC 的商業(yè)版。在 14.04 這個環(huán)境下我最終選的是 TigerVNC理由有這么幾條。TightVNC 在老系統(tǒng)上兼容性不錯但它的剪貼板同步經(jīng)常出問題復(fù)制粘貼中文的時候容易亂碼而且高分辨率下的性能一般。x11vnc 的思路不一樣它是直接共享當(dāng)前已經(jīng)存在的 X 會話也就是說機(jī)器上必須已經(jīng)有一個登錄的圖形會話它才能用對于無頭機(jī)器沒接顯示器、沒登錄桌面就不太合適。RealVNC 商業(yè)版功能全但免費(fèi)版限制多而且授權(quán)管理麻煩。TigerVNC 的優(yōu)勢在于它自己啟動一個獨立的 X 會話不依賴物理顯示器無頭機(jī)器也能用性能在同類里算好的支持多種編碼方式剪貼板同步相對穩(wěn)定而且它在 14.04 的軟件源里就有安裝方便。雖然 TigerVNC 后來版本變化挺大但 14.04 源里那個版本足夠穩(wěn)定用著沒問題。提示如果你只是偶爾連一下、機(jī)器上本來就開著圖形界面x11vnc 可能更省事。但如果是長期無頭運(yùn)行、需要獨立會話TigerVNC 是更穩(wěn)妥的選擇。2.2 系統(tǒng)源的處理Ubuntu 14.04 的官方源早就移到歸檔服務(wù)器了直接apt-get update會報一堆 404。所以第一步是把源地址改掉。打開/etc/apt/sources.list把里面所有archive.ubuntu.com和security.ubuntu.com替換成old-releases.ubuntu.com。用 sed 一條命令就能搞定sudo sed -i s/archive.ubuntu.com/old-releases.ubuntu.com/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/old-releases.ubuntu.com/g /etc/apt/sources.list sudo apt-get update這一步不做后面什么都裝不上。我見過有人卡在這里半天以為是網(wǎng)絡(luò)問題其實是源地址失效了。2.3 桌面環(huán)境的確認(rèn)TigerVNC 啟動的會話需要一個桌面環(huán)境來渲染。Ubuntu 14.04 默認(rèn)裝的是 Unity但這個桌面環(huán)境比較重而且對 VNC 會話的支持不算好容易出現(xiàn)窗口管理器沖突。我的建議是裝一個輕量的桌面環(huán)境比如 Xfce 或者 LXDE。Xfce 在 14.04 上很成熟資源占用低跟 VNC 配合穩(wěn)定。sudo apt-get install xfce4 xfce4-goodies如果你機(jī)器上已經(jīng)有 GNOME 或者 KDE也能用但配置起來要多調(diào)幾個地方。為了簡單起見下面都以 Xfce 為例。裝完之后不用管它VNC 會話啟動的時候會指定用 Xfce 作為桌面。2.4 安裝 TigerVNC 服務(wù)端sudo apt-get install tigervncserver裝完之后可以確認(rèn)一下版本vncserver -version14.04 源里的版本大概是 1.3.x 這個級別夠用了。注意包名是tigervncserver不是tigervnc-standalone-server后者是后來版本的包名在 14.04 上裝不到。3. 核心配置與啟動流程3.1 首次啟動與密碼設(shè)置TigerVNC 第一次啟動的時候會讓你設(shè)置一個訪問密碼。直接運(yùn)行vncserver它會提示你輸入密碼這個密碼是連接時用的跟系統(tǒng)登錄密碼是兩回事。密碼長度最多 8 位這是 VNC 協(xié)議本身的限制不是 TigerVNC 的問題。輸入完之后它會問你要不要設(shè)一個只讀密碼view-only一般選 n 就行。啟動成功后它會告訴你會話號比如:1對應(yīng)的端口是 5901。VNC 的端口規(guī)則是 5900 加上會話號所以:1就是 5901:2就是 5902以此類推。這時候其實已經(jīng)能連了但連上去看到的桌面可能不太對因為默認(rèn)的啟動腳本用的是很簡陋的配置。所以下一步是改配置文件。3.2 配置文件的位置與內(nèi)容TigerVNC 的配置文件在用戶主目錄下的.vnc文件夾里主要兩個文件xstartup和config。xstartup決定了 VNC 會話啟動時執(zhí)行什么也就是啟動哪個桌面環(huán)境。默認(rèn)的內(nèi)容大概是啟動一個很基礎(chǔ)的 twm 窗口管理器界面丑而且不好用。我們要把它改成啟動 Xfce。先停掉剛才啟動的會話vncserver -kill :1然后編輯~/.vnc/xstartup把它改成這樣#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec startxfce4這里解釋一下這幾行的作用。unset SESSION_MANAGER和unset DBUS_SESSION_BUS_ADDRESS是為了清掉可能從系統(tǒng)環(huán)境繼承過來的變量避免跟 VNC 自己的會話沖突。如果不加這兩行有時候會出現(xiàn)桌面啟動到一半卡住、或者窗口管理器報錯的情況。exec startxfce4就是啟動 Xfce 桌面。改完之后給執(zhí)行權(quán)限chmod x ~/.vnc/xstartupconfig文件是 TigerVNC 的運(yùn)行參數(shù)可以設(shè)分辨率、色深、是否允許剪貼板等。一個常用的配置geometry1440x900 depth24 localhostno alwayssharedgeometry是分辨率根據(jù)你本地屏幕來定別設(shè)得比本地屏幕還大不然要滾動。depth24是色深24 位真彩色畫質(zhì)好帶寬占用也能接受。如果網(wǎng)絡(luò)特別差可以降到 16。localhostno表示允許從其他機(jī)器連接如果設(shè)成 yes 就只能本機(jī)連。alwaysshared允許多個客戶端同時連同一個會話方便協(xié)作或者多設(shè)備切換。3.3 啟動腳本與開機(jī)自啟手動敲vncserver啟動太麻煩而且重啟機(jī)器后就沒了??梢詫懸粋€ systemd 服務(wù)來實現(xiàn)開機(jī)自啟。Ubuntu 14.04 用的是 Upstart 而不是 systemd所以這里要用 Upstart 的寫法放在/etc/init/vncserver.confdescription VNC Server start on runlevel [2345] stop on runlevel [!2345] respawn exec su - youruser -c /usr/bin/vncserver :1 -geometry 1440x900 -depth 24把youruser換成實際的用戶名。這樣開機(jī)就會自動啟動:1會話。注意 Upstart 和 systemd 的語法完全不同網(wǎng)上很多 systemd 的教程在 14.04 上直接抄會失敗這是常見的坑。注意用 Upstart 啟動的時候環(huán)境變量可能跟手動登錄時不一樣如果xstartup里依賴某些 PATH 或者環(huán)境變量最好在腳本里顯式設(shè)置避免啟動失敗。3.4 防火墻與端口如果機(jī)器開了防火墻需要放行 5901 端口或者你用的會話號對應(yīng)的端口。Ubuntu 14.04 默認(rèn)的 ufw 一般是關(guān)閉的但如果開了sudo ufw allow 5901/tcp如果是 iptables 直接管理就加對應(yīng)的規(guī)則。這一步不做的話連接會一直超時但機(jī)器上看起來一切正常容易誤判成 VNC 沒啟動。4. 連接測試與常見問題排查4.1 客戶端連接服務(wù)端配好之后用 VNC 客戶端連??蛻舳塑浖芏郬indows 上可以用 TightVNC Viewer、RealVNC ViewerLinux 上可以用vncviewer命令macOS 自帶的屏幕共享也能連。連接地址填機(jī)器IP:1或者機(jī)器IP:5901兩種寫法都行。連上之后輸入之前設(shè)的密碼應(yīng)該就能看到 Xfce 桌面了。第一次連可能會提示證書或者加密相關(guān)的警告選繼續(xù)就行因為 VNC 本身不加密這個提示是正常的。4.2 黑屏或者只有灰底這是最常見的問題連上了但桌面出不來只有一片灰或者黑。原因基本都在xstartup上。要么是腳本沒執(zhí)行權(quán)限要么是啟動的桌面環(huán)境命令不對要么是環(huán)境變量沖突。排查步驟先看~/.vnc/目錄下的日志文件名字類似機(jī)器名:1.log里面會記錄啟動過程中的報錯。如果看到startxfce4: command not found說明 Xfce 沒裝好或者路徑不對。如果看到 dbus 相關(guān)的錯誤就是前面說的環(huán)境變量沒清干凈。還有一種情況是xstartup里用了exec但前面還有別的命令沒加導(dǎo)致卡住。記住exec是替換當(dāng)前進(jìn)程它后面不能再有別的命令。4.3 剪貼板不同步VNC 的剪貼板同步有時候不靈復(fù)制了東西粘不過去。這跟客戶端和服務(wù)端的實現(xiàn)都有關(guān)系。TigerVNC 服務(wù)端這邊確保config里沒有禁用剪貼板相關(guān)的選項??蛻舳四沁呌行┛蛻舳四J(rèn)關(guān)閉了剪貼板同步需要在設(shè)置里打開。如果還是不行可以裝一個autocutsel來輔助sudo apt-get install autocutsel然后在xstartup里exec startxfce4之前加上autocutsel -fork autocutsel -selection PRIMARY -fork它會在后臺同步 X 的剪貼板能解決大部分復(fù)制粘貼的問題。4.4 分辨率不對或者無法調(diào)整分辨率是在啟動時通過-geometry參數(shù)或者config文件定的啟動之后再改就不生效了。如果連上去發(fā)現(xiàn)分辨率不對先 kill 掉會話改配置再重新啟動。vncserver -kill :1 vncserver :1 -geometry 1920x1080 -depth 24注意分辨率不能超過客戶端屏幕太多否則操作起來要不停滾動很難受。一般設(shè)成跟本地屏幕一樣或者略小一點最舒服。4.5 連接被拒絕或者超時分幾種情況。如果是Connection refused說明端口沒開或者服務(wù)沒起來檢查vncserver進(jìn)程在不在端口有沒有監(jiān)聽ps aux | grep vnc netstat -tlnp | grep 5901如果是超時多半是防火墻或者網(wǎng)絡(luò)不通先 ping 一下機(jī)器再檢查防火墻規(guī)則。還有一種可能是config里設(shè)了localhostyes只允許本機(jī)連外部就連不上改成 no 即可。4.6 常見問題速查表現(xiàn)象可能原因處理方式黑屏/灰底xstartup 配置錯誤檢查執(zhí)行權(quán)限和桌面啟動命令連接被拒服務(wù)未啟動或端口未監(jiān)聽檢查進(jìn)程和端口確認(rèn) config 中 localhostno連接超時防火墻攔截放行對應(yīng)端口剪貼板失效同步未開啟安裝 autocutsel 并在 xstartup 中啟動分辨率不對啟動參數(shù)未生效kill 會話后重新用 -geometry 啟動中文顯示方塊缺少中文字體安裝中文字體包桌面卡頓色深過高或網(wǎng)絡(luò)差降低 depth 到 165. 安全加固與性能調(diào)優(yōu)5.1 傳輸加密的必要性前面反復(fù)提到VNC 協(xié)議本身不加密密碼和畫面數(shù)據(jù)都是明文傳輸。在內(nèi)網(wǎng)里問題不大但如果網(wǎng)絡(luò)環(huán)境不完全可信就必須加一層保護(hù)。最常用的做法是通過 SSH 隧道轉(zhuǎn)發(fā) VNC 端口。具體來說在客戶端這邊執(zhí)行ssh -L 5901:localhost:5901 user目標(biāo)機(jī)器這樣本地的 5901 端口就通過 SSH 加密通道轉(zhuǎn)發(fā)到了目標(biāo)機(jī)器的 5901。然后 VNC 客戶端連localhost:1就行了數(shù)據(jù)全程走 SSH 加密。這個方案不需要改服務(wù)端任何配置只要 SSH 能連上就行非常方便。提示用 SSH 隧道的時候服務(wù)端的config里可以把localhost設(shè)成 yes這樣只有本機(jī)能連 VNC 端口外部即使知道端口也連不上安全性更高。5.2 密碼與訪問控制VNC 密碼最多 8 位而且加密強(qiáng)度有限所以不要用太簡單的密碼。另外可以定期更換改密碼用vncpasswd它會重新設(shè)置~/.vnc/passwd文件。這個文件的權(quán)限要是 600只有屬主能讀否則 TigerVNC 會拒絕啟動。如果多人使用可以給每個人分配不同的會話號和端口各自獨立互不干擾。alwaysshared選項要慎用開了之后任何人都能連同一個會話適合協(xié)作但不適合有隱私要求的場景。5.3 性能調(diào)優(yōu)的幾個參數(shù)VNC 的性能主要受分辨率、色深、編碼方式影響。分辨率越高、色深越大數(shù)據(jù)量越大網(wǎng)絡(luò)差的時候就越卡。在config里可以調(diào)這些depth16 比 24 省帶寬但顏色會有損失看文字為主的場景 16 夠用。geometry按需設(shè)別盲目追求大。compresslevel壓縮級別0 到 9越高越省帶寬但越費(fèi) CPU。老機(jī)器 CPU 弱的話別設(shè)太高5 左右比較平衡。qualityJPEG 壓縮質(zhì)量1 到 100越低越省帶寬但畫質(zhì)越差。文字場景可以設(shè) 6 到 8 這個級別注意這個參數(shù)在不同版本里取值范圍不一樣14.04 的版本里是 0 到 9。這些參數(shù)沒有萬能值得根據(jù)實際網(wǎng)絡(luò)和機(jī)器性能試。我的經(jīng)驗是內(nèi)網(wǎng)千兆環(huán)境下1440x900、24 位色、壓縮 5用起來基本跟本地差不多。如果是跨網(wǎng)段或者無線就得降分辨率或者色深。5.4 日志與監(jiān)控VNC 的日志在~/.vnc/下每個會話一個日志文件。出問題的時候第一時間看日志比瞎猜快得多。日志里會記錄啟動過程、連接記錄、報錯信息。如果日志文件太大可以定期清理或者配置日志輪轉(zhuǎn)。另外可以寫個簡單的監(jiān)控腳本定期檢查 VNC 進(jìn)程和端口掛了就自動重啟。Upstart 的respawn已經(jīng)能處理進(jìn)程崩潰的情況但如果是配置問題導(dǎo)致啟動失敗respawn 會一直重試這時候就得看日志找原因了。6. 實操中的經(jīng)驗與避坑總結(jié)6.1 幾個容易忽略的細(xì)節(jié)第一個是用戶權(quán)限問題。VNC 服務(wù)是以某個用戶身份跑的那個用戶必須對~/.vnc目錄有讀寫權(quán)限xstartup要有執(zhí)行權(quán)限。如果是以 root 跑很多桌面環(huán)境會拒絕啟動所以別用 root。第二個是 locale 設(shè)置。如果系統(tǒng) locale 沒配好Xfce 啟動的時候可能報錯或者界面顯示異常。檢查/etc/default/locale確保有合理的LANG設(shè)置比如en_US.UTF-8或者zh_CN.UTF-8。中文環(huán)境還要裝中文字體否則中文全是方塊。第三個是多個會話的端口沖突。如果你啟動了:1又想啟動:1會報錯。要么 kill 掉舊的要么用新的會話號。查看當(dāng)前有哪些會話vncserver -list6.2 我踩過的坑有一次在一臺工控機(jī)上配 VNC怎么都連不上日志里也沒明顯報錯。折騰半天發(fā)現(xiàn)是那臺機(jī)器的 hosts 文件里主機(jī)名解析有問題導(dǎo)致 VNC 啟動時卡在解析主機(jī)名上。后來在/etc/hosts里加了一行127.0.0.1 主機(jī)名就好了。這個坑很隱蔽因為表面上看服務(wù)是啟動了的但實際沒完全起來。還有一次是剪貼板死活不同步裝了 autocutsel 也不行。最后發(fā)現(xiàn)是客戶端的問題換了個客戶端就好了。所以遇到問題要兩邊都排查別只盯著服務(wù)端。另外 Upstart 的啟動腳本里如果su - youruser后面的命令路徑寫的是相對路徑開機(jī)自啟會失敗因為 Upstart 的工作目錄跟登錄 shell 不一樣。所有命令都用絕對路徑最保險。6.3 關(guān)于老系統(tǒng)的維護(hù)建議Ubuntu 14.04 畢竟太老了軟件源雖然能用歸檔地址但很多新軟件裝不上安全更新也沒有了。如果條件允許還是建議逐步遷移到新系統(tǒng)。但如果短期內(nèi)必須用那就把該做的安全措施做到位VNC 只監(jiān)聽內(nèi)網(wǎng)、用 SSH 隧道、密碼設(shè)復(fù)雜點、定期檢查日志。另外可以把整個 VNC 配置過程寫成一個腳本新機(jī)器部署的時候一鍵執(zhí)行省得每次重復(fù)勞動。腳本里包括換源、裝 Xfce、裝 TigerVNC、寫配置文件、設(shè)權(quán)限、配 Upstart跑完重啟就能用。這個腳本我后來在好幾臺機(jī)器上復(fù)用省了不少時間。最后再分享一個小技巧如果只是臨時用一下圖形界面不想配一堆東西可以用x11vnc -display :0 -once這種一次性模式連完就退出適合應(yīng)急。但長期用還是 TigerVNC 這套方案更穩(wěn)。