Incus - Arch Linux 中文维基

跳转到内容

# Incus

来自 Arch Linux 中文维基

相关文章

- Linux 容器
- LXD

翻译状态：

- 本文（或部分内容）译自 Incus，最近一次同步于 2026-02-26，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

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

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

## 安装

安装 incus包 软件包，然后启用 `incus.socket`。

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

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

### 从 LXD 迁移

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

在验证 `lxc info` 和 `incus 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 launch` 或 `incus 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`）启动，您可以使用 systemd 的 `environment` 指令。`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 仓库

分类：​

- 虚拟化

Incus
添加话题