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
新增話題