跳至內容

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 倉庫