Incus
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 配置
在使用之前,Incus 的配置需要進行初始化:
# incus admin init
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: 列出伺服器上的所有鏡像,例如:
$ 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
屏蔽後,重啟容器:
$ 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
網絡連接問題
官方文檔提供了 如何配置防火牆 的說明。
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 選項具有全局作用域。即它們立即適用於集群成員。卸載
如果您想刪除所有數據:
# rm -r /var/lib/incus
如果您使用了任何示例網絡配置,也應該刪除它們。
另請參閱
• 官方文檔
• 入門指南
• 官方論壇