1、 背景

对实验室多台工作站的多块GPU进行合理的管理和使用分配规划及申请/授权/使用自动管理,希望工作站可以作为服务器使用,能够多人同时使用,互不影响。

2、需求

  • 不同用户之间不能相互影响且可以同时使用
  • 用户注册登录使用需要被授权
  • 用户要能方便地访问自己的“机器”
  • 用户要有足够大的权限,能自由地安装程序,能自由地访问网络
  • 用户不被允许直接操作宿主机

3、具体方案

3.1、LXD/ZFS 安装及配置

LXD 软件安装s

LXD:用于创建和管理容器
ZFS:用于管理物理磁盘,支持 LXD 高级功能,负责容器存储。
Bridge-Utils:用于搭建网桥,负责容器上网。

1
sudo apt-get install lxd zfsutils-linux bridge-utils

初始化 LXD

运行 sudo lxd init 进行 LXD 初始化配置,选项如下图:

lxd

  • LXD Clustering:不需要
  • new storage pool:需要创建一个存储池
  • Name of storage pool:给存储池命名
  • storage backend:存储后端,使用 ZFS
  • Create a new ZFS pool:需要创建一个 ZFS 池
  • use an existing block device:Yes
  • Path to block device:使用已有的磁盘分区用于 ZFS 的存储后端。这里用的2T硬盘
  • MAAS server?:不知道是啥,不需要
  • new local network bridge?:需要,我只需要使用 LXD 默认的网桥即可。
  • new bridge be called:给网桥命名
  • iPv4:默认 auto
  • IPv6:默认 auto
  • LXD available over the network?:默认 no
  • stale cached?:默认 yes
  • YAML printed?:选择yes,查看容器配置信息

新建容器

1
2
3
4
5
6
# 创建一个remote链接,指向TUNA镜像站。
sudo lxc remote add tuna-images https://mirrors.tuna.tsinghua.edu.cn/lxc-images/ --protocol=simplestreams --public
# 查看镜像列表,寻找合适的镜像的FINGERPRINT,用于下载
sudo lxc image list tuna-images:
# 举例,创建一个名为tiger的容器。在lxc清华源中使用ubuntu/18.04
sudo lxc launch tuna-images:ubuntu/18.04 tiger

查看容器

运行 sudo lxc list 进行容器列表查看。

运行 sudo lxc exec <ContainerTemplateName> bash 可进入容器的 root 用户下 bash。

可以使用 su ubuntusudo su 进行用户切换。

1
2
3
4
#使用以下命令更改容器系统用户密码
passwd ubuntu
passwd root
#后面远程登陆会用到

设置容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#换源,加速apt-get insatll
sudo vim /etc/apt/sources.list
====
deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
===
#刷新源
sudo apt update
#安装必要工具
apt install make cmake openssh-server gcc g++ build-essential
#启动ssh命令
sudo service ssh start
#端口转发60601是我们定的端口号,通过宿主机的60601端口号监听容器中22端口号(SSH默认端口号)
sudo lxc config device add <container> proxy0 proxy listen=tcp:172.22.24.126:60601 connect=tcp:10.152.210.183:22 bind=host
#此时就可以使用校园网访问
ssh ubuntu@172.22.24.126 -p 60601

3.2、配置共享目录和 GPU

配置共享目录

1
2
3
4
5
sudo lxc config set <yourContainerName> security.privileged true
sudo lxc config device add <yourContainerName> <shareName> disk source=path1 path=path2
#举例
sudo lxc config device add tiger father disk source=/home/gdz path=/father
# path1为宿主机路径,path2为容器内路径

配置GPU

1
2
3
4
5
6
#为容器添加所有GPU:
sudo lxc config device add <yourContainerName> gpu gpu
#添加指定GPU:
sudo lxc config device add <yourContainerName> gpu0 gpu id=0
# 安装驱动:在容器中显卡驱动不需要安装内核文件,安装宿主机显卡驱动的版本,通过共享目录传至容器中
sudo sh /NVIDIA-Linux-x86_64-xxx.xx.run --no-kernel-module

挂载 nvidia-uvm

①如果宿主机没有/dev/nvidia-uvm设备,需要通过以下命令挂载设备:

1
2
3
/sbin/modprobe nvidia-uvm
D=`grep nvidia-uvm /proc/devices | awk '{print $1}'`
mknod -m 666 /dev/nvidia-uvm c $D 0

②挂载设备到容器:

1
sudo lxc config device add yourContainerName nvidia-uvm unix-char path=/dev/nvidia-uvm

3.3、配置图形桌面

Xrdp 是 Microsoft 远程桌面协议 (RDP) 的开源实现,允许以图形方式控制远程系统。使用 RDP 可以登录到远程计算机并创建一个真实的桌面会话,就像您已登录到本地计算机一样。

Ubuntu 存储库中有好几个桌面环境,这里我们将安装 Xfce 。它是一个快速,稳定和轻量级的桌面环境,非常适合在远程服务器上使用

安装 Xrdp

1
2
3
sudo apt install xrdp
# 安装完成后 Xrdp 服务将自动运行,您可以通过键入以下指令来验证 Xrdp 是否正在运行
sudo systemctl status xrdp

配置 Xrdp

Xrdp 的配置文件位于 /etc/xrdp 目录。对于 Xrdp 的基本连接,只需要配置 Xrdp 即可使用 Xfce 。

1
sudo vim /etc/xrdp/xrdp.ini

在文件末尾添加以下内容并保存:

exec startxfce4

此外,该文件中可配置 xrdp 远程桌面服务的端口号(默认端口为3389)

1
2
# 重新启动 Xrdp 服务:
sudo systemctl restart xrdp

端口转发

1
2
# 在安装好XRDP后,与之前一样,因为我们ping不通容器,所以我们需要使用宿主机的端口号监听容器的xrdp的端口3389
sudo lxc config device add <container> proxy1 proxy listen=tcp:172.22.24.126:60611 connect=tcp:10.152.210.183:3389 bind=host

现在可以通过windows的远程连接或者ubuntu的Remmina 来使用容器。

1

3.4、创建容器模板并分发

为容器修改参数配置

1
sudo lxc config edit YourContainerName

一般使用以下的配置即可满足

img

配置默认容器参数(新容器的参数会继承default配置的参数,容器会优先使用自己的参数)

1
sudo lxc profile edit default

我们把这个配置好的容器当成模板,保存为镜像

停止容器

1
sudo lxc stop test

将该容器复制为ubuntudemo,作为以后容器分发的模板

1
sudo lxc copy tiger ubuntudemo

并删除端口转发

1
sudo lxc config device remove ubuntudemo proxy1

现在,建立第二个容器bigdog吧,记得把端口转发设置下,并设置容器的初始密码

1
2
sudo lxc copy tiger ubuntudemo
sudo lxc config device add bigdog proxy1 proxy listen=tcp:xx.xx.xx.xx:60621 connect=tcp:10.176.88.68:3389 bind=host

3.5、LXDUI 可视化管理界面

在宿主机上根据AdaptiveScale/lxdui: LXDUI is a web UI for the native Linux container technology LXD/LXC (github.com)配置可视化管理界面,如下,方便地管理容器

4、宿主机的远程访问

使用xdrp访问宿主机默认桌面

4.1、设置ubuntu

首先,我们先设置Ubuntu的远程控制,将其设置为允许被远程连接,进入系统-》首选项-》桌面共享,或者直接搜索桌面共享

将【允许其他人查看您的桌面】这一项勾上,然后在安全那项,勾选【要求远程用户输入此密码】,并设置远程密码。并且我们取消勾选【必须为对本机器的每次访问进行确定】(这样做,是为了被远程的时候不需要再确认,否则每次远程都要人为确认才能被远程,会很繁琐)如图所示:

4.2、安装xdrp+vnc

1
2
3
4
5
6
7
8
#步骤一、安装TigerVNC Server软件包
sudo apt-get install tightvncserver (使用在线安装)
#步骤二、安装xrdp
sudo apt-get install xrdp -y
#步骤三、编辑配置:
sudo vi /etc/xrdp/startwm.sh
#把最下面的test和exec两行注释掉,添加一行
unity

4.3、安装dconf-editor(取消权限限制)

再次,我们需要取消掉请求加密的功能,否则缺少这一步是无法远程上的,这个时候我们需要安装dconf-editor工具进行配置,输入以下命令:

1
sudo apt-get install dconf-editor

安装完成之后,我们需要打开dconf-editor工具,在桌面搜索dconf-editor打开,如图所示:

打开之后,依次展开org->gnome->desktop->remote-access,然后取消 “requlre-encryption”的勾选即可。如图所示:

至此,前期准备工作已经完成,后面直接通过VNC工具或者Windows自带的mstsc(远程桌面控制)进行访问就行。

5、总结

现在就可以在宿舍或家里使用校园网访问工作站了,不管是宿主机还是容器都可以远程访问桌面。容器内已安装好cuda和显卡驱动,以及pycharm、miniconda、Chrome浏览器。

通过此次练习与配置,对Linux环境更加熟悉了,准备整理一篇Linux常用命令供自己查阅使用。

参考链接:

shenuiuin/LXD_GPU_SERVER: 实验室GPU服务器的LXD虚拟化 (github.com)

https://blog.csdn.net/wangke0809/article/details/80235989

https://blog.yangl1996.com/post/gpu-passthrough-for-lxc/

https://abcdabcd987.com/setup-shared-gpu-server-for-labs/

https://github.com/abcdabcd987/lxc-gpu

https://blog.csdn.net/weixin_42749767/article/details/83720831?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.pc_relevant_is_cache&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.pc_relevant_is_cache

https://developer.aliyun.com/article/578196