LXD on Ubuntu 快速入门

这份指南聚焦于最核心的命令与操作,旨在帮助您在最短的时间内上手 LXD。

默认环境: Ubuntu 22.04/24.04 | LXD 版本: snap (官方推荐)

1. LXD 是什么 & 适用场景

LXD 是一个现代、安全且功能强大的系统级容器与轻量 VM 管理器,其底层技术核心是 LXC(用于容器)和 QEMU(用于虚拟机)。

与 Docker 的核心差异

LXD 更像一个“轻量版的虚拟机管理器”。它创建的实例拥有完整的操作系统环境(独立的 init, systemd, SSH 服务等),让你感觉像在管理一台真实的物理机或云主机。而 Docker 更侧重于“单个进程或应用的打包与运行”,容器生命周期与应用进程绑定,追求的是极致的轻量和可移植性。

LXD (系统容器)Host OSShared Linux KernelContainerFull Guest OS (systemd, etc)Apps + ServicesDocker (应用容器)Host OSShared Linux KernelContainer 1App 1 + LibsContainer 2App 2 + LibsPhysical Hardware

2. 安装与初始化

2.1 安装

首先,确认你的系统已安装并启用 snap

snap version

通过 snap 安装 LXD(官方推荐方式,会自动更新并包含所有依赖)。

sudo snap install lxd
snap info lxd

注意:清理旧版

如果你的系统之前安装过 apt 包版本的 LXD,请务必先彻底卸载,避免冲突。

sudo apt remove --purge lxd lxd-client -y
sudo apt autoremove -y

2.2 初始化

安装完成后,运行交互式初始化向导来配置 LXD。

sudo lxd init

向导会引导你配置存储池、网络、镜像服务器等。以下是一些常见选择建议:

  • Storage (存储): 新手推荐选 dir(最简单,直接使用目录),或 zfs(功能强大,快照/复制性能高)。如果没有独立的磁盘分区,向导可以直接创建一个基于文件的 loop-based ZFS 池。
  • Network (网络): 选择创建默认的网桥 lxdbr0,并启用自动 NAT 和 DHCP,这是最省心、开箱即用的选项。
  • Images (镜像): 保持默认,使用官方的 images: 远程源。
  • VM Support (虚拟机支持): 建议开启 (yes),这样以后需要创建虚拟机时会非常方便。

3. 基本概念速记

Instance (实例)
容器 (container) 与虚拟机 (vm) 的统称。
Image (镜像)
创建实例的模板,例如 ubuntu/22.04
Profile (配置集)
一组可复用的配置,如网卡、存储、资源限制等。
Storage Pool (存储池)
决定实例磁盘的存放位置、后端驱动 (zfs/btrfs/dir) 等。
Network (网络)
LXD 管理的网络资源,如桥接 NAT、macvlan 等。
Project (项目)
项目级的隔离命名空间,适合多租户或多项目场景。

4. 快速上手(容器与 VM)

4.1 创建与进入容器

lxc image list images: ubuntu
lxc launch images:ubuntu/22.04 myct
lxc list
lxc exec myct -- bash

4.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 myct

5. 镜像管理

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 mybase2

6. 网络与端口映射

6.1 默认桥接网络 (NAT)

lxd init 创建的 lxdbr0 是一个 NAT 网络,实例可以访问外网,但外部无法直接访问实例。

Host Machineeth0192.168.1.10To LANNATlxdbr0 Bridge10.0.1.1/24Outbound OKInbound BlockedInternetContainer 110.0.1.11Container 210.0.1.12

6.2 端口转发 (proxy 设备)

这是将宿主机端口映射到实例内部服务的常用方法。示例:把宿主机的 8080 端口转发到容器 myct 的 80 端口。

lxc config device add myct webproxy proxy \
  listen=tcp:0.0.0.0:8080 connect=tcp:127.0.0.1:80

6.3 macvlan (让实例直连物理网络)

使用 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
lxc config device add myct eth0 nic nictype=macvlan parent=eno1

7. 存储

7.1 创建存储池

lxc storage create zpool zfs size=50GB
lxc profile device add default root disk pool=zpool path=/

7.2 挂载宿主机目录

这是一个非常实用的功能,可以方便地共享数据。

Host MachineFolder/datafile.txtContainerMount Point/mnt/datafile.txtmounts
lxc config device add myct datadisk disk source=/data path=/mnt/data

8. 配置与 Profile

8.1 资源限制

lxc config set myct limits.cpu=2
lxc config set myct limits.memory=2GiB

8.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=true

8.4 GPU 直通 (NVIDIA)

让实例可以直接使用宿主机的 NVIDIA GPU。宿主机需预先安装好 NVIDIA 驱动。

lxc config device add myct gpu gpu
lxc config device add myct gpu0 gpu pci=0000:01:00.0

9. 备份、快照与迁移

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-only

10. 多节点集群(可选)

LXD 支持将多台物理机组成一个集群,统一管理所有节点上的资源。这属于高级功能,适合生产环境或大规模部署。

sudo lxd init
lxc cluster add node2
...

11. 安全与隔离

  • 非特权容器 (默认): 这是 LXD 的核心安全特性。通过 uid/gid 映射,容器内的 root 用户在宿主机上只是一个普通用户,极大地增强了隔离性。
  • 内核安全模块: LXD 默认启用 seccomp, AppArmor, namespaces, cgroups 等多层 Linux 内核安全机制。
  • 特权容器: 仅在绝对必要时才设置 security.privileged=true
  • 网络安全: 暴露服务到公网时,建议使用 proxy 设备或在前面架设反向代理。

12. 常见问题与排错

容器无法上网?
检查 lxdbr0 DHCP;检查宿主防火墙 (ufw) 是否阻断转发。尝试:sudo ufw allow in on lxdbr0,或设置 DEFAULT_FORWARD_POLICY="ACCEPT"
端口映射不生效?
检查 listen 地址;检查宿主机端口是否被占用 (sudo ss -tulpn);检查容器内服务监听地址。
如何 SSH 进入容器?
首选 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/html

13.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-smi

14. 学习路径建议

  1. 入门:跑通 安装 -> lxd init -> 创建容器/VM 的基本操作。
  2. 核心:熟练掌握 proxy 端口映射存储目录挂载快照/恢复
  3. 进阶:学习使用 Profile + cloud-init 来标准化和自动化你的环境部署。
  4. 扩展:了解 Projects 的概念,用于实现多项目隔离。
  5. 按需深入:当有特定需求时,再研究 GPU 直通多节点集群等。