用 LXD/Incus 跑系统容器:lxc 客户端、日常运维与选型取舍
从 LXC 到 LXD
淘系早期容器系统是基于 LXC 构建的 T4 系统,那时 LXC 还很原始,网络和 cgroup 管理都要自己拼凑。Docker 崛起后,业界万物皆容器,Kubernetes 横扫基础架构,LXC 一度被遗忘。但 Docker 以轻量应用为中心的运行理念,让一部分持久化、稳定性要求高、且深度绑定 systemd 的系统级「全能」容器很难做——在 Docker 里跑 systemd 极其麻烦。基于 LXC 构建的 LXD 为这类系统级底层服务开了新路:
- 能同时管理容器和虚拟机,提供运行和管理「完整」Linux 系统的一致体验;
- 支持大量 Linux 发行版,内建简洁的 REST API;
- 可在单机部署,也能在数据中心大量服务器上组建集群。
一个典型用法是拿 LXD 构建轻量级 Kubernetes Node 节点模拟,替代之前的 KVM 方案:KVM 对 Host 资源消耗大,HomeLab 里希望硬件都用在业务上。kind 是简化版 Docker 模拟 k8s,把 HomeLab 的模拟能力削弱了,所以改用 LXD 做底座。
概念边界:lxc 是客户端,LXD/Incus 是 daemon
lxc 只是命令行客户端,它连的是 LXD/Incus daemon 的 REST API,本地默认走 unix socket。真正干活的是 daemon。
LXD 是构建在 LXC 之上的 daemon/管理器,同一套体验里既能管系统容器,也能管虚拟机(VM)。系统容器是完整的 Linux 用户空间,能跑 systemd,所以 systemctl、日志、网络配置这些和一台真机几乎一样;Docker 是应用级容器,在 Docker 里跑 systemd 很别扭——这是选系统容器的直接理由。
LXD 现由 Canonical 主导(linuxcontainers.org/lxd),社区分叉出 Incus(linuxcontainers.org/incus)。两者命令与概念高度一致,下面这些 lxc 子命令在两边基本通用。
安装与初始化
sudo apt install lxd
sudo lxd init # 初始化存储池与网络
日常运维命令
lxc launch images:ubuntu/24.04 c1 # 创建并启动实例
lxc list # 列出实例(含 IP、状态)
lxc exec c1 -- bash # 进入容器
lxc exec c1 -- systemctl status # 直接跑命令(系统容器里有 systemd)
lxc config show c1 # 查看配置
lxc config set c1 limits.cpu 2 # 改配置,可热生效
lxc stop c1
lxc start c1
lxc restart c1
lxc snapshot c1 snap0 # 打快照
lxc restore c1 snap0 # 回滚快照
lxc copy c1 c2 # 复制实例
lxc move c1 remote:c1 # 迁移(含跨远端)
lxc file push ./app c1/root/ # 推送文件进实例
lxc file pull c1/etc/hosts . # 从实例拉文件出来
lxc info c1 # 详情、日志
lxc image list images: # 查看远端镜像
几点使用习惯:
lxc list会把 IP 和运行状态列出来,lxc info c1里能看到更详细的配置与日志;lxc config show/lxc config set配合用,CPU、内存这类限制不必停机改;- 动配置或做实验前先
lxc snapshot,出问题lxc restore回去,比重建快; lxc copy和lxc move的目标可以是本地另一个实例,也可以是远端remote:前缀,用来做冷迁移或者备份。
存储池与网络
存储池类型:dir、btrfs、lvm、zfs、ceph 等。网络类型:bridge、macvlan、ovn 等。这些在 lxd init 时选定,之后也能增删调整;不同后端直接影响快照、配额和性能表现。
什么时候用系统容器
- 替代长期运行的系统服务:需要完整 OS、持久化状态、systemd 管理单元;
- HomeLab 里模拟多节点集群,比如 k8s Node,比开一堆 VM 省资源;
- 想省 VM 开销,又不想在 Docker 里硬塞 systemd。
什么时候仍用 Docker 或 VM
- Docker:微服务、CI/CD、镜像分发,这是应用级容器的强项,镜像构建和分发链路也更成熟;
- 直接上 VM:需要强隔离的场合,或者要跑非 Linux 系统。
注意项
- 生产环境不要用默认的
dir存储池:快照和配额支持弱,效率也低,初始化时就该换成zfs/lvm/btrfs之类。 - 非特权容器与宿主机目录共享时,属主和 idmap 需要另行处理,直接挂载会出现宿主与容器内权限对不上的情况。