Incus
Incus 是一个用于容器(通过 LXC)和虚拟机(通过 QEMU)的管理器/虚拟机监控器。
它是原始维护者对 LXD 的一个分支。LXD wiki 页面上的文档在很大程度上仍然相关,并鼓励阅读。
安装
安装 incus 软件包,然后启用 incus.socket
。
或者,您可以直接启用/启动 incus.service
,如果您希望实例自动启动,例如。
要将容器创建委派给用户,请启用/启动 incus-user.socket
单元。有关组委派,请参阅 #Accessing Incus as an unprivileged user。
从 LXD 迁移
如果您希望从现有的 LXD 安装迁移,您应该在此刻执行此操作,因为迁移工具仅针对空的 Incus 目标服务器运行。
在验证 lxc info
和 incus 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 配置
在使用之前,需要初始化 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 <服务器名称>:
列出服务器上的所有镜像,例如
$ 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 launch
或 incus 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
)启动,则可以使用 systemd 的 Environment
指令。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
选项具有全局作用域。即,它们立即应用于集群成员。卸载
如果您想删除所有数据
# rm -r /var/lib/incus
如果您使用了任何示例网络配置,您也应该删除这些配置。