实验室GPU服务器的LXD虚拟化 实验室加了台GPU服务器,因为实验室人数比较多,如果用同一台,文件、环境、软件等错乱混杂,有强迫症。。。所以我们做了虚拟化。
建议安装server版,通过ssh远程 ubuntu镜像
服务器一般有一块SSD和多块机械做成的RAID的阵列,系统安装在SSD(比较小)还有一块RAID阵列的数据盘(如不能访问,在pdf文件夹已经离线好)
显卡驱动安装, 安装NVIDIA显卡驱动、CUDA、cuDNN
LXD 实现虚拟容器
ZFS 用于管理物理磁盘,支持LXD高级功能
bridge-utils 用于搭建网桥
sudo apt-get install lxd zfsutils-linux bridge-utils
因为学校信息中心网络问题,如果配置桥接网卡,会导致流量异常,直接断网,因此实现每人一个ip的方式失败,不得已我们采用端口转发的方式来实现各个容器的网络
首先,我们运行sudo fdisk -l列出服务器上的可用磁盘和分区,我们有两块硬盘,第一块为系统盘,第二块为数据盘,现在我们将数据盘(/dev/sdb)分出需要使用的空间,作为容器的存储卷。
sudo fdisk /dev/sdb
按照下图分出了80GB的分区作为容器的存储卷,分区为/dev/sdb1,剩下的空间同理可以分区,可以作为服务器另外的应用使用
sudo lxc storage create zfs-pool zfs source=/dev/sdb1
sudo lxd init
因为我们已经创建好了一个叫zfs-pool的存储池,所以在lxd初始化时不需要创建新的储存池,之后在进行配置即可
sudo lxc profile edit default
sudo lxc remote add tuna-images https://mirrors.tuna.tsinghua.edu.cn/lxc-images/ --protocol=simplestreams --public
sudo lxc image list tuna-images:
sudo lxc launch tuna-images:ubuntu/18.04 test
sudo lxc exec test bash
我们登录的是root用户,在这个容器中已经存在了一个叫ubuntu的用户
passwd root
passwd ubuntu
容器里的ubuntu是一个很精简的系统,需要安装各种软件
apt install ssh
因为我们没有设置桥接网卡,不能从外部电脑访问容器(不能ping通容器的ip),因此我们采用端口转发的方式来访问我们的容器,所以
exit
sudo lxc list
ip addr
sudo iptables -t nat -A PREROUTING -d 172.22.24.126 -p tcp --dport 60601 -j DNAT --to-destination 10.152.210.183:22
60610是我们定的端口号,通过宿主机的60601端口号映射到容器中22端口号(SSH默认端口号)
ssh [email protected] -p 60601
sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak
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
sudo apt install ubuntu-desktop
sudo apt install gnome-shell gnome-session gnome-panel gnome-terminal -y
sudo apt install git
git clone https://github.com/shenuiuin/LXD_GPU_SERVER
cd LXD_GPU_SERVER/
sudo chmod a+x install-xrdp-2.3.sh
mkdir -p ~/Downloads
./install-xrdp-2.3.sh -s yes -g yes
在安装好XRDP后,与之前一样,因为我们ping不通容器,所以我们需要将xrdp的端口转发到宿主机上
sudo iptables -t nat -A PREROUTING -d 172.22.24.126 -p tcp --dport 60611 -j DNAT --to-destination 10.152.210.183:3389
60611是我们定的端口号,通过宿主机的60611端口号映射到容器中3389端口号(XRDP默认端口号)
可以通过windows的远程连接来使用容器(windows运行mstsc)
接下来就是当普通的ubuntu来使用,比如可以找一些教程:安装完ubuntu必做的事等等我们回到宿主机
lxc config device add yourContainerName gpu gpu
lxc config device add yourContainerName gpu0 gpu id=0
添加好显卡后,就相当于我们给容器安装了显卡,我们回到容器,然后安装显卡驱动
与宿主机的显卡版本必须一致,安装方法参考第一步NVIDIA显卡驱动、CUDN、cuDNN的安装
需要注意的是容器里面安装显卡驱动时需要加上后面的参数,安装时不需要安装到内核
sudo sh ./NVIDIA-Linux-X86_64-[YOURVERSION].run --no-kernel-module
sudo apt update
sudo apt install papirus-icon-theme
git clone https://github.com/vinceliuice/vimix-gtk-themes
cd vimix-gtk-themes
sudo ./vimix-installer
sudo apt install neofetch
neofetch
sudo apt install htop
htop
nvidia-smi
watch -n0.1 nvidia-smi
由于我们用端口转发的方式来连接容器,不过宿主机重启时会丢失路由表规则
sudo iptables -t nat -L PREROUTING --line-number
sudo iptables -t nat -D PREROUTING 1
sudo netfilter-persistent save
sudo netfilter-persistent reload
地址:lxdui
安装lxdui之前需要安装python3-dev,不然会出错
sudo apt install python3-dev
安装好后网页登录管理工具
http:(宿主机ip):15151
lxdui start &
在这个工具里面可以配置容器的各个参数,我们实验室的宿主机为256G内存,cpu48个核,容器主要用的是显卡,其他的参数按照人数平均分配一下,够用就可以
管理员应在桌面上新建使用说明read.txt,写下系统的版本等信息、安装了什么软件、各种注意事项等等
我们把这个配置好的容器当成模板,保存为镜像。
sudo lxc stop test
sudo lxc publish test --alias ubuntudemo --public
以后直接用模板镜像来创建容器,容器创建好后还要为它添加显卡(驱动已经有了),还有用lxdui配置它的参数,最后为它添加端口映射