本篇記錄在 Ubuntu Linux 16.04.6 LTS 的 VM 環境之下,安裝 VirtualGL 與 VNC 伺服器,實作遠端 3D 繪圖伺服器的過程。
我們的測試環境中,已經有一張 NVIDIA Tesla P40 顯示卡,開始之前先以 lspci
查看一下顯示卡資訊:
# 查看 NVIDIA GPU 卡型號
lspci | grep NVIDIA
00:05.0 3D controller: NVIDIA Corporation GP102GL [Tesla P40] (rev a1)
安裝前先將所有系統套件更新至最新:
# 更新系統套件
sudo apt update
sudo apt dist-upgrade
安裝 NVIDIA 驅動程式:
# 安裝 NVIDIA 驅動程式
sudo apt install nvidia-384
重新開機:
# 重新開機
sudo reboot
查看 NVIDIA 顯示卡狀態:
# 查看 NVIDIA 顯示卡狀態
nvidia-smi
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 384.130 Driver Version: 384.130 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla P40 Off | 00000000:00:05.0 Off | 0 | | N/A 30C P0 46W / 250W | 0MiB / 22912MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
在此輸出中有顯示 NVIDIA Tesla P40 顯示卡的狀態,表示驅動程式已經可以正常運作。
xorg.conf
對於沒有顯示輸出介面的 Tesla 顯示卡在安裝 VirtualGL 之前,必須先特別設定 xorg.conf
,詳細說明請參考 VirtualGL 的文件。
先取得 NVIDIA GPU 的匯流排(bus)ID:
# 取得 NVIDIA GPU 的匯流排 ID nvidia-xconfig --query-gpu-info
Number of GPUs: 1 GPU #0: Name : Tesla P40 UUID : GPU-31680fad-6351-37f7-fb7b-dcced2444d1a PCI BusID : PCI:0:5:0 Number of Display Devices: 0
查到匯流排 ID 之後,設定 xorg.conf
:
# 設定 xorg.conf sudo nvidia-xconfig -a --allow-empty-initial-configuration --virtual=1920x1200 --busid PCI:0:5:0
這行指令會自動產生一個新的 /etc/X11/xorg.conf
。
雖然 VirtualGL 官方文件上說要指定匯流排 ID,但是我在 Ubuntu Linux 中實測的結果是可以不需要指定的,它會自動抓取所有顯示卡的匯流排 ID,如果有多張顯示卡,就可以用這種方式一次設定好所有的顯示卡:
# 設定 xorg.conf sudo nvidia-xconfig -a --allow-empty-initial-configuration --virtual=1920x1200
但如果在 CentOS Linux 中,這樣自動抓取匯流排 ID 的方式可能會無法使用,就要改回上面手動指定的方式。
從 VirtualGL 與 TurboVNC 官方網站下載安裝套件:
# 下載 VirtualGL wget https://nchc.dl.sourceforge.net/project/virtualgl/2.6.3/virtualgl_2.6.3_amd64.deb # 下載 libjpeg-turbo wget https://nchc.dl.sourceforge.net/project/libjpeg-turbo/2.0.3/libjpeg-turbo-official_2.0.3_amd64.deb # 下載 TurboVNC wget https://nchc.dl.sourceforge.net/project/turbovnc/2.2.3/turbovnc_2.2.3_amd64.deb
先安裝兩個必要的套件:
# 安裝套件
sudo apt install libglu1-mesa mesa-utils
安裝下載的三個套件:
# 安裝套件 sudo dpkg -i libjpeg-turbo-official_2.0.3_amd64.deb virtualgl_2.6.3_amd64.deb turbovnc_2.2.3_amd64.deb
設定 VirtualGL 之前,要先停止 XWindow 相關服務:
# 停止 lightdm 服務 sudo service lightdm stop
設定 VirtualGL,全部都以預設值設定即可:
# 設定 VirtualGL
sudo vglserver_config
將 root
與要使用 VirtualGL 的使用者帳號加入 vglusers
群組:
# 將 root 與一般使用者帳號加入 vglusers 群組 sudo usermod --groups vglusers root sudo usermod --groups vglusers ubuntu
重新啟動 lightdm
服務:
# 啟動 lightdm 服務
sudo service lightdm start
登出之後,再重新登入。合併系統 xauth 金鑰:
# 合併系統 xauth 金鑰
xauth merge /etc/opt/VirtualGL/vgl_xauth_key
vgl_xauth_key
這個檔案無法產生,若遇到找不到該檔案時,請嘗試將 SELinux 關閉,或是調整 SELinux 設定。檢查 VirtualGL 環境:
# 檢查 VirtualGL 環境 xdpyinfo -display :0 /opt/VirtualGL/bin/glxinfo -display :0 -c
[略] OpenGL vendor string: NVIDIA Corporation OpenGL renderer string: Tesla P40/PCIe/SSE2 OpenGL core profile version string: 4.5.0 NVIDIA 384.130 OpenGL core profile shading language version string: 4.50 NVIDIA [略]
若有出現 NVIDIA 顯示卡的型號資訊,就表示已經可以利用伺服器的顯示卡進行 OpenGL 加速了。
先安裝自己需要的桌面環境,若不需要桌面環境,亦可不安裝:
# 安裝 XFCE 桌面環境
apt install xfce4
xfce4
只有包含基本桌面環境,如果需要各種桌面應用程式,可以改裝 xubuntu-desktop
套件。
啟動 TurboVNC 伺服器:
# 啟動 TurboVNC 伺服器
/opt/TurboVNC/bin/vncserver
啟動桌面環境:
# 啟動 XFCE 桌面環境 export DISPLAY=:1 startxfce4
若要讓 TurboVNC 啟動時自動執行 XFCE 桌面,可以直接將啟動指令寫在 $HOME/.vnc/xstartup.turbovnc
指令稿中,例如:
#!/bin/sh # 啟動 XFCE 桌面環境 /usr/bin/startxfce4
在桌面環境中,以 vglrun
執行各種需要 OpenGL 硬體加速的應用程式,即可利用伺服器上面的顯示卡繪製 3D 圖形。
這是以 Paraview 顯示 Volume 影像資料的狀況。
如果系統上有多張 GPU 卡,可以加上 -d
參數來指定要使用的 GPU 卡:
# 使用第一張 GPU 卡執行 glxgears vglrun -d :0.0 glxgears # 使用第二張 GPU 卡執行 glxgears vglrun -d :0.1 glxgears
若要停止 TurboVNC 伺服器,則執行:
# 停止 TurboVNC 伺服器 /opt/TurboVNC/bin/vncserver -kill :1
noVNC 是一個簡單好用的網頁 VNC client,可讓使用者不需要另外安裝 VNC 軟體即可透過瀏覽器操作 VNC 桌面。
先在伺服器上安裝 noVNC 套件:
# 安裝 noVNC 套件
sudo apt install novnc
然後啟動 noVNC 伺服器,將網頁開在 6080
連接埠:
# 啟動 noVNC 伺服器 websockify -D --web=/usr/share/novnc/ 6080 localhost:5901
以 noVNC 網頁開啟 VNC 桌面會像這樣。
在防火牆的設定上,除了開 noVNC 網頁的 6080
連接埠,還要再開一個 WebSocket 用的 5801
連接埠,而如果不使用一般的 VNC client 的話,VNC 用的 5901
可以不開。
參考資料:DigitalOcean