六.开发记录之实验室服务器LXD部署

专栏系列文章如下:

一.开发记录之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的安装

第一步:宿主机的安装与配置

之前就已经安好了。

第二步:lxd的安装与初始化

安装lxd

LXD 实现虚拟容器

ZFS 用于管理物理磁盘,支持LXD高级功能

bridge-utils 用于搭建网桥

安装LXD、ZFS和bridge-utils

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

配置网桥:

因为学校信息中心网络的限制,如果配置桥接网卡,会导致流量异常,直接断网,因此实现每人一个ip的方式失败,不得已我们采用端口监听的方式来实现各个容器的连接(如果你不想使用监听的方式请自行上网查询LXD配置桥接网卡)

配置ZFS

首先,我们运行sudo fdisk -l列出服务器上的可用磁盘和分区,我们有两块硬盘,第一块为系统盘,第二块为数据盘,数据盘用来搭建LXD系统。

创建块设备

在块设备 /dev/sdb上创建一个ZFS存储池(硬盘地址根据实际改动)

sudo lxc storage create zfs-pool zfs source=/dev/sdb(硬盘地址根据实际改动)

LXD初始化

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容器

使用清华源中的ubuntu镜像创建一个叫test的容器

sudo lxc launch tuna-images:ubuntu/18.04 test

进入容器

sudo lxc exec test bash

我们登录的是root用户,在这个容器中已经存在了一个叫ubuntu的用户

修改密码

passwd root

passwd ubuntu

容器里的ubuntu是一个很精简的系统,需要安装各种软件

安装ssh

apt install ssh

通过ssh连接容器

查看容器与宿主机的ip因为我们没有设置桥接网卡,不能从外部电脑访问容器(不能ping通容器的ip),因此我们采用端口监听的方式来访问我们的容器。

退出容器

exit

在宿主机查看容器

sudo lxc list

可知容器的ip地址

查看宿主机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连接容器并配置

ssh  [email protected](宿主机ip) -p 60601

1. 更换源

备份原来的源

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

2. 为容器添加显卡

我们回到宿主机为容器添加所有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插件连接远程服务器)

3. 安装图形化界面

刷新源

sudo apt update

安装无推荐软件的ubuntu桌面(默认安装gnome,完整安装会有很多无关的软件)

sudo apt install --no-install-recommends ubuntu-desktop

4.安装远程连接

使用安装脚本(安装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解决声音重定向

5. 远程连接测试

端口转发在安装好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)

第五步:ubuntu的美化等配置

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

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

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中

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

:重启容器

新建容器

六.开发记录之实验室服务器LXD部署_第1张图片

sudo lxc image list 查看镜像id

sudo lxc launch id name(容器名)

配置容器

在宿主机查看容器

sudo lxc list

可知容器的ip地址

查看宿主机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连接容器并配置

ssh  [email protected](宿主机ip) -p 60601(ssh转播端口号)

ubuntu或者window远程桌面软件

172.22.24.126(宿主机ip):60611(rdp转播端口号)

lxd系统安装驱动

安装显卡驱动

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: 该文为整理搭建过程,有些是直接在网上大佬博客中复制的,侵权即删。

你可能感兴趣的:(开发和科研记录,ubuntu,linux,LXD,服务器)