使用NICE DCV管理带有GPU的Ubuntu桌面

注:半年前写的,之前忘记发布,这次更新上来

一、背景

1、NICE DCV简介

NICE DCV是一个高性能的远程显示管理协议,允许用户安全的将云上远程桌面和应用以流式方式通过网络传输到客户端。在Amazon EC2上安装NICE DCV,客户可以运行支持GPU的图形应用程序或HPC程序,替代昂贵的图形工作站。NICE DCV流式传输协议也被用在多个服务,包括Amazon Appstream 2.0,AWS Nimble Studio,以及AWS RoboMaker。

NICE DCV可以使用单机模式从客户端直接连接到EC2;也可以使用NICE DCV Connection Gateway,NICE DCV Session Session Manager Broker和NICE DCV Session Manager Agent进行多机会话管理。本文描述使用NICE DCV直接连接到EC2单机模式部署。

2、选择适当的Nvidia驱动

NICE DCV搭配带有GPU的EC2实例,被广泛用于图形工作站等需要3D渲染的场景。在实际使用中,非GPU实例例如C5系列EC2也可以部署DCV进行远程管理,但此时需要额外配置xDummy Driver模拟GPU,有关配置请参考官方文档,本文不再描述。

Nvidia的GPU提供三种驱动程序,针对三种计算模式:

  • Telsa驱动,通用计算型,对应P3/P4等机型;
  • Grid驱动,适合图形工作站等场景,对应G4/G5等Nvidia GPU机型;
  • Gaming游戏驱动,适合游戏和3D,对应G4/G5等Nvidia GPU机型。

三种驱动的详细说明可以参考文本末尾的参考文档。注意这三种驱动程序与游戏级别显卡从Nvidia官网下载的公版驱动有所不同,在云上使用GPU实例时请使用亚马逊云科技官方提供的驱动程序。

在本实验中,采用EC2 G4dn实例搭配Ubuntu Server 20.04操作系统和Grid驱动。

3、选择DCV模式

在NICE DCV使用场景中,分别支持连接到控制台的Console Sessions和多用户Virtual Sessions两种模式。

类型ConsoleVirtual
操作系统Windows和Linux仅Linux
多用户每个EC2单一用户EC2可多用户使用
权限管理员用户管理员或普通用户
屏幕捕捉直接每个用户独立启动X Server(Xdcv)
GPU支持支持支持但需要额外安装DCV-GL驱动

通过以上对比表格可以看出,为满足Ubuntu桌面的GPU应用需求,使用Console Sessions模式更为简单直接。

4、选择Linux桌面管理器

Linux窗口管理器随不同操作系统有所不同,例如RHEL 7.x/8.x和CentOS 7.x/8.x将GDM作为默认的桌面管理器,并使用Gnome3作为图形桌面。在本文提供的Ubuntu Server 20.04系统上,默认桌面管理器是GDM3,并也使用Gnome3作为图形桌面。

请注意,NICE DCV不支持以LightGDM窗口管理器的Console Sessions模式,因此如果您额外安装了LightGDM并替换了系统默认的GDM作为窗口管理器,那么则只能使用Virtual Session模式。

为简化部署和使用,本文以使用Ubuntu Server 20.04自带的GDM为例,使用Console Sessions模式进行配置。

二、EC2 Linux下Nvidia驱动安装

1、启动EC2并安装桌面图形环境

首先启动一个Ubuntu Server 20.04操作系统,从Quick Start的官方镜像中启动Ubuntu Server 20.04 LTS (HVM)版本。创建时候请选择磁盘为GP3类型,容量建议为50GB以上以便于安装各种软件包。安全规则组除必要的远程登录管理外,还需要开放DCV协议需要的TCP协议8443端口。如果希望使用QUIC协议改善弱网下的访问速度,则还需要打开UDP协议8443端口。

创建好EC2后远程登录,以root身份执行升级和安装图形桌面:

apt-get update && apt-get upgrade -y
apt install gdm3 ubuntu-desktop mesa-utils net-tools awscli -y
sed -i 's/'"#WaylandEnable=false"'/'"WaylandEnable=false"'/g' /etc/gdm3/custom.conf
systemctl set-default graphical.target
reboot

2、安装Nvidia Grid驱动的准备工作

首先升级内核模块。

apt-get upgrade -y linux-aws
reboot

安装当前内核对应的头文件用于后续编译内核模块。然后将Nvidia公版驱动程序的名称加入内核模块的黑名单。

apt-get install -y gcc make linux-headers-$(uname -r)
cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv
EOF
echo GRUB_CMDLINE_LINUX="rdblacklist=nouveau" >> /etc/default/grub
update-grub

3、下载并安装Nvidia grid驱动

使用一台具有S3访问权限的EC2,从S3存储桶内获取Grid驱动。存储桶路径是s3://ec2-linux-nvidia-drivers/latest/。将驱动下载到GPU机型上。

以root身份执行如下命令:

chmod +x NVIDIA-Linux-x86_64*.run
/bin/sh ./NVIDIA-Linux-x86_64*.run
reboot

注意在安装过程中,会提示warning信息找不到libglvnd的配置文件路径,不影响安装,按回车键继续即可完成。

4、测试GPU驱动加载正确

在安装完毕后需要从重启。重启后执行如下命令,确认Nvidia驱动状态:

nvidia-smi -q | head

如果返回信息显示类似如下,则表示安装成功。

oot@ip-172-31-36-85:~# nvidia-smi -q | head

==============NVSMI LOG==============

Timestamp                                 : Thu Feb 10 08:37:29 2022
Driver Version                            : 470.82.01
CUDA Version                              : 11.4

Attached GPUs                             : 1
GPU 00000000:00:1E.0
    Product Name                          : Tesla T4
root@ip-172-31-36-85:~#

5、配置显示器

如果是单显示器,则执行:

rm -rf /etc/X11/XF86Config*
nvidia-xconfig --preserve-busid --enable-all-gpus
systemctl isolate multi-user.target
systemctl isolate graphical.target

如果需要最高4个4K显示器,则执行:

rm -rf /etc/X11/XF86Config*
nvidia-xconfig --preserve-busid --enable-all-gpus --connected-monitor=DFP-0,DFP-1,DFP-2,DFP-3
systemctl isolate multi-user.target
systemctl isolate graphical.target

6、验证硬件加速有效

运行如下命令:

sudo DISPLAY=:0 XAUTHORITY=$(ps aux | grep "X.*\-auth" | grep -v grep | sed -n 's/.*-auth \([^ ]\+\).*/\1/p') glxinfo | grep -i "opengl.*version"

返回如下结果,则表示硬件加速工作正常:

OpenGL core profile version string: 4.6.0 NVIDIA 470.82.01
OpenGL core profile shading language version string: 4.60 NVIDIA
OpenGL version string: 4.6.0 NVIDIA 470.82.01
OpenGL shading language version string: 4.60 NVIDIA
OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 470.82.01
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20

三、安装DCV并启动服务

如前文所述,本文使用Console Session配置。

1、安装DCV Server

以root身份执行如下命令:

wget https://d1uj6qtbmh3dt5.cloudfront.net/NICE-GPG-KEY
gpg --import NICE-GPG-KEY

访问NICE DCV官网下载最新版本:

https://download.nice-dcv.com/

解压缩后进入目录,例如文件名是nice-dcv-2021.3-11591-ubuntu2004-x86_64。执行安装:

wget https://d1uj6qtbmh3dt5.cloudfront.net/nice-dcv-ubuntu2004-x86_64.tgz
tar zxvf nice-dcv-ubuntu2004-x86_64.tgz
cd nice-dcv-2021.3-11591-ubuntu2004-x86_64
apt install ./nice-dcv-server_2021.3.11591-1_amd64.ubuntu2004.deb
usermod -aG video dcv
systemctl isolate multi-user.target
systemctl isolate graphical.target
systemctl enable dcvserver
systemctl start dcvserver

2、启动DCV Server Session

修改配置文件实现自动启动,编辑/etc/dcv/dcv.conf配置文件,找到如下一段:

create-session = true

将现有配置文件中,将以上参数前边的#注释符号去掉即可。保存退出后,再重启服务:

systemctl restart dcvserver

要验证Session已经启动成功,执行如下命令即可查看当前Session:

dcv list-sessions

3、配置License许可

在EC2上运行DCV需要许可证授权,授权方式是为EC2赋予一个IAM Role,允许EC2读取S3的特定位置确认License状态。

进入IAM角色,编辑一个IAM Policy即策略,内容如下:

{
    "Version": "2012-10-17",
    "Statement": [
       {
           "Effect": "Allow",
           "Action": "s3:GetObject",
           "Resource": "arn:aws:s3:::dcv-license.eu-central-1/*"
       }
    ]
}

将以上策略保存为DCV-License。找到当前EC2正在使用的IAM Role,将这个策略挂载上去。即可。另外需要注意,请替换以上规则中存储桶的名称中的最后的region后缀为您正在使用的region。

4、设置EC2的操作系统用户密码

为本机设置ubuntu用户(EC2 AMI内置用户)和root用户的密码。执行如下命令:

passwd ubuntu
passwd root

分别设置密码。其中root密码将用于DCV认证。而普通用户ubuntu用户的密码将用于登录Gnome桌面(Gnome默认禁止root登录)。

四、登录到Linux桌面

1、安装DCV客户端

在要登录到DCV桌面的电脑上安装客户端,可选Windows、Linux和MacOS的对应版本。访问NICE DCV官网下载最新版本:

https://download.nice-dcv.com/

2、登录

启动客户端,输入EC2对应的公网IP。

在DCV登录窗口中,输入用户名root和密码。然后DCV将打开Ubuntu自己的Gnome桌面,此时使用ubuntu用户名登录,输入对应密码,即可开始使用Ubuntu。

3、验证3D加速正常

为验证3D加速工作正常,需要在运行Ubuntu的EC2上安装glmark2工具。

apt-get install glmark2

执行glmark2即可运行benchmark工具,输出正常则表示3D加速工作正常。

4、下载3D演示环境(可选)

在运行Ubuntu的EC2上执行如下命令下载和安装:

wget https://assets.unigine.com/d/Unigine_Superposition-1.1.run
chmod 755 Unigine_Superposition-1.1.run
./Unigine_Superposition-1.1.run

安装完毕后,可在当前ubuntu用户桌面上找到文件夹Unigine_Superposition-1.1,进入其中,双击执行Superposition主程序即可开始3D Benchmark测试。

5、使用UDP协议优化弱网环境访问(可选)

默认DCV是使用TCP协议8443,对网络开销较高。如果访问环境延迟较高,例如存在广域网跨国等场景,则可开启QUIC协议改用UDP协议传输,此时需要修改配置文件开启8443端口,并确认安全规则组上已放行。

编辑配置文件/etc/dcv/dcv.conf,找到如下一段[connectivity],配置修改为如下:

enable-quic-frontend=true
quic-port=8443
web-port=8443

重启服务生效。执行如下命令:

systemctl restart dcvserver

6、允许剪贴板复制粘贴(可选)

编辑配置文件/etc/dcv/dcv.conf,在文件最末尾加入如下配置:

[clipboard]
primary-selection-copy=true

重启服务生效。

systemctl restart dcvserver

由此一个带有GPU的Ubuntu Server 20.04实例部署完成,使用者可通过NICE DCV开始远程工作。

五、小结

以上配置过程部署了一个基于Ubuntu Server 20.04操作系统的G4dn EC2 GPU实例,并使用NICE DCV远程管理。部署期间分别经历了图形环境安装、内核升级、Nvidia驱动安装和DCV Server安装等几个过程,由此用户可以开始通过Console Sessions访问EC2的控制台并开始使用图形应用。本文使用的是相对简单的GDM3+Gnome+Console Sessions模式,如果需要更复杂的配置模式,可参考文末附带的官方文档链接。

六、参考文档:

在EC2上Nvidia驱动安装:

https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/install-nvidia-driver.html

NICE DCV Session模式简介:

https://docs.aws.amazon.com/dcv/latest/adminguide/managing-sessions.html

Linux桌面管理器选择:

https://docs.aws.amazon.com/dcv/latest/adminguide/setting-up-installing-linux-prereq.html#linux-prereq-gui

NICE DCV安装:

https://docs.aws.amazon.com/dcv/latest/adminguide/setting-up-installing-linux.html

非GPU进行安装xDummy Driver:

https://docs.aws.amazon.com/dcv/latest/adminguide/setting-up-installing-linux-prereq.html#linux-prereq-nongpu