本篇記錄在 Ubuntu Linux 16.04.6 LTS 的 VM 環境之下,安裝 VirtualGL 與 VNC 伺服器,實作遠端 3D 繪圖伺服器的過程。

安裝 NVIDIA 顯示卡驅動程式

我們的測試環境中,已經有一張 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 顯示卡的狀態,表示驅動程式已經可以正常運作。

設定 NVIDIA 顯示卡與 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 與 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
CentOS Linux 系統下的 SELinux 可能會讓 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 圖形。

Xfce4 桌面

Xfce4 桌面

這是以 Paraview 顯示 Volume 影像資料的狀況。

Paraview 顯示 Volume 資料

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

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 網頁 VNC client

noVNC 網頁 VNC client

在防火牆的設定上,除了開 noVNC 網頁的 6080 連接埠,還要再開一個 WebSocket 用的 5801 連接埠,而如果不使用一般的 VNC client 的話,VNC 用的 5901 可以不開。

參考資料:DigitalOcean