跳转到内容

Incus

来自 Arch Linux 中文维基

Incus 是一个用于管理容器(通过 LXC)和虚拟机(通过 QEMU)的管理程序。

它是由原维护者从 LXD 分叉而来的。LXD 维基页面中的文档在很大程度上仍然相关,值得阅读。

安装

安装 incus 软件包,然后启用 incus.socket

或者,如果您希望实例自动启动, 您可以直接启用/启动 incus.service

要将容器创建委托给用户,请启用/启动 incus-user.socket 单元。有关组委派,请参阅 #以非特权用户身份访问 Incus

从 LXD 迁移

如果您希望从现有的 LXD 安装迁移,应在此时进行,因为迁移工具只会针对空的目标 Incus 服务器运行。

在验证 lxc infoincus info 命令都能正确运行后,阅读上游关于该过程的 文档,然后运行迁移工具:

# lxd-to-incus

配置

非特权容器

Incus 默认启动 非特权容器(关于区别的解释,请参阅 Linux 容器#特权或非特权)。

为此,您需要为 root 用户设置适当的子用户ID和子组ID范围[1]:与podman 不同,Incus 使用需要以 root 身份运行的守护进程。[2]

验证 /etc/subuid/etc/subgid 的内容,如果需要,为 root 用户添加一个 至少 1000 万个 UID/GID 的连续范围

# usermod -v 1000000-1000999999 -w 1000000-1000999999 root

然后重启 incus

关于替代方法,请参阅 LXD#特权容器

以非特权用户身份访问 Incus

来自 官方文档

"对 Incus 的访问由两个组控制:

incus 允许基本的用户访问,没有配置权限,所有操作限制在每个用户的项目内。

incus-admin 允许完全控制 Incus。"

要使普通用户能够启动和操作实例,请将用户添加到 incus 组。

要给普通用户完全控制 Incus 的权限而无需使用 sudo,请将用户添加到 incus-admin

警告:添加到 incus-admin 组的任何人都是 root 等效用户。更多信息,请参阅 [3][4]

初始化 Incus 配置

在使用之前,Incus 的配置需要进行初始化:

# incus admin init
注意:如果没有 root 权限或属于 incus-admin 组的用户,此命令无法成功运行。 来自 官方文档

这将在终端启动一个交互式配置向导,涵盖存储、网络等不同主题。您可以在官方 入门指南 中找到概述。

添加 Web 界面

用于浏览器的前端 lxd-ui 已打补丁以适配 Incus。这些补丁可在 debian 软件包源代码中找到。[5]

要使用此 UI,请安装 incus-ui 软件包。

然后设置 Web 服务器的地址和端口:

$ incus config set core.https_address=127.0.0.1:8443

重启 Incus。

另一个可用的选项是使用以下命令运行 Web 服务器:

$ incus webui

关于此选项,请参阅 incus webui

使用

命令概述

您可以通过输入以下命令获取所有可用命令的概述:

$ incus

创建容器

容器基于从镜像服务器或远程 LXD 服务器下载的镜像。

您可以使用以下命令查看已添加服务器的列表:

$ incus remote list
注意:可以通过使用 NAME 列左侧显示的名称来引用镜像服务器,例如以下示例中的 images

您可以使用 incus image list server-name: 列出服务器上的所有镜像,例如:

提示:由于可用镜像数量众多,建议将以下命令的输出通过 less 等分页器管道传输。
$ incus image list images:

这将向您显示默认服务器之一上的所有镜像:images.linuxcontainers.org

您还可以通过添加诸如发行版名称之类的术语来搜索镜像:

$ incus image list images:debian

使用特定服务器的镜像启动容器:

$ incus launch servername:imagename

例如,从默认服务器的 Ubuntu Noble 镜像创建一个随机命名的容器实例:

$ incus launch images:ubuntu/noble

要为实例指定名称,只需在其后添加,例如:

$ incus launch images:archlinux/current/amd64 arch

将创建一个名为 arch 的 amd64 Arch 容器。

Arch Linux 容器配置

在非特权容器中禁用 udev

运行非特权 Arch Linux 容器时,systemd 的 udev 服务会在启动和软件包更新期间(特别是当 mkinitcpio 运行时)生成大量“权限被拒绝”错误。这是因为 udev 尝试写入由主机拥有的 /sys/devices/*/uevent 文件。

这些错误是由于 Arch 容器镜像针对非特权操作的默认配置不当造成的 —— 容器运行正常。

根据 systemd 容器接口systemd-udevd 不打算在非特权容器中运行。在容器内屏蔽 udev 服务:

# systemctl mask \
  systemd-udevd.service \
  systemd-udevd-control.socket \
  systemd-udevd-kernel.socket \
  systemd-udevd-varlink.socket \
  systemd-udev-trigger.service \
  systemd-udev-load-credentials.service
注意:这仅适用于非特权容器。具有设备直通功能的特权容器可能需要 udev。

屏蔽后,重启容器:

$ incus restart 容器名称

技巧和窍门

在主机上通过名称访问容器

这假设您正在使用默认桥接,其名为 incusbr0,并且您正在使用 systemd-resolved

# systemd-resolve --interface incusbr0 --set-domain '~incus' --set-dns $(incus network get incusbr0 ipv4.address | cut -d / -f 1)

现在您可以通过名称访问容器:

$ ping 容器名称.incus

要永久保存此更改,请编辑 incus.service systemd 单元,以包含一个 ExecStartPost 指令,该指令在启动后运行命令:

{{hc/etc/systemd/system/incus.service.d/access_by_name.conf 2= [Service] ExecStartPost=/bin/sh -c 'systemd-resolve --interface incusbr0 --set-domain "~incus" --set-dns $(incus network get incusbr0 ipv4.address | cut -d / -f 1)' }}

故障排除

启动虚拟机失败

如果您看到错误:

Error: Couldn't find one of the required UEFI firmware files: [{code:OVMF_CODE.4MB.fd vars:OVMF_VARS.4MB.ms.fd} {code:OVMF_CODE.2MB.fd vars:OVMF_VARS.2MB.ms.fd} {code:OVMF_CODE.fd vars:OVMF_VARS.ms.fd} {code:OVMF_CODE.fd vars:qemu.nvram}]

这是因为 Arch Linux 不分发安全启动签名的 ovmf 固件。要启动虚拟机,您需要暂时禁用安全启动:

$ incus launch ubuntu:18.04 test-vm --vm -c security.secureboot=false

这也可以通过以下方式添加到默认配置文件中:

$ incus profile set default security.secureboot=false

网络连接问题

官方文档提供了 如何配置防火墙 的说明。

提示:除了专用防火墙外,多个程序可能会影响单个系统上的 nftables,包括 VPN 和其他虚拟化软件。运行 nft list ruleset 以显示所有当前活动的规则。

Incus 创建并管理自己的网络接口,而 NetworkManager 在某些情况下可能会干扰。最好添加一个条目来忽略 lxcbr* 设备,使用方法参考 NetworkManager#忽略特定设备

Docker 的默认配置会破坏 Incus 中的网络。如果需要在同一台机器上运行 Docker 和 Incus,请查阅 官方文档

Incus 不遵守 Shell 的环境代理变量

示例是 incus launchincus image 命令在下载镜像时不使用 *_proxy/*_PROXY 变量的值。

Incus 实现了服务器-客户端模式。这意味着操作是由作为 Incus 服务器incusd 执行的 —— 通常在后台运行,除非从交互式 shell 调用。而 incus 命令行界面用于与作为 Incus 客户端 的 Incus 服务器通信。

这使得 incusd(通常作为服务启动)不继承客户端 shell 的环境变量,而是尊重它被调用时所处环境的变量。[6] 在 Arch Linux 中,Incus 服务器由 systemd 启动。

针对此问题可以有很多变通方法,以下提供一些示例。更多信息,请参阅 Incus 的 问题#574

临时方案

将 Shell 变量导入 systemd 的环境

首先,导出 *_PROXY 变量:

$ export ALL_PROXY="socks://代理服务器地址:端口/"

将它们导入 systemd 的环境:

# systemctl import-environment ALL_PROXY

重新启动 incus.service 单元。

提示:使用 systemctl unset-environment 命令取消设置变量并重启服务。

持久方案

编辑 incus 服务单元

如果您希望 Incus 守护进程始终使用一些静态环境变量(如 *_proxy)启动,您可以使用 systemdenvironment 指令。systemctl set-property 命令无法操作 environment 指令。编辑 incus.service 并添加带有适当 变量=值 对的 environment 键。例如:

/etc/systemd/system/incus.service.d/environment.conf
[Service]
Environment=ALL_PROXY="socks://proxy_server_address:port/"

使用 Incus core.proxy 选项

可以通过使用 配置 Incus 服务器的 core.proxy 选项,使 Incus 服务器使用所需的代理。例如:

# incus config set core.proxy_http "代理地址:代理端口"
注意:core.proxy 选项具有全局作用域。即它们立即适用于集群成员。

卸载

停止并禁用服务。然后卸载 incus 软件包。

如果您想删除所有数据:

# rm -r /var/lib/incus

如果您使用了任何示例网络配置,也应该删除它们。

另请参阅

官方 Incus 主页

官方文档

入门指南

官方论坛

Incus GitHub 仓库