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