Incus

出自 ArchWiki

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

它是原始维护者对 LXD 的一个分支。LXD wiki 页面上的文档在很大程度上仍然相关,并鼓励阅读。

安装

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

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

要将容器创建委派给用户,请启用/启动 incus-user.socket 单元。有关组委派,请参阅 #Accessing Incus as an unprivileged user

从 LXD 迁移

如果您希望从现有的 LXD 安装迁移,您应该在此刻执行此操作,因为迁移工具仅针对空的 Incus 目标服务器运行。

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

# lxd-to-incus

配置

非特权容器

默认情况下,Incus 启动 非特权容器(有关差异的解释,请参阅 Linux Containers#Privileged or unprivileged containers)。

为了使其正常工作,您需要为 root 用户设置适当范围的 sub{u,g}ids[1]:与 例如 podman 不同,Incus 使用需要以 root 身份运行的守护程序。[2]

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

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

然后重启 incus

对于替代方案,请参阅 LXD#Privileged containers

以非特权用户身份访问 Incus

来自 官方文档

“对 Incus 的访问通过两个组来控制

  • incus 允许基本用户访问,无需配置,所有操作都限制在每个用户的项目内。
  • incus-admin 允许完全控制 Incus。”

为了让普通用户能够启动和操作实例,将用户添加到 incus 组。

要让普通用户完全控制 Incus 而无需使用 sudo将用户添加到 incus-admin(不推荐)。

警告: 任何添加到 incus-admin 组的用户都相当于 root 用户。有关更多信息,请参阅 [3][4]

初始化 Incus 配置

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

$ incus admin init

来自 官方文档

对于简单的配置,您可以作为普通用户运行此命令。但是,初始化过程中的一些更高级的操作(例如,加入现有集群)需要 root 权限。在这种情况下,请使用 sudo 或以 root 身份运行该命令。

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

添加 Web-UI

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

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

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

$ incus config set core.https_address=127.0.0.1:8443

然后重启 Incus。

用法

命令概览

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

$ incus

创建容器

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

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

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

您可以使用 incus image list <服务器名称>: 列出服务器上的所有镜像,例如

提示: 由于可用镜像数量众多,建议通过管道将以下命令的输出传递给像 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 容器。

技巧和提示

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

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

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

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

$ ping containername.incus

要使此更改永久生效,请编辑 incus.service systemd 单元以包含 ExecStartPost 指令,该指令在启动后运行命令

# systemctl edit incus.service
...

[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

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

例如,incus launchincus image 命令在下载镜像时未使用 *_proxy/*_PROXY 变量 的值。

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

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

解决此问题的方法有很多,以下是一些示例。有关更多信息,请参阅 Incus 的 issue#574

临时

将 Shell 变量导入到 systemd 的环境

首先,导出 *_PROXY 变量

$ export ALL_PROXY="socks://proxy_server_address:port/"

将它们导入到 systemd 的环境

# systemctl import-environment ALL_PROXY

重新/启动 incus.service 单元。

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

持久

编辑 incus 服务单元

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

# systemctl edit incus.service
...

[Service]
Environment=ALL_PROXY="socks://proxy_server_address:port/"

...
使用 Incus core.proxy 选项

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

# incus config set core.proxy_http "proxy_address:proxy_port"
注意: core.proxy 选项具有全局作用域。即,它们立即应用于集群成员。

卸载

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

如果您想删除所有数据

# rm -r /var/lib/incus

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

参见