LXD介绍
LXD是一个现代、安全且功能强大的系统容器和虚拟机管理器。它为在容器或虚拟机中运行和管理完整的 Linux 系统提供了统一的体验。LXD 支持大量 Linux 发行版的映像(官方 Ubuntu 映像和社区提供的映像),并且围绕一个非常强大但非常简单的 REST API 构建。LXD 从单台计算机上的一个实例扩展到整个数据中心机架中的集群,使其适合在开发和生产中运行工作负载。LXD 允许您轻松设置一个感觉像小型私有云的系统。您可以以高效的方式运行任何类型的工作负载,同时保持资源优化。如果您想容器化不同的环境或运行虚拟机,或者通常以经济高效的方式运行和管理您的基础设施,您应该考虑使用 LXD。
在LXD环境下,宿主机对容器具有控制权,宿主机可以直接进入终端控制容器,并控制容器的资源,容器之间既可以共享资源也可以独立拥有资源,LXD最主要的目标就是使用 Linux 容器而不是硬件虚拟化向用户提供一种接近虚拟机的使用体验。LXD提供了一个可视化Web界面,使得管理容器方便了许多。如果你的服务器需要共享算力给他人,需要创建相对隔离的环境,同时又需要方便灵活地管理各个环境,保证宿主机对环境的掌控权。那么LXD或许是一个不错的选择。
LXD 聚焦于系统容器,通常也被称为架构容器。这就是说 LXD 容器实际上如在裸机或虚拟机上运行一般运行了一个完整的 Linux 操作系统。这些容器一般基于一个干净的发布镜像并会长时间运行。传统的配置管理工具和部署工具可以如在虚拟机、云实例和物理机器上一样与 LXD 一起使用。相对的,Docker 关注于短期的、无状态的、最小化的容器,这些容器通常并不会升级或者重新配置,而是作为一个整体被替换掉。这就使得 Docker 及类似项目更像是一种软件发布机制,而不是一个机器管理工具。这两种模型并不是完全互斥的。你完全可以使用 LXD 为你的用户提供一个完整的 Linux 系统,然后他们可以在 LXD 内安装 Docker 来运行他们想要的软件。
LXD被Incus项目继承,本文内容是基于LXD而不是Incus。
官方文档:LXD 系列 (ubuntu.com)
官方网站:Canonical LXD
我们采用LXD有以下直接原因:
但LXD存在如下缺点:
准备工作
1.在你的本地准备一个ubuntu或其他Linux系统镜像,用于重装系统或开虚拟机。
2.确保服务器已经正确安装并接入局域网。
安装步骤
一、在服务器上重装系统(可选)
重装系统是为了去掉虚拟化以提升性能,如果你没有这个需求,可以直接用虚拟机作为宿主机。
进入iDRAC9Web服务界面后,确保服务器已经开机,进入虚拟控制台。
虚拟控制台界面如图所示,点击右上角的虚拟介质。
按如图操作顺序,指定虚拟介质。
指定下次开机的位置,选择虚拟CD/DVD/ISO。
之后重启服务器,服务器将读取镜像文件重装系统,快慢取决于文件传输速率,需耐心等待,可以从虚拟介质选项中的虚拟介质统计信息来监控传输过程。
待镜像加载好后,根据指引装好ubuntu系统,其中包含是否安装nvidia显卡驱动的选项,此时选装或不装都可。
二、配置宿主机
配置好LXD容器有两个关键步骤:一是确保容器内外的nvidia显卡驱动、CUDA版本一致,若不一致会导致所有LXD容器和容器外驱动不可用,二是配置容器SSH服务的端口转发,实现多用户基于LXD共享资源。
1. 基本配置和SSH服务配置
首先打开网络配置静态IP,这里按照实际需要配置即可,配置完后可以通过ping www.baidu.com指令来测试网络是否联通。
踩坑:服务器交换机端口模式需要配置为access,ubuntu不支持truck。
修改系统密码
sudo passwd root
安装ssh服务
apt-get update
sudo apt-get install ssh
检查服务是否打开
systemctl status ssh
若显示如下,则服务未开启,需要手动打开。
systemctl start ssh
打开后再次检查显示如下。
此时我们就可以用MobaXtrem等工具进行更方便的操作了。
2. 安装nvidia显卡驱动、CUDA、cuDNN
其中显卡驱动、CUDA是使用GPU加速计算的必要条件,cuDNN通常都会用到。
这可能会是一个复杂的过程。
第一:nvidia驱动、CUDA、cuDNN三者的版本必须和服务器的显卡兼容。
第二:nvidia驱动、CUDA、cuDNN的版本必须相互之间兼容。
第三:宿主机和LXD容器内部的nvidia驱动、CUDA、cudnn必须版本一致
第四:与后续计算所涉及的东西(包括代码库,运算库等)兼容,不过这些不兼容的情况发生的可能性较小。
一、二的解决可以通过在互联网上查资料解决,找到合适的版本安装即可。
三对于LXD容器可能是一个致命的缺陷,因为容器和宿主机的nvidia驱动、CUDA、cudnn必须一致,否则会导致所有机器不能使用显卡,如此用户便不能自由选择显卡驱动的版本。
接下来我给出的是一个在ubuntu下比较通用简单的过程,在你的机器上不一定能直接跑通,请通过查资料自行解决,并且请记录你的安装流程,因为LXD容器内需要进行一次同样的操作。
nvidia驱动安装
首先在宿主机使用指令
nvidia-smi
检查是否已经安装显卡驱动。
如果出现上图界面则已经安装好了(ubuntu装系统时提供装驱动的选项),若不是就说明没装好。
如果已经装好了,你要考虑是否采用这个版本的驱动,如果不采用则需要重装,采用就跳到装CUDA那一步。
进入权限用户:
先
apt-get update
使用指令
ubuntu-drivers devices
查询使用的显卡版本
若不存在此指令,先安装
apt install ubuntu-drivers-common
后查询。
这里显示了推荐的版本,一般来说安装recommended的版本安装就行。
apt install nvidia-driver-550
或
ubuntu-drivers autoinstall
自动安装推荐版本。
安装好之后重启reboot,使用nvidia-smi检查是否安装完毕。
如果不行的话就去查资料。 需要禁止nvidia驱动自动更新,见:如何在Ubuntu上安装NVIDIA显卡驱动并禁止自动更新_ubuntu 禁用显卡驱动更新-CSDN博客
禁用ubuntu内核更新,见:Ubuntu禁止内核自动更新-阿里云开发者社区
安装CUDA
你可以根据一些网上的教程,看nivida-smi右上角显示的最高支持版本从nvidia官网下载cuda包来安装特定的CUDA版本。CUDA Toolkit Archive | NVIDIA Developer
也可以试试像我一样,直接使用
apt install nvidia-cuda-toolkit
安装,CUDA包比较大,如果网速慢,可以尝试换源或者跳到后面先配置LXD容器。
等待安装好之后,使用指令nvcc -V来检查是否成功。
上图说明成功了,这里的版本小于等于12.4说明和我的显卡驱动是兼容的。
如果不行的话就去查资料。
安装cuDNN
这里我从cuDNN的官网教程选择了合适的版本,然后按照指引安装即可。
附链接:cuDNN 9.4.0 Downloads | NVIDIA Developer
如果链接过期了就去找。
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cudnn
安装好cuDNN后,我的检查方式是调用python的pytorch包,由于不一定必要在宿主机上安装代码环境,后面配置LXD容器内部时再提及。
3. 宿主机安装并配置LXD容器外部
安装LXD
首先确保进入权限用户,或使用sudo。
我使用指令apt install lxc和apt install lxd-installer安装LXD。
建议使用官方文档采用用snap安装:
sudo apt-get update
sudo apt install snapd
sudo snap install lxd
安装完成后,使用指令
lxd init
初始化lxd。
这里我修改了这一项,其他都是默认配置,按照具体需要即可。
Size in GiB of the new loop device (1GiB minimum) [default=30GiB]: 200
启动并为LXD容器添加设备
这里的镜像版本尽量采用和宿主机一样的版本。
lxc launch ubuntu:24.04
这里会对容器自动命名,使用lxc list来查看容器列表
接下来需要为容器更名、添加显卡设备、添加端口转发设备。
lxc stop <原容器> #停止容器
lxc rename <原容器名> <新容器名> #改名
lxc config device add <新容器名> gpu gpu #为容器添加所有GPU
lxc config device add <容器名> <对该端口转发设备命名> \\
proxy listen=tcp:<宿主机ip>:<宿主机选用端口> connect=tcp:<容器ip>:22
#添加端口转发,用于SSH访问容器,容器ip从lxc list获取
lxc config device show <容器名>#显示容器已有设备
如图
可以从上图看出端口转发作为一个设备是有命名的,不要弄错含义。
其他配置指令,如指定gpu编号,查询文档LXD (ubuntu.com)。
三、配置LXD容器内部
进入lxc容器内部
lxc start bee1(容器名)
lxc exec bee1(容器名) /bin/bash
1. 配置SSH服务
由于LXD容器被宿主机自由支配,是没有初始密码的,先为容器添加密码,安装SSH之后需要修改配置文件,否则无法由SSH访问。
添加密码
passwd root
安装SSH
apt-get update
apt install openssh-server
修改SSH配置。
vim /etc/ssh/sshd_config
这里给出需修改的配置项
PermitRootLogin yes
PubkeyAuthentication no
PasswordAuthentication yes
KbdInteractiveAuthentication yes
重启SSH服务。
systemctl restart ssh
测试SSH能否连接
这里我成功连接容器了。
如果能ping到容器但被拒绝,需要检查宿主机端口转发是否正确,以及容器内部SSH配置文件是否修改正确,或者改成其他配置试试,LXD容器内部一开始没有密码,并且默认root用户,不改密码并修改配置文件是不能连上的。
2. 安装conda(可选)
如果服务器共享程度高,多个团队使用,为每个团队分配一个服务器,或者也为了方便个人使用,可以在容器内安装conda来配置python环境。
下载并安装conda
Download Anaconda Distribution | Anaconda
wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh #其他版本链接从官网找
bash Anaconda3-2022.10-Linux-x86_64.sh
一路yes即可
安装完成后需要配置bashrc文件
vim ~/.bashrc
在最后一行加上
export PATH=$PATH:<你的安装目录>/anaconda3/bin
然后
source ~/.bashrc
才可以正常使用conda
3. 安装nvidia显卡驱动、CUDA、cuDNN
这里的步骤和宿主机安装应该是一样的,这边省略了,要安装和宿主机一样的版本,否则nvidia-smi会报错,无法使用显卡。
nvidia-smi测试显卡驱动是否成功安装
nvcc -V测试CUDA驱动是否成功安装
这边给出用python的pytorch包测试CUDA和cuDNN的流程
我用了conda,这边创建一个新环境,不用conda的话有python即可
为pip换源,24.9.19网易的源还可用。
pip config set global.index-url Simple Index
创建环境。
conda create -n torch python=3.8
#创建完毕进入该环境。
#安装pytorch。
pip install torch
#安装完成后进入python终端测试。
#测试之前重装下numpy否则可能报错。
pip install numpy
import torch
print(torch.version.cuda)#CUDA版本号
print(torch.backends.cudnn.version())#cuDNN版本号
print(torch.cuda.is_available())#CUDA是否可用
这就说明OK了。
接下来我运行手写数字训练代码来测试显卡性能。
nvidia-smi dmon来监控显卡占用。
打开另一个终端运行代码后,显卡占用显示如下。
可以看到确实使用显卡了。
四、复制LXD容器
1. 复制容器
建议先配置好一个容器的环境,再批量复制形成容器集群。
lxc copy <原容器名> <新容器名>
这里我复制了7个,共复制完后共个容器。
2. 配置SSH端口转发
由于复制容器时会把显卡设备和端口转发设备(device)都复制一遍,所以需要先把重复的端口转发设备删除,否则无法启动容器。
#查看容器设备
lxc config device show <容器名>
#删除容器设备
lxc config device remove <容器名> <设备名>
启动所有复制的容器。
lxc start <容器名>
重新配置端口转发设备,连续配置的时候需要改的只有容器名,宿主机端口,容器ip。
lxc config device add <容器名> <对该端口转发设备命名> proxy listen=tcp:<宿主机ip>:<宿主机选用端口> connect=tcp:<容器ip>:22
接下来测试每个容器能否SSH访问即可。
在八个容器中同时运行代码,显卡占用增加,说明实现显卡资源共享。
五、配置LXD UI可视化界面
打开宿主机,进入权限用户
sudo su
打开LXD UI
snap set lxd ui.enable=true
systemctl reload snap.lxd.daemon
lxc config set core.https_address :8443
接下来在能连接宿主机的网络环境下访问https://<宿主机ip>:8443
初次访问会让你选择证书,还没有配置过证书直接点击取消即可
点击'Create a new certificate'来创建证书
按照图中步骤操作生成证书,这里的密码需要记住。
之后下载两个证书文件,.crt在宿主机上认证,.pfx文件则需要按照3. Import里的步骤为浏览器添加证书。
将.crt文件上传至宿主机,输入指令添加认证
lxc config trust add <你的.crt文件路径>
然后为浏览器添加证书,这里我以Edge为例,其他浏览器参照3. Import步骤里给出的操作即可。
打开Edge浏览器设置edge://settings/privacy隐私、搜索和服务-管理证书-导入-下一步-浏览-将文件类型选择切换到.pfx-选择你刚刚下载的.pfx文件-打开。
输入你刚刚为证书添加的密码-下一步
选择第一项:根据证书类型,自动选择证书存储。
导入成功之后重新打开浏览器,访问https://<宿主机ip>:8443,这次选择你刚刚添加的证书,确定。
然后就成功用上UI界面了,功能齐全,非常方便。
六、如何在LXD容器中使用docker
参见视频Running Docker inside of a LXD container (youtube.com) Youtube: Running Docker inside of a LXD container
安装docker后,宿主机可能无法转发容器流量,解决方法见:
无法连接到 LXC 容器里的 docker 网络 – iMoe Tech
本文伊始参考了zhuanlan.zhihu.com/p/26095085240文章,后续结合官方文档成文。
评论前必须登录!
注册