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 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 | 创建一个remote链接,指向TUNA镜像站。 |
查看容器
运行 sudo lxc list
进行容器列表查看。
运行 sudo lxc exec <ContainerTemplateName> bash
可进入容器的 root 用户下 bash。
可以使用 su ubuntu
或 sudo su
进行用户切换。
1 | 使用以下命令更改容器系统用户密码 |
设置容器
1 | #换源,加速apt-get insatll |
3.2、配置共享目录和 GPU
配置共享目录
1 | sudo lxc config set <yourContainerName> security.privileged true |
配置GPU
1 | #为容器添加所有GPU: |
挂载 nvidia-uvm
①如果宿主机没有/dev/nvidia-uvm
设备,需要通过以下命令挂载设备:
1 | /sbin/modprobe nvidia-uvm |
②挂载设备到容器:
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 | sudo apt install xrdp |
配置 Xrdp
Xrdp 的配置文件位于 /etc/xrdp 目录。对于 Xrdp 的基本连接,只需要配置 Xrdp 即可使用 Xfce 。
1 | sudo vim /etc/xrdp/xrdp.ini |
在文件末尾添加以下内容并保存:
exec startxfce4
此外,该文件中可配置 xrdp 远程桌面服务的端口号(默认端口为3389)
1 | # 重新启动 Xrdp 服务: |
端口转发
1 | # 在安装好XRDP后,与之前一样,因为我们ping不通容器,所以我们需要使用宿主机的端口号监听容器的xrdp的端口3389 |
现在可以通过windows的远程连接或者ubuntu的Remmina 来使用容器。
3.4、创建容器模板并分发
为容器修改参数配置
1 | sudo lxc config edit YourContainerName |
一般使用以下的配置即可满足
配置默认容器参数(新容器的参数会继承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 | sudo lxc copy tiger ubuntudemo |
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 | #步骤一、安装TigerVNC Server软件包 |
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/