基于LXD搭建实验室GPU服务器(四)——LXD部署

发布时间 2023-08-29 15:56:41作者: treasurew_wang

在之前的文章中,我们完成了宿主机的配置,接下来将进行LXD的部署。
在实验室环境下,多人共用GPU服务器,由于大家所需的系统环境可能不同,一个用户修改系统文件会影响其它用户,甚至会有小白胡乱修改文件导致服务器崩溃的可能。我们可以通过不给sudo权限来减轻这个问题,但是这不仅对用户来说不方便,也大大增加了管理员的负担:每次安装包等操作都要找管理员处理。因此我们希望通过虚拟化使得各个用户的环境互相隔开,每个用户在他的视角可以独占整个系统。
lxd提供了一种系统级的虚拟化方案,他在lxc基础上做了一些改进,使得管理更方便。
这边首先贴一个lxd的文档地址:https://documentation.ubuntu.com/lxd/en/latest/方便查阅。

LXD相关包安装

LXD安装

我们使用snap安装制定版本lxd,这里选择4.0稳定版,目前已经更新到了5.17版本,大家可以根据自己意愿安装

sudo snap install lxd --channel=4.0/stable

如果出现网络问题,可以使用代理(当然要服务器有代理可用)

sudo snap set system proxy.https="http://127.0.0.1:<port>"
sudo snap set system proxy.http="http://127.0.0.1:<port>"

或者使用apt安装

sudo apt install lxd

zfs和网桥相关包安装

我们还需要安装zfs用于磁盘管理,bridge-utils用于搭建网桥

sudo apt install zfsutils-linux bridge-utils

nvidia-container-runtime

这是nvidia官方推出的一个组件,可以支持在容器内使用宿主机的显卡驱动,按需下载。
不过链接虽然指向ubuntu20.04,进入后发现是ubuntu18.04,好像不影响使用。

# 添加仓库
sudo curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
sudo curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

sudo apt install libnvidia-container-dev libnvidia-container-tools nvidia-container-runtime -y

配置存储池

我们需要划分一块区域用于LXD使用。
磁盘名一般为/dev/sda/dev/sdb……,/dev/hda\dev\hdb……
我们可以使用以下指令来查看磁盘:

sudo fdisk -l

image

然后使用以下指令来对磁盘进操作:

sudo fdisk <disk_name> # 例如/dev/sda

fdisk指令可以输入m查看帮助

Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): m

Help:

  GPT
   M   enter protective/hybrid MBR

  Generic
   d   delete a partition
   F   list free unpartitioned space
   l   list known partition types
   n   add a new partition
   p   print the partition table
   t   change a partition type
   v   verify the partition table
   i   print information about a partition

  Misc
   m   print this menu
   x   extra functionality (experts only)

  Script
   I   load disk layout from sfdisk script file
   O   dump disk layout to sfdisk script file

  Save & Exit
   w   write table to disk and exit
   q   quit without saving changes

  Create a new label
   g   create a new empty GPT partition table
   G   create a new empty SGI (IRIX) partition table
   o   create a new empty DOS partition table
   s   create a new empty Sun partition table

博主这边使用一整个sda作为存储池,因此输入n后,设置好分区的编号、起止位置等参数后,输入w保存即完成了分区。

初始化lxd

输入以下指令:

sudo lxd init

# 用不上
Would you like to use LXD clustering? (yes/no) [default=no]:no

# 是否配置新的存储池,选择是,因为之前没有
Do you want to configure a new storage pool? (yes/no) [default=yes]: yes

# 新的存储池名字,随便填
Name of the new storage pool [default=default]: lxd_pool

# 存储后端,选择默认zfs
Name of the storage backend to use (btrfs, dir, lvm, zfs) [default=zfs]: 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]: 512G


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

# ipv4地址,自动
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: auto

# ipv6地址,自动
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: auto

# 这个好像是不通过桥接,每个容器都有独立ip
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]:

创建容器

输入以下指令以创建需要版本的Ubuntu:

# 列出所有ubuntu容器,注意结尾冒号
lxc image list ubuntu:

# 根据镜像创建容器,容器名自己选
lxc launch ubuntu:20.04 <container_name>

若出现网络问题,可以使用清华镜像源:

# 创建remote链接指向清华镜像,替换掉默认的images链接
lxc remote add mirror-images https://mirrors.tuna.tsinghua.edu.cn/lxc-images/ --protocol=simplestreams --public

# 列出所有的镜像,注意结尾冒号
lxc image list mirror-images:

# 从中找出需要的镜像,例如ubuntu20.04(名字代号为focal)
#| ubuntu/focal (7 more)                    | 12042959c928 | yes    | Ubuntu focal amd64 (20230828_07:42)        | x86_64       | CONTAINER       | 114.63MB  | Aug 28, 2023 at 12:00am (UTC) |

# 根据FINGERPRINT创建容器
lxc launch 12042959c928 <container_name>

其余指令

# 查看容器
lxc list

# 查看本机镜像
lxc image

# 进入容器
lxc exec <container_name> bash

# 开启/停止/删除/重启容器
lxc start/stop/delete/restart <container_name>

容器基础配置

添加GPU

# 给某个容器添加GPU
lxc config device add <container_name> gpu gpu

# 全局添加GPU(给每个容器添加GPU)
lxc profile device add default gpu gpu

添加驱动或配置nvidia-runtime

我们可以给容器安装驱动,但由于我们之前安装了nvidia-runtime组件,因此当我们给容器配置了nvidia.runtime true时,容器可以使用宿主机驱动,而不需要再安装驱动。

若要安装驱动,请执行以下指令。由于宿主机以安装了驱动的内核模块,lxd容器和宿主机共用内核模块,因此必须加上--no-kernel-module选项,否则会出现错误。

sudo bash ./NVIDIA-Linux-x86_64-510.39.01.run --no-kernel-module

配置nvidia-runtime指令如下

# 给某个容器配置nvidia-runtime
lxc config set nvidia.runtime true

# 全局配置nvidia-runtime(给每个容器配置nvidia-runtime)
lxc profile set default nvidia.runtime true

配置完成后,可以输入nvidia-smi查看是否成功。

配置开机自启

# 给某个容器配置开机自启
lxc config set boot.autostart true

# 全局配置开机自启(给每个容器配置开机自启)
lxc profile set default boot.autostart true

至此,lxd的部署,容器的配置已经完成,此时容器其实和宿主机最初的环境相同,可以按照前几篇文章对容器进行类似的配置和环境搭建。
后续将介绍一些维护相关操作。