基于LXD搭建实验室GPU服务器(四)——LXD部署
在之前的文章中,我们完成了宿主机的配置,接下来将进行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
然后使用以下指令来对磁盘进操作:
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 mirror-images: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的部署,容器的配置已经完成,此时容器其实和宿主机最初的环境相同,可以按照前几篇文章对容器进行类似的配置和环境搭建。
后续将介绍一些维护相关操作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)