LXD on Ubuntu 快速入门
1. LXD 是什么 & 适用场景
LXD 是一个现代、安全且功能强大的系统级容器与轻量 VM 管理器,其底层技术核心是 LXC(用于容器)和 QEMU(用于虚拟机)。
与 Docker 的核心差异
LXD 更像一个“轻量版的虚拟机管理器”。它创建的实例拥有完整的操作系统环境(独立的 init, systemd, SSH 服务等),让你感觉像在管理一台真实的物理机或云主机。而 Docker 更侧重于“单个进程或应用的打包与运行”,容器生命周期与应用进程绑定,追求的是极致的轻量和可移植性。

首先,确认你的系统已安装并启用 通过 snap 安装 LXD(官方推荐方式,会自动更新并包含所有依赖)。 注意:清理旧版 如果你的系统之前安装过 apt 包版本的 LXD,请务必先彻底卸载,避免冲突。 安装完成后,运行交互式初始化向导来配置 LXD。 向导会引导你配置存储池、网络、镜像服务器等。以下是一些常见选择建议: Storage (存储): 新手推荐选 Network (网络): 选择创建默认的网桥 Images (镜像): 保持默认,使用官方的 VM Support (虚拟机支持): 建议开启 (yes),这样以后需要创建虚拟机时会非常方便。 Instance (实例) 容器 (container) 与虚拟机 (vm) 的统称。 Image (镜像) 创建实例的模板,例如 Profile (配置集) 一组可复用的配置,如网卡、存储、资源限制等。 Storage Pool (存储池) 决定实例磁盘的存放位置、后端驱动 (zfs/btrfs/dir) 等。 Network (网络) LXD 管理的网络资源,如桥接 NAT、macvlan 等。 Project (项目) 项目级的隔离命名空间,适合多租户或多项目场景。 Host Machineeth0192.168.1.10To LANNATlxdbr0 Bridge10.0.1.1/24Outbound OKInbound BlockedInternetContainer 110.0.1.11Container 210.0.1.12 这是将宿主机端口映射到实例内部服务的常用方法。示例:把宿主机的 8080 端口转发到容器 使用 macvlan 模式,实例可以获得与宿主机同网段的 IP 地址,就像一台独立的物理机。适合需要内网直接访问的场景。 Host Machineeth0192.168.1.10Container 1 (macvlan)192.168.1.11Container 2 (macvlan)192.168.1.12Physical Network Switch (LAN)⚠️ No Host-Container Link 这是一个非常实用的功能,可以方便地共享数据。 Host MachineFolder/datafile.txtContainerMount Point/mnt/datafile.txtmounts 通过 让实例可以直接使用宿主机的 NVIDIA GPU。宿主机需预先安装好 NVIDIA 驱动。 LXD 支持将多台物理机组成一个集群,统一管理所有节点上的资源。这属于高级功能,适合生产环境或大规模部署。 非特权容器 (默认): 这是 LXD 的核心安全特性。通过 uid/gid 映射,容器内的 root 用户在宿主机上只是一个普通用户,极大地增强了隔离性。 内核安全模块: LXD 默认启用 seccomp, AppArmor, namespaces, cgroups 等多层 Linux 内核安全机制。 特权容器: 仅在绝对必要时才设置 网络安全: 暴露服务到公网时,建议使用 容器无法上网? 检查 端口映射不生效? 检查 如何 SSH 进入容器? 首选 入门:跑通 安装 -> 核心:熟练掌握 proxy 端口映射、存储目录挂载 和 快照/恢复。 进阶:学习使用 Profile + cloud-init 来标准化和自动化你的环境部署。 扩展:了解 Projects 的概念,用于实现多项目隔离。 按需深入:当有特定需求时,再研究 GPU 直通、多节点集群等。2. 安装与初始化
2.1 安装
snap。snap versionsudo snap install lxd
snap info lxdsudo apt remove --purge lxd lxd-client -y
sudo apt autoremove -y2.2 初始化
sudo lxd initdir(最简单,直接使用目录),或 zfs(功能强大,快照/复制性能高)。如果没有独立的磁盘分区,向导可以直接创建一个基于文件的 loop-based ZFS 池。lxdbr0,并启用自动 NAT 和 DHCP,这是最省心、开箱即用的选项。images: 远程源。3. 基本概念速记
ubuntu/22.04。4. 快速上手(容器与 VM)
4.1 创建与进入容器
lxc image list images: ubuntu
lxc launch images:ubuntu/22.04 myct
lxc list
lxc exec myct -- bash4.2 创建与使用 VM
lxc launch images:ubuntu/22.04/cloud myvm --vm
lxc console myvm --type=console
lxc file push ./local.txt myct/root/
lxc file pull myct/etc/os-release .4.3 基本生命周期管理
lxc stop myct
lxc start myct
lxc restart myct
lxc delete myct
lxc info myct5. 镜像管理
lxc remote list
lxc image list images: ubuntu
lxc publish myct --alias mybase --compression=xz
lxc image export mybase ./mybase.tar.xz
lxc image import ./mybase.tar.xz --alias mybase26. 网络与端口映射
6.1 默认桥接网络 (NAT)
lxd init 创建的 lxdbr0 是一个 NAT 网络,实例可以访问外网,但外部无法直接访问实例。6.2 端口转发 (proxy 设备)
myct 的 80 端口。lxc config device add myct webproxy proxy \
listen=tcp:0.0.0.0:8080 connect=tcp:127.0.0.1:806.3 macvlan (让实例直连物理网络)
lxc config device add myct eth0 nic nictype=macvlan parent=eno17. 存储
7.1 创建存储池
lxc storage create zpool zfs size=50GB
lxc profile device add default root disk pool=zpool path=/7.2 挂载宿主机目录
lxc config device add myct datadisk disk source=/data path=/mnt/data8. 配置与 Profile
8.1 资源限制
lxc config set myct limits.cpu=2
lxc config set myct limits.memory=2GiB8.2 cloud-init (自动化初始化)
cloud-init,可以在创建实例时自动完成更新、安装软件、运行命令等初始化工作。lxc launch images:ubuntu/22.04 myweb -c user.user-data="$(cat <<'EOF'
#cloud-config
package_update: true
packages:
- nginx
runcmd:
- [ systemctl, enable, --now, nginx ]
EOF
)"8.3 嵌套容器 (Nesting)
lxc config set myct security.nesting=true
lxc config set myct security.privileged=true8.4 GPU 直通 (NVIDIA)
lxc config device add myct gpu gpu
lxc config device add myct gpu0 gpu pci=0000:01:00.09. 备份、快照与迁移
lxc snapshot myct snap1
lxc restore myct snap1
lxc export myct ./myct-backup.tar.gz
lxc remote add target 10.0.0.2:8443
lxc copy myct target:myct --instance-only10. 多节点集群(可选)
sudo lxd init
lxc cluster add node2
...11. 安全与隔离
security.privileged=true。proxy 设备或在前面架设反向代理。12. 常见问题与排错
lxdbr0 DHCP;检查宿主防火墙 (ufw) 是否阻断转发。尝试:sudo ufw allow in on lxdbr0,或设置 DEFAULT_FORWARD_POLICY="ACCEPT"。listen 地址;检查宿主机端口是否被占用 (sudo ss -tulpn);检查容器内服务监听地址。lxc exec。如需 SSH,需在容器内安装 openssh-server 并做端口映射。13. 实战示例
13.1 5 分钟上线一个 Nginx 网站
lxc launch images:ubuntu/22.04 myweb
lxc exec myweb -- apt update && apt install -y nginx
lxc config device add myweb web proxy listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80
sudo mkdir -p /srv/webroot && echo "Hello from LXD" > /srv/webroot/index.html
lxc config device add myweb www disk source=/srv/webroot path=/var/www/html13.2 轻量 VM 跑 Docker
lxc launch images:ubuntu/24.04/cloud dvm --vm -c limits.cpu=2 -c limits.memory=4GiB
lxc exec dvm -- bash -c "apt update && apt install -y docker.io"13.3 GPU 推理(容器)
lxc launch images:ubuntu/22.04 llm
lxc config device add llm gpu gpu
lxc exec llm -- apt update && apt install -y nvidia-utils-535
lxc exec llm -- nvidia-smi14. 学习路径建议
lxd init -> 创建容器/VM 的基本操作。