专栏系列文章如下:
一.开发记录之AHRS、惯导传感器SBG-Ellipse-N传感器配置和使用_goldqiu的博客-CSDN博客
二.开发记录之派勤工控机远程使用和ubuntu和ROS环境配置_goldqiu的博客-CSDN博客
三.开发记录之移动硬盘装ubuntu系统的配置、环境、各类软件安装和备份等_goldqiu的博客-CSDN博客
四.开发记录之ubuntu系统安装ROS和开发环境_goldqiu的博客-CSDN博客
五.开发记录之ubuntu系统安装各个软件_goldqiu的博客-CSDN博客
实验室GPU服务器的LXD虚拟化
实验室加了台GPU服务器用于深度学习,因为实验室人数比较多,但是每个人使用的软件千差万别,多人使用同一台的话,软件,环境,文件,配置杂七杂八。甚至还有小白会运行损害系统的命令。
所以我们做了虚拟化。为什么使用LXD呢,而不是使用最热门的docker呢?
两者都是基于lxc虚拟化,而docker作为应用容器,LXD是系统容器(可以安装完整的桌面有没有很赞),更加接近我们的生产环境,想象一下,别人使用docker时,还要自己使用命令上传文件,运行程序。尤其是小白对着黑框框会很头疼。而自己打开远程,打开pycharm,美滋滋。去除什么linux不要用桌面的想法,2202年了,ubuntu桌面已经很稳定了。接下来就来安装使用吧。
注意:标注重要的一定要看。
管理员应在桌面上新建使用说明read.txt,写下系统的版本等信息、安装了什么软件、各种注意事项等等
之前就已经安好了。
LXD 实现虚拟容器
ZFS 用于管理物理磁盘,支持LXD高级功能
bridge-utils 用于搭建网桥
sudo apt-get install lxd zfsutils-linux bridge-utils
因为学校信息中心网络的限制,如果配置桥接网卡,会导致流量异常,直接断网,因此实现每人一个ip的方式失败,不得已我们采用端口监听的方式来实现各个容器的连接(如果你不想使用监听的方式请自行上网查询LXD配置桥接网卡)
首先,我们运行sudo fdisk -l列出服务器上的可用磁盘和分区,我们有两块硬盘,第一块为系统盘,第二块为数据盘,数据盘用来搭建LXD系统。
在块设备 /dev/sdb上创建一个ZFS存储池(硬盘地址根据实际改动)
sudo lxc storage create zfs-pool zfs source=/dev/sdb(硬盘地址根据实际改动)
sudo lxd init
因为我们已经创建好了一个叫zfs-pool的存储池,所以在lxd初始化时不需要创建新的储存池,之后在进行配置即可
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]: yes
Name of the new storage pool [default=default]: default
Name of the storage backend to use (btrfs, dir, lvm, zfs) [default=zfs]: zfs
Create a new ZFS pool? (yes/no) [default=yes]: yes
Would you like to use an existing block device? (yes/no) [default=no]: yes
# 这里输入我们刚刚做的分区
Path to the existing block device:/dev/sda1
# 每个容器的默认大小
Size in GB of the new loop device (1GB minimum) [default=30GB]: 1024G
Would you like to connect to a MAAS server? (yes/no) [default=no]:
# 是否创建桥接网络
Would you like to create a new local network bridge? (yes/no) [default=yes]: yes
What should the new bridge be called? [default=lxdbr0]: lxdbr0
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: auto
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: auto
Would you like the LXD server to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
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:
使用清华源中的ubuntu镜像创建一个叫test的容器
sudo lxc launch tuna-images:ubuntu/18.04 test
sudo lxc exec test bash
我们登录的是root用户,在这个容器中已经存在了一个叫ubuntu的用户
passwd root
passwd ubuntu
容器里的ubuntu是一个很精简的系统,需要安装各种软件
apt install ssh
查看容器与宿主机的ip因为我们没有设置桥接网卡,不能从外部电脑访问容器(不能ping通容器的ip),因此我们采用端口监听的方式来访问我们的容器。
退出容器
exit
在宿主机查看容器
sudo lxc list
可知容器的ip地址
ip addr
可知宿主机ip
sudo lxc config device add test(这里是容器名) proxy0(ssh为proxy0) proxy listen=tcp:172.22.24.126(宿主机ip):60601 connect=tcp:10.152.210.183(容器ip):22 bind=host
60601是我们定的端口号,通过宿主机的60601端口号监听容器中22端口号(SSH默认端口号)
sudo lxc config device add test(这里是容器名) proxy1(RDP为proxy1) proxy listen=tcp:172.22.24.126(宿主机ip):60611 connect=tcp:10.152.210.183(容器ip):3389 bind=host
60611是我们定的端口号,通过宿主机的60611端口号监听容器中3389端口号(RDP默认端口号)
RDP用于远程界面(转播3389端口),SSH用于远程命令和传输文件(转播22端口)
ssh [email protected](宿主机ip) -p 60601
备份原来的源
sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak
编辑写入网易源 (中国源)
(注意系统版本 ubuntu 18.04 bionic)
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
我们回到宿主机为容器添加所有GPU:
lxc config device add yourContainerName gpu 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
到了这一步可以看第七步:容器模板,将server版的容器导出为镜像,可供不需要桌面的同学使用(推荐可以使用VSCode安装Remote SSH插件连接远程服务器)
刷新源
sudo apt update
安装无推荐软件的ubuntu桌面(默认安装gnome,完整安装会有很多无关的软件)
sudo apt install --no-install-recommends ubuntu-desktop
使用安装脚本(安装git后下载我们之后需要用的东西)
sudo apt install gitgit clone https://github.com/shenuiuin/LXD_GPU_SERVER
打开文件夹
cd LXD_GPU_SERVER/
赋予脚本可执行权限
sudo chmod a+x xrdp-installer-1.2.sh
脚本会下载一些文件,需要有Downloads文件夹
mkdir -p ~/Downloads
安装脚本
./xrdp-installer-1.2.sh -c -l -s
安装完成
脚本源地址
kde桌面环境以及xrdp安装、
xfce桌面环境以及xrdp安装
xrdp解决声音重定向
端口转发在安装好XRDP后,与之前一样,因为我们ping不通容器,所以我们需要使用宿主机的端口号监听容器的xrdp的端口
sudo lxc config device add test proxy1 proxy listen=tcp:172.22.24.126:60611 connect=tcp:10.152.210.183:3389 bind=host
远程连接60611是我们定的端口号,通过宿主机的60611端口号监听容器中3389端口号(XRDP默认端口号)可以通过windows的远程连接来使用容器(windows运行mstsc)
icon图标主题
sudo apt updatesudo apt install papirus-icon-theme
GTK主题
git clone https://github.com/vinceliuice/vimix-gtk-themescd vimix-gtk-themes
sudo ./vimix-installer
应用主题主题安装好后用使用gnome-tweak-toos来应用主题
搜狗输入法、谷歌浏览器等等显示Linux系统信息
sudo apt install neofetchneofetch
查看CPU运行以及内存占用情况
sudo apt install htop
htop
查看显卡运行情况
nvidia-smi
实时查看显卡运行情况(按照0.1s的频率实时刷新)
watch -n0.1 nvidia-smi
查看zfs储存卷的占用情况
zpool list
为容器修改参数配置
我们不想每个人使用全部的硬件资源,所以还需要限制每个人的参数容器参数配置说明配置容器参数lxc config edit YourContainerName
sudo lxc profile edit default
我们把这个配置好的容器当成模板,保存为镜像。
停止容器
sudo lxc stop test
将test容器保存为ubuntudemo镜像
sudo lxc publish test --alias ubuntudemo --public
从模板镜像中新建容器以后直接用模板镜像来创建容器,容器创建好后修改它的配置文件:添加端口映射(远程连接与SSH)、添加显卡(显卡驱动已经有了)、配置硬件参数,(可使用默认配置文件,使得新容器的参数继承于它,这一步就可以省略)
使用镜像备份直接导入容器(如果嫌制作容器麻烦或者有问题可直接导入)下载我制作的镜像备份文件(ubuntu2004_xrdp,用户名和密码都为ubuntu)
https://pan.baidu.com/s/1AlnyEblEfP1ruIw9sg5Dtw 密码: cb25
拷贝至服务器,在该文件目录下导入镜像
lxc image import 4dd4710a11c146cbdbba13d7bc8c9fb69d7dca8fb93680b4a9285d2951b05db6.tar.gz --alias ubuntu_demo
就可以直接使用导入的镜像来创建容器,容器创建好后为它添加显卡和端口监听(远程连接与SSH),还有为容器安装显卡驱动(每个人的显卡驱动版本不同,我就没有安装了) 在lxd容器中使用docker
lxc config edit YourContainerName
lxc restart YourContainerName
在容器内安装docker
path1为宿主机路径,path2为容器内路径。
lxc config set yourContainerName security.privileged truelxc config device add privilegedContainerName shareName disk source=path1 path=path2
若容器内对共享目录沒有权限,只需将宿主机目录路径权限给足
sudo chmod -R 777 path1
使用自定义lxd容器上述lxd容器只能使用镜像源中,但如果我们想使用自己喜欢的发行版,或者自己已经有一台各方面已经调教满意的linux实体机,不想折腾了。这时候我们便可以将此系统移植到lxd中
lxc image import 4dd4710a11c146cbdbba13d7bc8c9fb69d7dca8fb93680b4a9285d2951b05db6.tar.gz(镜像压缩包) --alias ubuntu_demo
(随便取)
通过lxc image ls
查看本机已有的镜像
通过lxc exec tf bash
可以进入容器内进行操作:
exit
:退出容器
lxc stop tf
:停止容器
lxc delete tf
:删除容器
lxc restart tf
:重启容器
sudo lxc image list 查看镜像id
sudo lxc launch id name(容器名)
sudo lxc list
可知容器的ip地址
ip addr
可知宿主机ip
sudo lxc config device add test(这里是容器名) proxy0(ssh为proxy0) proxy listen=tcp:172.22.24.126(宿主机ip):60601 connect=tcp:10.152.210.183(容器ip):22 bind=host
60601是我们定的端口号,通过宿主机的60601端口号监听容器中22端口号(SSH默认端口号)
sudo lxc config device add test(这里是容器名) proxy1(RDP为proxy1) proxy listen=tcp:172.22.24.126(宿主机ip):60611 connect=tcp:10.152.210.183(容器ip):3389 bind=host
60611是我们定的端口号,通过宿主机的60611端口号监听容器中3389端口号(RDP默认端口号)
RDP用于远程界面(转播3389端口),SSH用于远程命令和传输文件(转播22端口)
这里注意端口号按照顺序依次添加,ssh是01~09,rdp是11~19
我们回到宿主机为容器添加所有GPU:
lxc config device add yourContainerName gpu gpu
添加指定GPU:
lxc config device add yourContainerName gpu0 gpu id=0
ssh [email protected](宿主机ip) -p 60601(ssh转播端口号)
172.22.24.126(宿主机ip):60611(rdp转播端口号)
安装显卡驱动
sudo apt-get remove --purge nvidia*
设置为清华源
sudo apt-get update
sudo apt install nvidia-driver-470
sudo reboot
nvidia-smi
搞定
安装cuda:
https://blog.csdn.net/weixin_43742643/article/details/115355545
安装其他如ros、webots、anaconda后续有问题可以在这里补充。
https://github.com/shenuiuin/LXD_GPU_SERVER
https://www.wangt.cc/2021/09/基于lxd搭建多人共用gpu服务器,简单易用,全网最详/
ps: 该文为整理搭建过程,有些是直接在网上大佬博客中复制的,侵权即删。