使用 Incus 系统容器构建轻量远程开发机

讨论为何将 Incus 系统容器用于远程开发机更适合,并提供在 Debian12 上安装、配置存储池、网络与 GPU 支持的实操命令。
2026-02-12
3117 字 · 约 8 分钟阅读

对于远程开发环境来说,Docker 虽然轻量但设计上更适合单一应用的容器化,而 Incus 容器/系统容器形态的“开发机环境”,不是传统意义的 KVM 虚拟机。它更像“轻量 VM 体验的容器”(有独立 init、完整发行版用户态),适合做可快速复制/销毁的开发沙箱

Incus 是 LXD 的社区分支,提供了与 LXD 类似的功能和体验,但由社区维护和开发。它旨在为用户提供一个稳定、可靠的容器管理平台,同时也欢迎社区的贡献和参与。

LXD 是一个由 Canonical 维护的容器管理平台,提供了丰富的功能和工具,适用于各种规模的容器化应用。

对比差异如下:

维度Incus(系统容器 / LXC)做远程开发机KVM 虚拟机(如 libvirt/QEMU)做远程开发机Docker(应用容器)做远程开发环境
形态定位“像一台机器”的容器:完整 userspace + systemd/sshd/apt真正虚拟机:完整 OS + 独立内核“跑进程/应用”的容器:单进程/少量进程为主
VS Code Remote 适配Remote-SSH 最匹配(容器内跑 sshd)Remote-SSH 最匹配(VM 内跑 sshd)Remote-Containers/Dev Containers 最匹配;也可 Remote-SSH(不主流)
隔离边界共享宿主机内核;隔离弱于 VM强隔离(硬件虚拟化边界)共享宿主机内核;隔离与容器同类(取决于运行时/配置)
内核/内核模块需求不满足:不能换内核;内核模块能力受限满足:可自定义内核/模块不满足:同容器;无法换内核
启动速度/密度快、密度高慢、密度低最快、密度最高(但不等价“开发机”)
资源开销低(接近容器)高(Guest OS + 内核)低(容器)
网络形态VM 化:桥接/直通/路由/NAT,实例独立 IP 容易VM 化:桥接/直通/路由/NAT,最灵活默认偏应用网络(bridge/overlay);做到“每环境独立 IP/网段”需要额外设计
存储/快照/克隆存储池+快照/克隆很成熟(ZFS/LVM/dir/ceph 等)依赖 qcow2/LVM/ZFS 等;快照/克隆可做但通常更重镜像层+volume;对“整机状态快照”不如前两者直观
多用户/多开发机治理:profile 统一下发挂载、limits、设备、GPU强:模板化镜像+cloud-init/配置管理中:更多是“项目级环境”,多用户隔离与资源治理要额外平台化
GPU 远程开发可做(设备直通/绑定 + NVIDIA 工具链);共享内核前提最好(直通、隔离清晰);成本高常见(nvidia-container-runtime);适合“跑训练/推理服务”,做“整机开发”要补齐 systemd/ssh 等
适合的 VS Code 场景“给每人一台轻量开发机”,长生命周期,能装很多工具安全边界清晰的企业/多租户;需要不同内核/驱动验证“每个项目一个可复现环境”,和仓库一起走 Dev Containers
主要短板内核共享带来的安全/兼容边界;部分底层能力受限成本与运维重;启动慢;资源占用大不像“机器”;多服务/长驻开发机体验需要额外工程化
典型选型结论(远程 VS Code)默认优先:想要 Remote-SSH + 轻量“机器感”安全/内核需求优先时选复现/项目级优先时选

结合表格,Incus 的“系统容器”形态非常适合做“远程开发机”,尤其是当你想要一个轻量、快速启动、且具有完整 OS 体验的环境时。它提供了比 Docker 更接近传统开发机的体验,同时又比 KVM 虚拟机更高效和易于管理。

我的系统是 Debian12,在上面安装了 Incus 方法如下:

# 安装必要的密钥管理工具
apt update
apt install -y curl gpg

# 导入 GPG Key
mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.zabbly.com/key.asc -o /etc/apt/keyrings/zabbly.asc

# 添加源列表
sh -c 'cat <<EOF > /etc/apt/sources.list.d/zabbly-incus-stable.sources
Enabled: yes
Types: deb
URIs: https://pkgs.zabbly.com/incus/stable
Suites: $(. /etc/os-release && echo ${VERSION_CODENAME})
Components: main
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/zabbly.asc
EOF'

apt update
apt install -y incus

初始化

incus admin init

如果需要 NVIDIA GPU 支持,可以安装 incus-nvidia 包:

curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

apt update
apt install -y libnvidia-container-tools

先创建一个 local-sys 存储池:

incus storage create local-sys dir

创建 incus 的应用配置模板文件:

incus profile create dev-basic

我的开发环境配置内容如下:

description: Basic CPU-only development environment
devices:
  eth0:
    name: eth0
    nictype: bridged
    parent: br0
    type: nic
  root:
    path: /
    pool: local-sys
    type: disk
config:
  limits.cpu: "16"       # 限制 16 
  limits.memory: "64GB"  # 限制 64G 内存

参数说明:

  • br0 是我之前创建的桥接网络,连接到物理网络接口
  • local-sys 是之前创建的存储池,使用本地目录存储容
  • limits.cpu 和 limits.memory 分别限制容器使用的 CPU 核数和内存大小

创建一个 lxc 应用如下:

incus launch images:debian/12 chancel-box --profile default --profile dev-basic

留言

发表留言