新闻

Incus 6.6 已发布

2024年10月3日

简介

Incus 团队很高兴地宣布发布 Incus 6.6!

这次发布的更新相对较少,主要是因为几周前去参加了 Linux Plumbers 大会和相关活动。

但仍然不是一个乏味的版本。除了通常的错误修复和性能改进之外,我们还为虚拟机添加了一些不错的功能,改进了集群化 LVM 支持,改进了 incus-migrate 以及一些新的网络功能!

image|597x346

像往常一样,您可以在线试用:https://linuxcontainers.cn/incus/try-it/

尽情享受!

新功能

虚拟机的操作系统信息

Incus VM 代理已扩展为提取有关虚拟机的更多详细信息。

stgraber@dakara:~$ incus info v1
Name: v1
Status: RUNNING
Type: virtual-machine
Architecture: x86_64
PID: 3753543
Created: 2024/09/24 10:02 EDT
Last Used: 2024/10/03 11:29 EDT
Started: 2024/10/03 11:29 EDT

Operating System:
  OS: Ubuntu
  OS Version: 24.04.1 LTS (Noble Numbat)
  Kernel Version: 6.10.11-zabbly+
  Hostname: v1
  FQDN: v1

Resources:
  Processes: 35
  Disk usage:
    root: 1.02GiB
  CPU usage:
    CPU usage (in seconds): 4
  Memory usage:
    Memory (current): 374.78MiB
  Network usage:
    enp5s0:
      Type: broadcast
      State: UP
      Host interface: tap84ebf5ff
      MAC address: 00:16:3e:75:89:6e
      MTU: 1500
      Bytes received: 3.13kB
      Bytes sent: 1.30kB
      Packets received: 27
      Packets sent: 12
      IP addresses:
        inet:  172.17.250.94/24 (global)
        inet6: 2602:fc62:c:250:216:3eff:fe75:896e/64 (global)
        inet6: fe80::216:3eff:fe75:896e/64 (link)
    lo:
      Type: loopback
      State: UP
      MTU: 65536
      Bytes received: 5.92kB
      Bytes sent: 5.92kB
      Packets received: 80
      Packets sent: 80
      IP addresses:
        inet:  127.0.0.1/8 (local)
        inet6: ::1/128 (local)

此信息目前仅适用于虚拟机,因为容器不运行代理,并且直接从容器的文件系统中获取该信息可能是不安全的。

虚拟机的控制台历史记录

使用容器的控制台访问一直非常灵活,既可以进行交互式访问(incus console),也可以进行非交互式文本日志记录(incus console --show-log)。

但是对于虚拟机,情况稍微受限一些,因为 QEMU 不允许我们同时将控制台发送到交互式设备以及将所有内容记录到环形缓冲区中。

但我们已经找到了一种方法来解决这个问题,让 QEMU 根据是否有人连接到控制台在交互式后端和环形缓冲区之间切换。

最终结果是 incus console --show-log 现在也适用于虚拟机了!

stgraber@dakara:~$ incus console --show-log v1
BdsDxe: loading Boot0006 "Ubuntu" from HD(1,GPT,B7DD04C0-15CE-482C-A6AC-7278FDA10CF6,0x800,0x32000)/\EFI\ubuntu\shimx64.efi
BdsDxe: starting Boot0006 "Ubuntu" from HD(1,GPT,B7DD04C0-15CE-482C-A6AC-7278FDA10CF6,0x800,0x32000)/\EFI\ubuntu\shimx64.efi
rootfs: clean, 58918/6393600 files, 1074908/13081339 blocks

Ubuntu 24.04.1 LTS v1 ttyS0

v1 login:

创建集群化 LVM 卷组的能力

Incus 已经支持集群化 LVM 几个版本了,但到目前为止,共享卷组必须由用户预先创建。

现在 Incus 允许您直接指定共享块设备并让它创建卷组。

root@server01:~# incus storage create demo-lvm lvmcluster source=/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_incus_demo--shared --target server01
Storage pool demo-lvm pending on member server01
root@server01:~# incus storage create demo-lvm lvmcluster source=/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_incus_demo--shared --target server02
Storage pool demo-lvm pending on member server02
root@server01:~# incus storage create demo-lvm lvmcluster source=/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_incus_demo--shared --target server03
Storage pool demo-lvm pending on member server03
root@server01:~# incus storage create demo-lvm lvmcluster source=/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_incus_demo--shared --target server04
Storage pool demo-lvm pending on member server04
root@server01:~# incus storage create demo-lvm lvmcluster
Storage pool demo-lvm created

incus-migrate 中的 QCOW2 和 VMDK 支持

独立的 incus-migrate 工具现在可以导入现有的基于 QCOW2 和 VMDK 的虚拟机。这依赖于系统上可用的 qemu-img 来处理转换。

root@dakara:~# incus-migrate 
The local Incus server is the target [default=yes]: 
Would you like to create a container (1) or virtual-machine (2)?: 2
Project to create the instance in [default=default]: 
Name of the new instance: foo
Please provide the path to a disk, partition, or qcow2/raw/vmdk image file: /home/stgraber/demo/rhel9.qcow2
Does the VM support UEFI booting? [default=yes]: 
Does the VM support UEFI Secure Boot? [default=yes]:

Instance to be created:
  Name: foo
  Project: default
  Type: virtual-machine
  Source: /home/stgraber/demo/rhel9.qcow2
  Source format: qcow2

Additional overrides can be applied at this stage:
1) Begin the migration with the above configuration
2) Override profile list
3) Set additional configuration options
4) Change instance storage pool or volume size
5) Change instance network

Please pick one of the options above [default=1]:  
Converting image "/home/stgraber/demo/rhel9.qcow2" to raw format before importing
Instance foo successfully created

可配置的 macvlan 模式

到目前为止,macvlan 模式始终固定为 bridged
现在可以自定义它,允许使用其他模式,例如 vepapassthruprivate

stgraber@dakara:~$ incus create images:ubuntu/24.04 c1
Creating c1
stgraber@dakara:~$ incus config device add c1 eth0 nic nictype=macvlan parent=enp35s0 mode=private name=eth0
Device eth0 added to c1
stgraber@dakara:~$ incus start c1

负载均衡器健康信息

随着最近在我们的 OVN 负载均衡器中添加了健康监控功能,将 API 进一步扩展以公开该健康信息也变得有意义了。

root@server01:~# incus network load-balancer show default 172.31.254.50
description: ""
config:
  healthcheck: "true"
backends:
- name: c1
  description: ""
  target_port: ""
  target_address: 10.104.61.10
- name: c2
  description: ""
  target_port: ""
  target_address: 10.104.61.11
ports:
- description: ""
  protocol: tcp
  listen_port: "80"
  target_backend:
  - c1
  - c2
- description: ""
  protocol: tcp
  listen_port: "22"
  target_backend:
  - c1
  - c2
listen_address: 172.31.254.50
location: ""

root@server01:~# incus network load-balancer info default 172.31.254.50
Backend health:
  c1 (10.104.61.10):
    - tcp/80: online
    - tcp/22: offline

  c2 (10.104.61.11):
    - tcp/80: offline
    - tcp/22: online

OVN 网络的外部接口

现在可以在特定服务器上将外部物理接口附加到虚拟 OVN 网络。这使得物理和虚拟网络之间的桥接成为可能。

root@server01:~# incus network set bar bridge.external_interfaces=foo --target server02
root@server01:~# incus network info bar
Name: bar
MAC address: 00:16:3e:e6:b6:10
MTU: 1422
State: up
Type: broadcast

IP addresses:
  inet  10.179.82.1/24 (link)
  inet6 fd42:3f01:28ef:4257::1/64 (link)

Network usage:
  Bytes received: 0B
  Bytes sent: 0B
  Packets received: 0
  Packets sent: 0

OVN:
  Chassis: server01
  Logical router: incus-net25-lr
root@server01:~# ovn-nbctl lsp-list incus-net25-ls-int
e7070089-c979-4bc1-b6f2-1f63008af44b (incus-net25-external-n2-foo)
65eba7f1-e150-4dce-b054-180e389e4d58 (incus-net25-ls-int-lsp-router)

并行集群疏散/恢复

集群疏散和恢复可能是一个相当漫长的过程,尤其是在运行大量实例的集群上。

为了改进这一点,我们现在将自动并行化此过程。
为了限制影响,这是非常保守地完成的,并且每个 16 个 CPU 线程仅添加一个额外的并行迁移。因此,即使是最强大的服务器(具有 512 个线程)也只会看到 32 个实例同时移动。

完整变更日志

以下是此版本中所有更改的完整列表

完整提交列表
  • incus/network: 修复网络列表中的大小写
  • i18n: 更新翻译模板
  • incusd/storage/drivers/lvm: 缓存 VG 扩展大小
  • incusd/instance/qemu: 始终重新生成 nvram 符号链接
  • incusd/network/ovn: LSP 动态分配不能按协议进行
  • incusd/instance/qemu: 传递 FD 时设置 O_DIRECT
  • 使用 Weblate(法语)翻译
  • incusd/apparmor: 仅与守护进程一起初始化
  • incusd/instance/qemu: 使 O_DIRECT 受 directCache 条件限制
  • incusd/instance/qemu: 对不安全/回写强制线程 I/O 模式
  • incusd/instance/qemu: 远离已弃用的 fd: 语法
  • doc: 修复网络负载均衡器错别字
  • incusd/network/ovn: 修复负载均衡器配置键的组
  • doc: 更新元数据
  • incusd/apparmor: 为 QEMU 9.1 添加 sys_rawio
  • doc: 修复 limits.memory 默认值单位
  • incusd/storage/zfs: 确保 zvol 是块设备
  • incusd/apparmor: 在禁用 apparmor 时不要尝试卸载配置文件
  • internal/instance: 修复 limits.memory 的单位
  • doc: 更新元数据
  • 使用 Weblate(挪威博克马尔语)添加翻译
  • 使用 Weblate(挪威博克马尔语)翻译
  • shared/archive: 将 VMDK 映像添加到支持格式列表中
  • doc/installing: 添加 Rocky Linux 9
  • cmd/incus-migrate: 导入 VM 映像时报告检测到的源格式
  • incus/storage_volume: 修复快照列表
  • i18n: 更新翻译模板
  • 使用 Weblate(印度尼西亚语)添加翻译
  • internal/server/instance/drivers: 为 Windows VM 禁用 9p 和 vsock
  • cmd/incus-migrate: 在导入之前将 qcow2 和 vmdk 映像转换为原始格式
  • doc: 列出 incus-migrate 支持的映像格式
  • scripts: 修复 empty-incus.sh 实例删除
  • incusd/network/ovn: 正确处理 LB 检查器上缺少协议的情况
  • doc/installing: 添加到 Arch Wiki 的 Incus 链接
  • internal/server/instance/drivers: VM 停止时清理 spice 套接字
  • internal/server/instance/drivers: 将 QEMU 控制台的默认后端切换到 ringbuf
  • incus/console: 添加完成
  • internal/server/instance/drivers/qmp: 添加用于读取环形缓冲区和交换 chardev 后端的命令
  • internal/server/instance/drivers: 为 qemu 驱动程序实现 ConsoleLog()
  • internal/server/instance/drivers: 添加用于切换控制台后端的功能
  • cmd/incusd: 允许 VM 拉取类似于容器的控制台历史记录
  • cmd: 在错误消息中正确处理 --project
  • i18n: 更新翻译模板
  • incusd/project: 不要在授权器上失败项目删除
  • incusd/project: 不要在授权器上失败项目重命名
  • incus-user: 处理现有网络
  • incusd/networks: 在现有网络上返回 HTTP 冲突
  • incusd/networks: 将项目限制应用于网络名称列表
  • incusd/auth/tls: 允许访问继承的资源
  • instance/config: 将 @startup 添加到文档中
  • doc: 更新元数据
  • shared/validate: 更好地验证简单的 CPU 限制
  • incusd/operations: 修复操作取消
  • incusd/storage_volumes: 处理具有子路径的卷的重命名
  • incusd/storage/utils: 仅在 growFileSystem 中显示实际错误
  • internal/server/instance/drivers: 如果控制台日志文件不存在,则不要返回错误
  • incusd/instance/qemu: 正确连接 I/O 限制
  • incusd/apparmor: 允许在非特权容器中进行所有挂载
  • cleanup: 将 os.IsNotExist(err) 的使用替换为 errors.Is(err, fs.ErrNotExist)
  • incusd/network: 仅启用 IPv4 时允许使用 dns.search
  • incusd/apparmor: 删除 nosymfollow 检查(未使用)
  • doc: 在 OpenSUSE 中安装时添加有关 Nvidia gpu 使用的注释
  • api: instances_state_os_info
  • shared/api: 将 OSInfo 添加到 InstanceState
  • doc/rest-api: 刷新 swagger YAML
  • cmd/incus-agent: 返回实例状态时填充操作系统信息
  • cmd/incus: 打印状态中的操作系统信息(如果可用)
  • i18n: 更新翻译模板
  • tests: 不要过度配置测试卷
  • 使用 Weblate(德语)翻译
  • cmd/incus-migrate: 不要复制转换后的 VM 映像
  • incusd/instance_console: 检查类型断言的结果
  • incusd/images: 修复通过密钥访问映像
  • doc: 添加构建文档的先决条件部分
  • 使用 Weblate(德语)翻译
  • api: network_load_balancer_state
  • shared/api: 添加 NetworkLoadBalancerState
  • incusd/network/ovn/sb: 添加 GetServiceHealth
  • incusd/network: 添加 LoadBalancerState
  • incusd/network/load-balancer: 添加状态的 API
  • doc/rest-api: 刷新 swagger YAML
  • client: 添加 GetNetworkLoadBalancerState
  • incus/network_load_balancer: 添加 info 命令
  • i18n: 更新翻译模板
  • incusd: 仅在实际创建映像时才发出 image-created
  • incusd/instances: 指定目标时调用放置脚本
  • internal/server/instance/drivers/qmp: 确保传递给 RingbufRead() 的设备是环形缓冲区
  • internal/server/instance/drivers: 如果 VM 的控制台设备不是环形缓冲区,则不要返回错误
  • internal/server/instance/drivers: 不要与实时迁移操作冲突
  • incus/alias: 处理带引号的值
  • incus/alias: 别名名称的稳定排序
  • incusd/instance/qemu: 修复旧 NVRAM 的问题
  • incusd/device/nic: 添加 macvlan 模式的配置
  • doc/devices/nic: 为 macvlan 设备添加模式
  • api: instance_nic_macvlan_mode
  • alpine linux 启用边缘存储库
  • cmd/incusd: gateway 参数实际上在任何地方都没有使用
  • cmd/incusd: 并行运行集群疏散和恢复
  • formatting: 将 goroutine 移动到它们自己的函数中
  • 使用 Weblate(德语)翻译
  • internal/instance: 允许将 VM 的 limits.memory 配置设置为百分比值
  • incusd/network/ovn: 修复 CIDR 大小检查
  • incusd/instance/lxc: 如果路径存在,则挂载 /run
  • doc: 将取消注释添加到词列表中
  • incus/file/delete: 使用 SFTP 客户端而不是文件 API
  • incus/file/delete: 添加 --force 标志
  • i18n: 更新翻译模板
  • doc/network/resolved: 修复 systemd 单位
  • internal/instance: 修复 boot.host_shutdown_action 的文档
  • doc: 更新元数据
  • client: 捕获原始 OCI 映像标识符
  • incus/file/delete: 缓存 SFTP 客户端
  • shared/subprocess: 添加 TryRunCommandAttemptsDuration(),允许调用者指定尝试次数和每次尝试之间的时间间隔
  • internal/server/storage/drivers: 添加对创建共享 VG 的支持
  • doc: Incus 现在可以直接创建一个共享 VG
  • api: storage_lvm_cluster_create
  • 使用 Weblate(印度尼西亚语)翻译
  • incusd/network/ovn: 允许将外部接口添加到 OVN 网络
  • doc/network/ovn: 添加 bridge.external_interfaces 参数的描述
  • api: network_ovn_external_interfaces
  • incusd/network: 去重外部接口验证
  • gomod: 更新依赖项
  • incusd/instance/qemu: 简化控制台切换
  • incusd/instance/qemu: 处理现有的控制台连接
  • incusd/instance/qemu: 修复关机竞争
  • doc/devices/proxy: 修正错误的 bind= 示例
  • incusd/network/bridge: 启动外部接口

文档

Incus 文档可以在以下地址找到:
https://linuxcontainers.cn/incus/docs/main/

软件包

Incus 上游只发布常规的发布版 tarball,因此没有官方的 Incus 软件包。以下是启动和运行 Incus 的一些可用选项。

在 Linux 上安装 Incus 服务器

Incus 可用于大多数常见的 Linux 发行版。您可以在我们的文档中找到详细的安装说明。

https://linuxcontainers.cn/incus/docs/main/installing/

Incus 客户端的 Homebrew 软件包

客户端工具可通过 HomeBrew 在 Linux 和 MacOS 上使用。

https://formulae.brew.sh.cn/formula/incus

Incus 客户端的 Chocolatey 软件包

客户端工具可通过 Chocolatey 供 Windows 用户使用。

https://community.chocolatey.org/packages/incus/6.6.0

Incus 客户端的 Winget 软件包

客户端工具也可通过 Winget 供 Windows 用户使用。

https://winstall.app/apps/LinuxContainers.Incus

支持

每月功能发布仅支持到下一个版本发布为止。需要更长时间支持和更少更改的用户应考虑使用 Incus 6.0 LTS。

社区支持提供于:https://discuss.linuxcontainers.org
商业支持可通过以下途径获得:https://zabbly.com/incus
错误报告地址:https://github.com/lxc/incus/issues

Incus 6.0.2 LTS 已发布

2024年9月17日

简介

Incus 团队很高兴地宣布 Incus 6.0.2 发布!

这是 Incus 6.0 的第二个错误修复版本,支持期限至 2029 年 6 月。

更改

像往常一样,这个错误修复版本专注于稳定性和强化。

还回传了一些小的改进,特别是那些不需要数据迁移、数据库更改或导致用户界面行为发生任何意外更改的改进。

随着时间的推移,LTS 分支中此类改进的数量将减少。

此版本的亮点包括

  • 完成 OVS/OVN 对原生 OVSDB 的过渡
  • 集群用户的基线 CPU 定义
  • 文件系统对 io.busio.cache 的支持
  • 服务器资源中的 CPU 标志
  • incus-simplestreams 中的统一镜像支持
  • 完成 libovsdb 过渡
  • 使用卷的子路径作为磁盘
  • 每个存储池项目的限制
  • 隔离的 OVN 网络(无上行链路)
  • 每个实例的 LXCFS
  • 在创建/启动时支持环境文件
  • 实例自动重启
  • 所有列表命令中的列选择
  • QMP 命令钩子和脚本
  • 虚拟机中的实时磁盘调整大小支持
  • PCI 设备热插拔
  • OVN 负载均衡器健康检查
  • OVN 网卡的混杂模式
  • 能够在 OVN 网卡上运行 IP 分配
  • 可自定义的 OIDC 范围请求
  • 可配置的 LVM PV 元数据大小
  • 可配置的 OVS 套接字路径

完整的提交列表如下所示

详细更改日志
  • incusd/network/ovn: 将 CreateLogicalRouterRoute 移植到 libovsdb
  • incusd/network/ovn: 将 DeleteLogicalRouterRoute 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 将 DeleteLogicalRouterPort 移植到 libovsdb
  • incusd/network/ovn: 删除 LogicalRouterPortDeleteIPv6Advertisements
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 将 DeleteLogicalSwitch 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 删除 logicalSwitchFindAssociatedPortGroups
  • incusd/network/ovn: 对负载均衡器表进行特殊处理
  • incusd/network/ovn: 对齐函数上下文处理
  • incusd/network/ovn: 将 DeleteLogicalSwitchDHCPOption 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalSwitchPortLocation 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalSwitchPortUUID 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalRouterPortHardwareAddress 移植到 libovsdb
  • incusd/network/ovn: 添加 GetLogicalRouter
  • incusd/network/ovn: 将 DeleteLoadBalancer 移植到 libovsdb
  • incusd/network/acl: 更新 OVN 功能更改
  • incusd/network: 更新 OVN 功能更改
  • incusd/network: 简化 OVN 网络删除逻辑
  • incusd/network/ovn: 将 UpdateLogicalSwitchIPAllocation 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateLogicalSwitchDHCPv4Revervations 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalSwitchDHCPv4Revervations 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalSwitchDHCPOptions 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateLogicalSwitchDHCPv4Options 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateLogicalSwitchDHCPv6Options 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 将 logicalSwitchPortACLRules 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalSwitchPorts 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateLogicalSwitchPortOptions 移植到 libovsdb
  • incusd/network/ovn: 将 CreatePortGroup 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/device/nic: 更新 OVN 功能更改
  • incusd/network/acl: 更新 OVN 功能更改
  • incusd/network/ovn: 将 GetPortGroupsByProject 移植到 libovsdb
  • incusd/network/ovn: 将 CreateAddressSet 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateAddressSetAdd 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateAddressSetRemove 移植到 libovsdb
  • incusd/network/ovn: 将 DeleteAddressSet 移植到 libovsdb
  • incusd/network/acl: 更新 OVN 功能更改
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 将 UpdateLogicalSwitchPortLinkRouter 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateLogicalSwitchPortLinkProviderNetwork 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalSwitchIPs 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalSwitchPortDNS 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 将 UpdateLogicalSwitchPortDNS 移植到 libovsdb
  • incusd/network/ovn: 将 UpdatePortGroupMembers 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateLogicalRouterPolicy 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 将 CreateLoadBalancer 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalRouterRoutes 移植到 libovsdb
  • incusd/network/ovn: 将 DeleteLogicalRouterPeering 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 将 CreateLogicalRouterPeering 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 将 logicalSwitchPortDeleteDNSOperations 移植到 libovsdb
  • incusd/network/ovn: 将 DeleteLogicalSwitchPortDNS 移植到 libovsdb
  • incusd/network/ovn: 将 logicalSwitchPortDeleteOperations 移植到 libovsdb
  • incusd/network/ovn: 将 CleanupLogicalSwitchPort 移植到 libovsdb
  • incusd/network/ovn: 将 aclRuleDeleteOperations 移植到 libovsdb
  • incusd/network/ovn: 将 aclRuleAddOperations 移植到 libovsdb
  • incusd/network/ovn: 将 ClearPortGroupPortACLRules 移植到 libovsdb
  • incusd/network/ovn: 将 UpdatePortGroupPortACLRules 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateLogicalSwitchACLRules 移植到 libovsdb
  • incusd/network/ovn: 将 UpdatePortGroupACLRules 移植到 libovsdb
  • incusd/network/acl: 更新 OVN 功能更改
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 删除 nbctl
  • api: disk_io_bus_cache_filesystem
  • incusd/device/disk: 扩展 io.bus 选项
  • incusd/device/disk: 扩展 io.cache 选项
  • incusd/device/disk: 添加对 virtiofs 上 io.cache 的支持
  • incusd/device/disk: 添加对文件系统上 io.bus 的支持
  • incusd/instance/driver_qemu: 处理 9p 被禁用
  • doc: 更新配置
  • incusd/instance/edk2: 添加新的软件包来跟踪 EDK2 固件
  • incusd/instance/qemu: 更新到新的 edk2 软件包
  • incusd/apparmor: 更新到新的 edk2 软件包
  • doc: 清理 OVMF/EDK2 处理以涵盖 aarch64
  • incusd/instance/qemu: 修复仅 virtiofs 磁盘的处理
  • incus/storage_volume: 微调帮助消息
  • i18n: 更新翻译模板
  • incus/storage_volume: 修复 lint
  • doc/installing: 提及 incus-tools 软件包
  • incus-simplestreams: 添加对统一镜像的支持
  • incus-simplestreams: 微调帮助消息
  • incus-simplestreams: 重构统一逻辑
  • gomod: 更新依赖项
  • incusd/apparmor: 允许 devpts 挂载
  • incusd: 改进配置文件重命名错误
  • incusd/sys: 添加集群资源缓存路径
  • incusd/daemon: 在本地缓存其他服务器资源
  • incusd/instance/drivers/qmp: 添加 QueryCPUModel
  • incusd/instance/qemu: 使用集群 CPU 标志进行 migration.stateful
  • incus-user: 使用较短的接口名称表示较长的 UID
  • incusd/device/network: 修复 OVN 中的 Tap 接口 MTU
  • incusd/isntance: 不要在 INFO 消息中公开所有内部标志
  • incusd/instance/lxc: 允许从 Create 操作调用 Update
  • shared/subprocess: 允许在 Windows 上构建
  • client: 添加基本的 OCI 注册表客户端
  • shared/cliconfig: 添加 OCI 远程支持
  • shared/subprocess: 修复 gofmt
  • incusd/storage/lvmcluster: 不允许存储桶
  • incusd/storage/lvmcluster: 不要独占锁定 ISO 卷
  • incusd/device/disk: 允许将同一个 ISO 附加到多个实例
  • incusd/device/disk: 允许使用代理/cloud-init 磁盘进行实时迁移
  • incusd/instance/qemu: 修复使用代理/cloud-init 磁盘进行实时迁移
  • incusd/device/disk: 在未初始化的池上不要崩溃
  • incusd/storage/lvmcluster: 始终使用共享访问
  • incusd/instance/lxc: 当没有每个实例的值时,不要报告文件系统指标
  • incus/top: 将间隔设置为 10 秒(服务器端最小值为 8)
  • incus/top: 隐藏零值
  • incusd/device/disk: 将虚拟磁盘标记为始终可迁移
  • tests: 更新最近更改的指标测试
  • incus-simplestreams: 修复拆分镜像
  • doc/storage_backup: 修正命令示例
  • incusd/instance/edk2: 支持 arm64 上的 OVMF 文件名
  • incusd/instance/drivers/qemu: 将 CPU 标志计算限制为 x86_64
  • incus/s3: 修复 mcli minio 客户端可执行文件名称检查
  • incusd/instance/qemu: 修复架构检查反向
  • 将 RunDir 文件模式更改为 0711
  • incusd/apparmor/qemu: 略微放宽 apparmor 规则
  • incus-simplestreams: 处理组合镜像的删除
  • incusd/apparmor/qemu: 修正规则中的拼写错误
  • incusd/apparmor/dnsmasq: 略微放宽规则
  • incusd/db/node: 修复 GetAPI 中的版本检查
  • incusd/db: 允许使用不同的 API 扩展启动集群
  • incusd: 扩展心跳数据以获取最小 API 扩展计数
  • incusd/storage: 使用写回模式进行 qemu-img 转换
  • incusd/storage: 改进解压消息
  • incusd/operations: 处理仅百分比更新
  • incusd/storage: 将跟踪器传递给 qemu-img
  • [lxd-import] lxd/db/cluster: 将 "node" 重命名为 "cluster member"。
  • [lxd-import] lxd/db/cluster: 更新单元测试中的错误消息。
  • incusd/db/cluster: 更新测试以适应放宽的 API 扩展检查
  • incusd/apparmor: 为 qemu-img 实现进度跟踪器
  • incusd/cgroup: 处理 io.stat 中的未知设备
  • incusd/instance_post: 始终设置目标项目
  • incusd/storage/drivers: 一致地设置 VolumeMultiNode
  • incusd/storage/lvm: 在快照期间需要独占锁
  • incusd/storage/lvm: 在调整大小期间正确处理激活
  • incusd/storage: 正确检测远程块上的文件系统
  • incusd/cluster: 始终尝试转发自定义卷请求
  • client: 始终设置 GetBody
  • client: 报告 OIDC 刷新失败
  • incus/remote: 转发 OIDC 身份验证失败
  • client: 在代理指示时重试
  • 使用 qemu-img 转换输出更新进度
  • incusd/cluster: 添加 flagFormat
  • internal/cmd: 添加对格式选项的支持
  • incusd/isntance/edk2: 将 seabios 移动到 /usr/share/qemu
  • incusd/isntance/edk2: 添加 ArchLinux x86_64 路径
  • tests: 在属性测试中使用未来值
  • incusd/db/cluster: 清理缩进
  • incusd/db/cluster: 更新模式
  • incusd/db/generate: 为集群表添加异常
  • incusd/resources: 添加 sortedMapKeys
  • incusd/resources/cpu: 对套接字、核心和线程进行排序
  • incusd/auth: 填充缺少的本地卷位置
  • incusd/cluster: 在移动时正确记录 volatile.cluster.group
  • incusd/migration: 首先显示源错误
  • incusd/instance/qemu: 阐明实时迁移错误
  • incusd/cluster: 在修复之前尝试 ping 服务器
  • incusd/instance/qemu: 修复错误的超时错误
  • incusd/instance/qemu: 在关机时发送两个 ACPI 事件
  • incusd/instance: 添加到导出的进度跟踪
  • client: 当无法回溯时,删除 GetBody
  • client: 将 Seek 调用添加到 GetBody
  • incusd: 简化镜像复制
  • incusd/images: 只从授权者中删除一次
  • incusd/images: 正确记录新的别名
  • incusd/images: 正确删除别名
  • incusd/images: 在正确的时间设置授权者条目
  • incusd/images: 在集群复制时不要更改镜像信息

  • incusd/storage_pools: 为挂起的存储池设置授权器
  • incusd/networks: 为挂起的网络设置授权器
  • incusd/network: 处理较长的接口名称
  • incus/cluster: 清理证书更新消息
  • [lxd-import] github: 停止清除 core20
  • [lxd-import] github: 清除已禁用/被取代的 snap
  • [lxd-import] github: 将 snap 删除移动到“回收一些空间”步骤
  • [lxd-import] github: 将 docker 删除放到其自己的步骤中
  • [lxd-import] github: 使用单个命令屏蔽 lxc{,-net}.service
  • [lxd-import] lxd/instance/drivers/driver/qemu: 探测 Direct I/O 支持时不要泄漏文件描述符
  • [lxd-import] lxd/network/acl: 更改 ovn 日志的协议字段
  • [lxd-import] lxd/instance: 拒绝虚拟机的 limits.kernel 配置
  • [lxd-import] doc: limits.kernel 仅适用于容器(参见 #12874)
  • [lxd-import] lxd/storage: 修复具有自定义 zfs.pool_name 的池的大小调整
  • [lxd-import] lxd/storage/drivers/driver_zfs_utils: 修正错别字
  • [lxd-import] lxd/storage/drivers/driver_zfs_utils: 明确指出块大小以字节为单位
  • [lxd-import] lxd/task/group: 为清晰起见,将 cancel 类型设置为 context.CancelFunc
  • [lxd-import] doc: 添加关于如何删除镜像的段落
  • [lxd-import] test: 添加 exec 退出代码测试
  • [lxd-import] lxd/apparmor: 允许受限服务接收所需的信号
  • [lxd-import] lxd/rsync: 一致地以纳秒为单位比较文件
  • [lxd-import] test/suites/migration: 检查刷新后的文件内容
  • [lxd-import] test/suites/migration: 基于纳秒检查本地和远程实例刷新
  • [lxd-import] doc: 添加关于如何删除镜像的段落
  • [lxd-import] doc: 为 pyspelling 启用多进程
  • [lxd-import] Makefile: 使 run-parts 报告它运行的脚本
  • [lxd-import] lxd/storage/drivers/ceph: 禁用块卷上的文件系统配置键
  • [lxd-import] lxd/storage/drivers/lvm: 禁用块卷上的文件系统配置键
  • [lxd-import] test: 添加检查以恢复类型为块的自定义卷
  • [lxd-import] lxd/storage/drivers/ceph: 更新 UnmountVolumeSnapshot 文档字符串
  • [lxd-import] lxd: 改进对现有证书的错误检查
  • [lxd-import] shared/api: 更新证书字段的 Swagger 描述。
  • [lxd-import] shared/api: 修复 lint 错误(接收器命名)。
  • [lxd-import] lxd/db/cluster: 修复 lint 错误(revive: var-naming)。
  • [lxd-import] lxd-migrate: 忽略 lint 错误(revive: deep-exit)。
  • [lxd-import] lxc/remote: 修复 lint 错误(revive: exported)。
  • [lxd-import] lxd/storage/backend: 不要重复验证自定义存储卷
  • [lxd-import] lxd-generate: 返回有用的错误而不是恐慌。
  • [lxd-import] lxd/storage/backend: 对错误消息使用一致的引号
  • [lxd-import] lxd/project: 不要在 StorageVolumeParts 上恐慌
  • [lxd-import] github: 不要在重新挂载失败时中止
  • [lxd-import] test/main: 添加日志分组 (GHA)
  • [lxd-import] test/main: 在失败时显示 dmesg
  • [lxd-import] lxd/api/internal: 在 internalImportFromBackup 中使用正确的错误引用
  • [lxd-import] lxd/db/cluster/devices: 在 NewDeviceType 中使用设备类型的正确字符串引用
  • [lxd-import] lxd/instances/post: 改进 createFromBackup 中的错误
  • [lxd-import] lxd/storage/backend/lxd: 在 CreateInstanceFromBackup 中生成实例和卷数据库记录后更新 backup.yaml
  • [lxd-import] test/main: 不要将测试日志包装在日志组中
  • [lxd-import] lxd/device/disk: 删除 cloud-init:config 磁盘设备时删除 config.iso 文件
  • [lxd-import] lxd/images: 在 autoSyncImages 中的错误中添加项目
  • [lxd-import] lxd/project/project: 从 StorageVolumeProject 中删除优化
  • [lxd-import] lxd/storage/volumes: 删除 doCustomVolumeRefresh 中不必要的 2 行变量定义
  • [lxd-import] lxd/storage/volumes: 删除 doVolumeCreateOrCopy 中不必要的 2 行变量定义
  • [lxd-import] lxd/storage/volumes: 在 doCustomVolumeRefresh 中验证源项目
  • [lxd-import] [lxd-import] lxd/storage/volumes: 在 doVolumeCreateOrCopy 中验证源项目
  • [lxd-import] lxd/db/cluster: 删除冗余括号。
  • [lxd-import] lxd/migrate/storage/volumes: 在 migrationSourceWs.DoStorage 中使用数据库中的卷名称
  • [lxd-import] lxd/network/network/utils: 修复 inRoutingTable 中从 int64 到 int 的不正确转换
  • [lxd-import] lxd/network/network/utils: 通过将 base 传递给 ParseInt 删除对 fmt.Sprintf 的不必要调用
  • [lxd-import] lxd/response: 如果 SyncResponse success=false,则使用 SmartError
  • [lxd-import] lxd/storage/drivers/driver/zfs/volumes: 修复 CreateVolumeFromCopy 中的错误范围
  • [lxd-import] lxd/storage/drivers/driver/zfs/volumes: 在 CreateVolumeFromCopy 中一起定义发送/接收通道
  • [lxd-import] lxd/storage/drivers/driver/zfs/volumes: 如果接收方失败,则在 CreateVolumeFromCopy 中终止发送方
  • [lxd-import] lxd/storage/drivers/driver/zfs/volumes: 在 CreateVolumeFromCopy 中处理多行错误
  • [lxd-import] lxd/storage/drivers/driver/btrfs/volumes: 修复 btrfs receive 失败时 RefreshVolume 发生挂起的问题
  • [lxd-import] lxd/storage/drivers/driver/btrfs/volumes: 在 RefreshVolume 中处理多行错误
  • [lxd-import] lxd/storage/drivers/driver/zfs/volumes: 使 RefreshVolume 与 BTRFS 驱动程序保持一致
  • [lxd-import] lxd/response: 在设置标头后回退到错误响应
  • [lxd-import] lxd/storage/backend/lxd: 在 BackupCustomVolume 中使用 VolumeDBGet 中的卷名称
  • [lxd-import] lxd/storage/drivers/btrfs: 阐明 UUID 发现超时时的回退情况
  • incusd/db/cluster: 修复导入隐藏
  • doc/rest-api: 刷新 swagger YAML
  • [lxd-import] lxd/storage/drivers: 向 roundVolumeBlockSizeBytes 添加卷参数
  • [lxd-import] lxd/storage/drivers/zfs: 四舍五入到 zfs.blocksize 或 16KiB
  • [lxd-import] test/storage: 添加非 2 的幂大小存储检查
  • [lxd-import] test/storage: 删除 zfs 四舍五入测试
  • [lxd-import] lxd/storage/drivers: 重构卷大小舍入逻辑
  • [lxd-import] lxd/storage/drivers/zfs: 激活卷时等待设备出现
  • [lxd-import] lxd/storage/drivers/zfs: 检查非 /dev/zvol/* 路径
  • incusd/storage/zfs: 修复导入隐藏
  • 使 run-parts 运行与不同版本兼容
  • api: instances_lxcfs_per_instance
  • incusd/server/config: 添加 instances.lxcfs.per_instance
  • incusd/instance/lxc: 添加对每个实例 LXCFS 的支持
  • doc: 更新配置
  • incus/top: 正确过滤磁盘使用情况
  • incusd/state: 添加集群网关
  • incusd/daemon: 对状态字段进行排序
  • incusd/daemon: 将集群网关添加到状态
  • incusd/acme: 更新以适应状态更改
  • incusd/images: 更新以适应状态更改
  • incusd/operations: 更新以适应状态更改
  • incusd/instances: 更新以适应状态更改
  • incusd/patches: 更新以适应状态更改
  • incusd/cluster: 更新以适应状态更改
  • incusd/instances: 使用 targetGroupPrefix
  • incusd/cluster: 拆分文件
  • incusd/cluster: 修复导入隐藏
  • incusd/cluster: 重构修复逻辑
  • incusd/cluster: 改进日志记录
  • incusd/cluster: 减少 dqlite 日志记录
  • incusd/cluster: 扩展 HasConnectivity 以进行 API 检查
  • incusd/cluster: 将 HasConnectivity 检查添加到事件处理
  • incusd: 不要在启动时阻塞集群查询
  • incusd/cluster: 重做离线服务器检测
  • incusd/cluster/evacuation: 添加单独的修复模式
  • incusd/cluster/healing: 最多尝试 5 次
  • incusd/cluster/healing: 添加日志记录
  • incusd/device/disk: 修复错误的 CanMigrate 逻辑
  • incusd/storage/lvm: 正确激活/停用 ISO
  • incusd/images: 将镜像类型作为标头公开
  • client: 如果是 OCI,则跳过镜像哈希
  • incusd/device: 不要在 LXCFS 设备条目上失败
  • client: 在复制时也报告源错误
  • incusd/storage: 使 roundVolumeBlockSizeBytes 返回错误
  • incusd/instance_post: 修复跨服务器实时迁移
  • incus/image: 修正镜像复制逻辑
  • incusd/storage/lvm: 加固通用函数
  • incusd/api: 在缺少配置时不要恐慌
  • incusd/storage: 添加 Deactivate 标志
  • incusd/storage/lvm: 为集群添加停用步骤
  • incusd/cluster: 为当前正在启动的服务器返回清晰的状态
  • incusd/instance/lxc: 降低日志级别
  • incusd/instance/qemu: 降低日志级别
  • incusd/migrate: 减少日志记录
  • incusd/storage: 减少日志记录
  • incusd/instance/qemu: 删除双生命周期事件
  • tests/clustering: 使用正确的目标项目参数
  • incusd/isntance/edk2: 修复 CSM 处理
  • incusd/storage/zfs: 始终调用 tryGetVolumeDiskPathFromDataset
  • incusd/network/ovn: 要求功能性上行链路
  • doc: 添加 colima 指令
  • doc: 更新 incus_alias.md
  • incus/network/load_balancer: 修复示例
  • i18n: 更新翻译模板
  • incusd/network/ovn: 修复未初始化的外部 ID 导致的崩溃
  • doc/instances: 添加虚拟机代理安装说明
  • shared/api: 将 Config 添加到 ServerUntrusted
  • doc/rest-api: 刷新 swagger YAML
  • incusd/api_1.0: 将 user.ui 配置键公开给所有客户端
  • doc/server: 提到 user.ui 配置键
  • incusd/auth/oidc: 更好地处理注销
  • incusd/networks: 为 OVN 网络发出生命周期事件和授权条目
  • incusd/network/ovn: 修复缩进
  • doc/storage_volume: 修复快照命令
  • shared/api: 添加 EventLifecycleInstanceMigrated
  • shared/api: 对生命周期事件进行排序
  • incusd/lifecycle: 添加 InstanceMigrated
  • incusd/lifecycle: 对生命周期事件进行排序
  • incusd/isntance/operationlock: 添加 ActionMigrate
  • incusd/instance/common: 添加对迁移操作的支持
  • incusd/instance/qemu: 添加对迁移操作和生命周期的支持
  • incusd/instance/lxc: 添加对迁移操作和生命周期的支持
  • shared/api: 添加集群疏散和修复的生命周期事件
  • incusd/lifecycle: 添加集群疏散和修复的生命周期事件
  • incusd/cluster: 添加疏散的生命周期事件
  • incusd/request: 从事件地址中剥离端口
  • incusd/instance: 正确链接实例和操作
  • incusd/operations: 为嵌套操作添加 CopyRequestor
  • incusd/instance: 在 exec/console 期间跟踪操作
  • doc/clustering: 更好地记录修复
  • incusd/instance: 在创建期间跟踪操作
  • incusd/instance: 在删除期间跟踪操作
  • incusd/instance: 跟踪 API 操作
  • incusd/instance: 在快照上设置操作
  • incus-migrate: 正确处理项目
  • incusd/apparmor: 支持委托时允许挂载 zfs
  • doc/clustering: 添加集群访问方法
  • cmd/incusd: 设置保持活动超时
  • incusd/auth/oidc: 处理无法设置 Cookie 的情况
  • incusd/instance/qemu: 取消引用 ceph 配置路径
  • incusd/apparmor/qemu: 猜测 ceph 配置路径
  • incusd/instance/lxc: 尊重 LXCFS_OPTS
  • incusd/instance/drivers: 提取 GetClusterCPUFlags
  • incusd: 将 OVN 切换到 getter 函数
  • incusd/network: 移植到新的 OVN 状态函数
  • incus: 添加对环境文件(.env)的支持
  • i18n: 更新翻译模板
  • incusd/storage/lvm: 重新尝试激活/停用
  • incusd/storage/lvm: 在冷迁移期间不要激活卷
  • shared/cliconfig: 添加 CacheDir
  • incus: 配置缓存目录
  • api: disk_volume_subpath
  • incusd/device/disk: 允许自定义卷内的相对路径
  • doc/devices_disk: 提到子路径
  • tests: 测试卷子路径
  • api: projects_limits_disk_pool
  • incusd/projects: 添加新的 limits.disk.pool 配置键
  • doc: 更新配置
  • incus/project: 处理池磁盘限制
  • incusd/project: 添加每个池的磁盘限制
  • incusd/project: 添加 HiddenStoragePools
  • incusd/storage: 隐藏限制为零的池
  • tests: 添加每个池限制的测试
  • incus/image/alias: 添加对列选择的支持
  • i18n: 更新翻译模板
  • api: network_ovn_isolated
  • incusd/network/ovn: 加固删除逻辑
  • doc/network/ovn: 涵盖隔离网络
  • incusd/networks: 为上行链路保留“none”
  • incusd/network/ovn: 允许创建隔离的 OVN 网络(无上行链路)
  • incusd/device/nic_ovn: 处理没有上行链路的网络
  • gomod: 更新依赖项
  • incus/remote/list: 添加对列选择的支持
  • incus/cluster/group/list: 添加对列选择的支持
  • client: 导入文档示例

  • 客户端: 文档名称变量
  • 客户端: 文档别名 & 服务器/协议默认值
  • incusd/storage: 修复子目录卷的 UsedBy 值
  • incusd/instance: 修复备份文件锁定问题
  • incusd/projects: 在缺少池的情况下不失败项目创建
  • incusd/device/pci: 允许热插拔
  • incusd/instance/qmp: 添加 CheckPCIDevice
  • incusd/instance/qemu: 使用 monitor.CheckPCIDevice
  • incusd/instance/qemu: 微调 deviceStart 注释
  • incusd/instance/qemu: 添加对通用 PCI 的热插拔支持
  • 客户端: 修复示例中的错别字
  • incus/operation/list: 添加对列选择的支持
  • doc/firewalld: 更新 Docker 链接
  • incus/network/zone/list: 添加对列选择的支持
  • incusd/instance/drivers/qmp: 导出 RunJSON
  • api: qemu_raw_qmp
  • incusd/instance: 添加原始 QMP 配置选项
  • doc: 将 QMP 添加到词汇表
  • doc: 更新配置
  • incusd/instance/qemu: 添加 QMP 钩子
  • incusd/project: 更新底层属性
  • incus/network/forward/list: 添加对列选择的支持
  • incus/network/list-leases: 添加对列选择的支持
  • doc: 更新 incus_alias.md
  • incus/network/list-allocations: 添加对列选择的支持
  • api: network_load_balancer_health_check
  • incusd/network/ovn: 简化 CreateLoadBalancer
  • incusd/network: 更新以适应 CreateLoadBalancer 的更改
  • incusd/network/ovn: 在 LoadBalancer 中添加健康检查支持
  • incusd/network: 添加健康检查配置选项
  • incusd/network/ovn: 添加健康检查选项
  • incusd/network/ovn: 保留最后一个 IPv4 地址
  • doc/network/load_balancer: 添加配置选项
  • doc: 更新配置
  • incus/admin/init: 提示输入目录存储位置
  • tests: 更新以适应初始化中的额外步骤
  • incus/network/integration/list: 添加对列选择的支持
  • incus/storage/bucket/list: 添加对列选择的支持
  • api: oidc_scopes
  • incusd/config: 添加 oidc.scopes
  • incusd/oidc: 添加自定义范围支持
  • doc: 更新配置
  • incus/storage/bucket: 在密钥列表中添加对列选择的支持
  • incus/snapshot/list: 添加对列选择的支持
  • incusd/storage/lvm: 修复调整大小逻辑以保留 LV 状态
  • incusd/network/ovn: 设置缺失的 send_periodic 字段
  • incusd/profiles: 提高列表性能
  • incusd/server/db: 将事务截止时间增加到 30 秒
  • incusd/db/profiles: 支持 ToAPI 中的设备缓存
  • incusd: 尽可能将配置文件设备缓存传递给 ToAPI 调用
  • incusd/db/instances: 支持 ToAPI 的设备缓存
  • incusd: 尽可能将实例设备缓存传递给 ToAPI 调用
  • incusd/db/instances: 允许将配置文件设备传递给实例 ToAPI
  • incusd: 尽可能将配置文件设备缓存传递给实例 ToAPI 调用
  • incusd/instances: 删除旧的重试逻辑
  • incusd/network_integration: 修复文档字符串中的错别字
  • doc: 更新配置
  • incusd/network/ovn: 使用稳定的随机数作为 IC 网关底盘优先级
  • api: network_integrations_peer_name
  • incusd/network_integrations: 将 peerName 添加到 ovn.transit.pattern
  • incusd/network/ovn: 将 peerName 暴露给 ovn.transit.pattern
  • doc: 更新配置
  • incus/cluster/list-tokens: 添加对列选择的支持
  • i18n: 更新翻译模板
  • incusd/storage_volumes_state: 处理驱动程序返回的不受支持的响应
  • lxd-to-incus: 处理 /run/incus/ 中的 Incus 套接字
  • incusd/network/ovn: 记录中转子网
  • incusd/network/ovn: 添加中转交换机地址分配函数
  • incusd/network/ovn: 设置中转交换机分配
  • incusd/auth/openfga: 避免使用已弃用的 ApiSchema 和 ApiHost
  • incusd/auth: 重组权限列表
  • incusd/auth/openfga: 对 openfga 模型中的条目进行排序
  • incusd/auth/openfga: 添加缺失的网络集成权限
  • incusd/auth/openfga: 需要管理员级别才能创建项目
  • incusd/auth/openfga: 重建模型
  • incusd/auth: 修复网络集成对象
  • incus/config/trust/list-tokens: 添加对列选择的支持
  • incus/network/peer/list: 添加对列选择的支持
  • incus/network/load-balancer/list: 添加对列选择的支持
  • 将 Cloud Init 的“user”更改为“users”
  • shared/api: 修复卷备份的错误结构体命名
  • 客户端: 更新以适应已修复的卷备份结构体
  • incus: 更新以适应已修复的卷备份结构体
  • incusd: 更新以适应已修复的卷备份结构体
  • incusd/storage_volume_backup: 修复 swagger 引用
  • incusd/storage_bucket_backup: 修复 swagger 引用
  • doc/rest-api: 刷新 swagger YAML
  • incusd/device/nic: 使突发速率对入站流量动态化
  • incusd/storage/lvm: 允许在线调整大小
  • incusd/storage/zfs: 允许在线调整 ZFS 块卷的大小
  • incusd/device/disk: 在调整大小时添加回调
  • incusd/instance/drivers/qmp: 添加调整大小处理
  • incusd/instance/qemu: 添加磁盘调整大小处理
  • incusd/node/config: 添加 network.ovs.connection
  • doc: 将 /var/run 切换到仅 /run
  • incusd/cluster/config: 从 /var/run 切换到 /run
  • incusd/instance/agent-loader: 不要硬编码路径
  • incusd/syslog: 更新 OVS 路径
  • doc: 更新配置
  • incusd/network/ovs: 使 OVS 数据库可配置
  • incusd/state: 添加 OVS 函数
  • incusd: 在 State 上设置 OVS 函数
  • incusd: 移植到 state.OVS
  • incusd: 根据需要重置 OVS
  • incusd/network/ovn: 限制 MAC_Binding 爆炸
  • incusd/network/ovn: 将 ARP 限制添加到更新的路由器
  • incusd/network/ovn: 等待更长时间以使 northd 分配地址
  • i18n: 更新翻译模板
  • incusd/apparmor: 不要持续查询版本并缓存
  • incusd/storage/driver/dir: 在配额更改时不要不必要地重新应用项目 ID
  • incusd/storage/quota: 在缺少路径时不要失败
  • incusd/storage/lvm: 对繁忙环境重试 setactivation 跳过
  • api: qemu_scriptlet
  • incusd/instance: 添加 qemu scriptlet 配置选项
  • incusd: 将 QEMU 默认值移动到子包
  • incusd/scriptlet: 移动日志记录器定义
  • incusd/scriptlet: 添加辅助函数
  • incusd/scriptlet: 添加 Unmarshal 函数
  • incusd/scriptlet: 添加 qemu scriptlet
  • incusd/project: 更新底层属性
  • doc: 更新元数据
  • incusd/scriptlet: 删除已弃用的 starlark.SourceProgram
  • Makefile: 将 Go 最低版本切换到 1.22
  • gomod: 更新依赖项
  • doc: 更新需求
  • incusd/instance/drivers/qemu: 修复节点名称溢出逻辑
  • incusd/instance/drivers/qemu: 添加缺失的节点名称处理
  • incusd/api_internal: 添加 API 以通知卷调整大小
  • incusd/cluster: 修复跨多个服务器共享卷的重定向循环
  • incusd/storage/backend: 在块自定义卷调整大小后通知实例
  • api: instance_auto_restart
  • incusd/instance: 添加 boot.autorestart
  • doc: 更新元数据
  • incusd/instance/drivers: 实现 shouldAutoRestart
  • incusd/instance/drivers/lxc: 实现 boot.autorestart
  • incusd/instance/drivers/qemu: 实现 boot.autorestart
  • tests: 验证自动重启逻辑
  • 客户端: 修复推送模式复制中的错误处理
  • incusd/network/ovn: 修复 send_periodic 语法
  • incusd/project: 验证组名称
  • incusd/db: 在放置期间确认集群组有效性
  • doc/cluster_group: 提到重命名组
  • api: storage_lvm_metadatasize
  • doc/storage_lvm: 添加 lvm.metadata_size
  • incusd/storage/lvm: 添加 lvm.metadata_size
  • incusd/storage/zfs: 仅在工具存在时尝试加载模块
  • incusd/instance/edk2: 添加 Void Linux x86_64 路径
  • incusd/profiles: 在强制删除时清空默认配置文件
  • 回退 "incusd/instance/agent-loader: 不要硬编码路径"
  • incusd/device: 添加新的 Register 函数
  • incusd/instance/drivers: 使用 Register 函数
  • incusd/device: 不要使 Register 依赖于 validate
  • incusd/storage/drivers: 添加 isDeleted 标志
  • incusd/storage/drivers/ceph: 重做 parseClone
  • incusd/storage/drivers/ceph: 重做 parseParent
  • incusd/storage/drivers/ceph: 使用 isDeleted 标志
  • incusd/instance/qemu: 允许 setCPUs 重用 QMP
  • incusd/instance/qmp: 处理 QMP 偶尔返回多个响应
  • incusd/seccomp: 更新系统调用编号
  • incusd/instance/drivers/qemu: 将热插拔插槽数量加倍
  • incusd/instance/qemu: 重做 PCI 热插拔
  • incusd/instance/drivers/edk2: 限制对 GetenvEdk2Path 的调用
  • incusd/instance/drivers/edk2: 实际检查文件是否存在
  • incusd/device/config: 修复注释
  • api: ovn_nic_promiscuous
  • doc/devices/nic_ovn: 添加 security.promiscuous
  • incusd/network/ovn: 仅在未设置路由器接口时设置 LSP 上的 DHCP 选项
  • incusd/network/ovn: 添加对混杂逻辑交换机端口的支持
  • incusd/network/ovn: 连接 security.promiscuous
  • incusd/device/nic: 添加 security.promiscuous
  • api: ovn_nic_ip_address_none
  • doc/devices/nic_ovn: 为 ipv4.address/ipv6.address 添加 none
  • incusd/device/nic_ovn: 允许将“none”作为 ipv4.address/ipv6.address 的值
  • incusd/network/ovn: 添加对禁用 LSP 上分配的支持
  • incusd/network/ovn: 连接对 ipvX.address=none 的支持
  • incusd/network/ovn: 修复负载均衡器的 BGP 通告
  • incus-user: 处理已删除的项目
  • Makefile: 将 Go 最低版本设置为 1.22.0
  • Makefile: 删除已弃用的标志
  • gomod: 更新依赖项
  • incusd/auth: 更新以适应 openfga-go-sdk API 中断
  • incus/network: 修复网络列表中的大小写
  • i18n: 更新翻译模板
  • incusd/storage/drivers/lvm: 缓存 VG 扩展大小
  • incusd/instance/qemu: 始终重新生成 nvram 符号链接
  • incusd/network/ovn: LSP 动态分配不能按协议进行
  • incusd/instance/qemu: 传递 FD 时设置 O_DIRECT
  • incusd/apparmor: 仅与守护进程一起初始化
  • incusd/instance/qemu: 使 O_DIRECT 受 directCache 条件限制
  • incusd/instance/qemu: 对不安全/回写强制线程 I/O 模式
  • incusd/instance/qemu: 远离已弃用的 fd: 语法
  • doc: 修复网络负载均衡器错别字
  • incusd/network/ovn: 修复负载均衡器配置键的组
  • doc: 更新元数据
  • incusd/apparmor: 为 QEMU 9.1 添加 sys_rawio
  • doc: 修复 limits.memory 默认值单位
  • incusd/storage/zfs: 确保 zvol 是块设备
  • incusd/apparmor: 在禁用 apparmor 时不要尝试卸载配置文件
  • internal/instance: 修复 limits.memory 的单位
  • doc: 更新元数据
  • shared/archive: 将 VMDK 映像添加到支持格式列表中
  • doc/installing: 添加 Rocky Linux 9
  • cmd/incus-migrate: 导入 VM 映像时报告检测到的源格式
  • incus/storage_volume: 修复快照列表
  • internal/server/instance/drivers: 为 Windows VM 禁用 9p 和 vsock
  • cmd/incus-migrate: 在导入之前将 qcow2 和 vmdk 映像转换为原始格式
  • doc: 列出 incus-migrate 支持的映像格式
  • scripts: 修复 empty-incus.sh 实例删除
  • i18n: 更新翻译模板
  • gomod: 更新依赖项

打包者须知

在此版本中,INCUS_OVMF_PATH 环境变量已重命名为 INCUS_EDK2_PATH,以避免使用特定于体系结构的名称(arm64 使用 AAVMF),而是依赖于固件的通用名称。

支持和升级

Incus 6.0 分支支持到 2029 年 6 月。始终强烈建议保持最新并运行最新的 LTS 修补程序版本。

下载

Incus 6.5 已发布

2024 年 9 月 6 日

简介

Incus 团队很高兴地宣布发布 Incus 6.5!

此版本的重点是性能。已经显著优化了代价高昂的内部调用,例如解析大量配置文件和设备,从而导致性能提升高达 20-30 倍。类似地,处理每个服务器上拥有数千个实例的系统也得到了极大的改进,将启动检查时间从几十分钟缩短到几十秒。

但这不仅仅是一个错误修复版本,Incus 6.5 还引入了许多新功能和其他改进。从使我们的 CLI 体验更加一致,到简化对虚拟机执行底层操作,再到改善应用程序容器用户的体验,以及为 OVN 用户提供大量出色的新功能,此版本应该为每个人都提供了一些东西!

image|690x190

像往常一样,您可以在线试用:https://linuxcontainers.cn/incus/try-it/

尽情享受!

新功能

实例自动重启

自从我们在 Incus 中首次推出应用程序容器支持以来,一个常见的请求是能够在实例退出时自动重启实例,这使得处理应用程序崩溃或重新加载变得更加容易。

这通过一个新的 boot.autorestart 配置键来控制,当将其设置为 true 时,Incus 将尝试在 1 分钟的时间范围内最多重启给定实例 10 次。

用户请求的实例关闭/停止不会触发自动重启逻辑。

stgraber@castiana:~$ incus launch docker:nginx nginx -c boot.autorestart=true
Launching nginx
stgraber@castiana:~$ incus info nginx | grep PID
PID: 178789
stgraber@castiana:~$ sudo kill -9 178789
stgraber@castiana:~$ incus list nginx
+-------+---------+----------------------+-----------------------------------------------+-----------------+-----------+
| NAME  |  STATE  |         IPV4         |                     IPV6                      |      TYPE       | SNAPSHOTS |
+-------+---------+----------------------+-----------------------------------------------+-----------------+-----------+
| nginx | RUNNING | 10.178.240.76 (eth0) | fd42:8384:a6f8:63a0:216:3eff:fef4:5a27 (eth0) | CONTAINER (APP) | 0         |
+-------+---------+----------------------+-----------------------------------------------+-----------------+-----------+
stgraber@castiana:~$

文档: https://linuxcontainers.cn/incus/docs/main/reference/instance_options/#boot-related-options

所有列表命令中的列选择

在过去的几个版本中,我们一直在努力提高 incus CLI 命令的一致性。这从确保我们所有 list 命令都支持 --format 开始,现在在此版本中,所有 list 命令现在也支持 --columns

这允许轻松自定义您获得的输出,并通过结合 --format=csv--column= 来选择相关的列,从而使编写 incus 命令的脚本变得更加容易。

stgraber@castiana:~$ incus snapshot list v1 --columns=nT --format=csv
snap0,2024/09/06 15:04 EDT
snap1,2024/09/06 15:04 EDT

QMP 命令钩子和脚本

Incus 目前依赖于 QEMU 来运行其虚拟机。

Incus 与 QEMU 交互的方式有时可能有点复杂,因为它实际上是通过三种不同的机制完成的

  • QEMU 命令行
  • QEMU 配置文件
  • QEMU 机器协议 (QMP)

我们通常尽量避免污染命令行,因此将其保持在最低限度,但我们允许用户通过raw.qemu传递其他参数。

对于任何不需要实时更新或不需要热插拔或热移除的设备,我们首选使用QEMU配置文件。这很容易模板化,并且可以非常轻松地进行测试。我们有raw.qemu.conf配置选项,可用于扩展或覆盖该配置文件的内容。

然后我们有QMP,我们将其用于任何可热插拔的设备,因此实际上包括所有磁盘、网络接口、USB设备或任何其他PCI设备。由于QEMU团队正在慢慢尝试弃用配置文件,因此我们预计将逐渐将越来越多的VM配置迁移到QMP。

到目前为止,QMP的主要问题是,与QEMU命令行或配置文件不同,它非常不透明。无法轻松查看已配置的内容,并且由于任何这些对象都将在QEMU启动后进行配置,因此无法通过现有机制覆盖或重新配置它们。

但现在由于一些新的配置选项,情况有所不同。

  • raw.qemu.qmp.early
  • raw.qemu.qmp.pre-start
  • raw.qemu.qmp.post-start
  • raw.qemu.scriptlet

前三个采用QMP命令的JSON列表。QMP命令通常已经全部进行JSON编码,因此可以轻松地向实例配置添加许多自定义命令。这些命令将在指定时间之一按顺序运行。

early在Incus通过QMP添加任何内容之前运行,pre-start在Incus通过QMP添加所有设备后运行,post-start在指示QEMU启动VM后立即运行。

raw.qemu.scriptlet是一个更灵活的选项,因为它接受一个脚本片段(类似Python的语法),该脚本片段必须定义一个名为qemu_hook的函数,并将其作为参数传递给stage。该阶段是earlypre-startpost-start之一。它与raw.qemu.qmp选项的区别在于,脚本片段可以处理命令响应并具有相应的逻辑。

这意味着此QEMU脚本片段可以调用run_qmp命令,传递自定义QMP命令,读取其返回值并在需要时发出更多命令,从而允许动态重新配置VM。

请注意,这是一个非常底层的机制,我们只期望专家用户在非常具体的案例中使用它。与任何raw配置键一样,其使用实际上不受Incus团队的支持,并且对于任何不受信任的项目也应保持禁用状态。

虚拟机中的实时磁盘调整大小支持

现在可以调整VM根磁盘或任何附加磁盘的大小,并让VM收到更改通知。然后,这会导致操作系统更新磁盘的大小,并允许用户立即使用额外的空间,而无需重新启动VM。

stgraber@castiana:~$ incus exec v1 bash
root@v1:~# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   10G  0 disk
├─sda1   8:1    0  100M  0 part /boot/efi
└─sda2   8:2    0  9.9G  0 part /
root@v1:~#
exit

stgraber@castiana:~$ incus config device override v1 root size=20GiB
Device root overridden for v1

stgraber@castiana:~$ incus exec v1 bash
root@v1:~# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   20G  0 disk
├─sda1   8:1    0  100M  0 part /boot/efi
└─sda2   8:2    0  9.9G  0 part /
root@v1:~#

PCI设备热插拔

现在可以在VM上实时添加和移除PCI设备。
这现在与NIC、GPU和磁盘设备中的行为相匹配。

OVN负载均衡器健康检查

Incus对OVN负载均衡器的支持到目前为止非常基本,基本上仅限于在不监控后端的情况下对一组目标上的流量进行基本负载均衡。

但现在随着对OVN负载均衡器健康检查的初始支持,情况正在发生变化。
这通过负载均衡器上的一组配置键进行配置。

  • healthcheck => 启用健康检查
  • healthcheck.failure_count => 认为后端失败所需的失败尝试次数
  • healthcheck.interval => 检查后端的频率(以秒为单位)
  • healthcheck.success_count => 认为后端联机所需的成功尝试次数
  • healthcheck.timeout => 在认为尝试失败之前等待响应的时间

仅需要healthcheck,其他所有选项都有合理的默认值。

root@server01:~# incus launch images:ubuntu/24.04 c1
Launching c1
root@server01:~# incus exec c1 -- apt-get install --yes nginx
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  nginx-common
Suggested packages:
  fcgiwrap nginx-doc ssl-cert
The following NEW packages will be installed:
  nginx nginx-common
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 552 kB of archives.
After this operation, 1596 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu noble/main amd64 nginx-common all 1.24.0-2ubuntu7 [31.2 kB]
Get:2 http://archive.ubuntu.com/ubuntu noble/main amd64 nginx amd64 1.24.0-2ubuntu7 [521 kB]
Fetched 552 kB in 1s (619 kB/s)
Preconfiguring packages ...
Selecting previously unselected package nginx-common.
(Reading database ... 16176 files and directories currently installed.)
Preparing to unpack .../nginx-common_1.24.0-2ubuntu7_all.deb ...
Unpacking nginx-common (1.24.0-2ubuntu7) ...
Selecting previously unselected package nginx.
Preparing to unpack .../nginx_1.24.0-2ubuntu7_amd64.deb ...
Unpacking nginx (1.24.0-2ubuntu7) ...
Setting up nginx (1.24.0-2ubuntu7) ...
Setting up nginx-common (1.24.0-2ubuntu7) ...
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
root@server01:~# incus launch images:ubuntu/24.04 c2
Launching c2
root@server01:~# incus list
+------+---------+--------------------+-----------------------------------------------+-----------+-----------+----------+
| NAME |  STATE  |        IPV4        |                     IPV6                      |   TYPE    | SNAPSHOTS | LOCATION |
+------+---------+--------------------+-----------------------------------------------+-----------+-----------+----------+
| c1   | RUNNING | 10.104.61.2 (eth0) | fd42:73ae:9013:c530:216:3eff:feff:ddf2 (eth0) | CONTAINER | 0         | server01 |
+------+---------+--------------------+-----------------------------------------------+-----------+-----------+----------+
| c2   | RUNNING | 10.104.61.3 (eth0) | fd42:73ae:9013:c530:216:3eff:fec4:611 (eth0)  | CONTAINER | 0         | server02 |
+------+---------+--------------------+-----------------------------------------------+-----------+-----------+----------+

root@server01:~# incus network load-balancer create default 172.31.254.50
Network load balancer 172.31.254.50 created
root@server01:~# incus network load-balancer backend add default 172.31.254.50 c1 10.104.61.2
root@server01:~# incus network load-balancer backend add default 172.31.254.50 c2 10.104.61.3
root@server01:~# incus network load-balancer port add default 172.31.254.50 tcp 80 c1,c2

root@server01:~# incus launch images:ubuntu/24.04 t1
Launching t1
root@server01:~# incus exec t1 -- nc -v 172.31.254.50 80
nc: connect to 172.31.254.50 port 80 (tcp) failed: Connection refused
root@server01:~# incus exec t1 -- nc -v 172.31.254.50 80
nc: connect to 172.31.254.50 port 80 (tcp) failed: Connection refused
root@server01:~# incus exec t1 -- nc -v 172.31.254.50 80
Connection to 172.31.254.50 80 port [tcp/http] succeeded!

root@server01:~# incus network load-balancer set default 172.31.254.50 healthcheck=true

root@server01:~# incus exec t1 -- nc -v 172.31.254.50 80
Connection to 172.31.254.50 80 port [tcp/http] succeeded!
^Croot@server01:~# incus exec t1 -- nc -v 172.31.254.50 80
Connection to 172.31.254.50 80 port [tcp/http] succeeded!
^Croot@server01:~# incus exec t1 -- nc -v 172.31.254.50 80
Connection to 172.31.254.50 80 port [tcp/http] succeeded!
^Croot@server01:~# incus exec t1 -- nc -v 172.31.254.50 80
Connection to 172.31.254.50 80 port [tcp/http] succeeded!
^Croot@server01:~# incus exec t1 -- nc -v 172.31.254.50 80
Connection to 172.31.254.50 80 port [tcp/http] succeeded!

文档:https://linuxcontainers.cn/incus/docs/main/howto/network_load_balancers/

OVN互连的ECMP支持

OVN互连的网络集成支持已通过几种小方法进行了扩展。

  • ovn.transit.pattern配置选项现在支持新的peerName变量。
  • 现在可以在针对同一网络集成的网络上拥有多个对等体。
  • 中转交换机上的IP分配现在直接记录在OVN数据库中,而不是依赖于随机子网。

最终结果是,现在可以更改默认的core.transit.pattern以在模板中包含peerName,然后向网络添加多个对等体,所有这些对等体都指向同一个互连。

在内部,这将导致创建多个中转交换机,只要所有参与系统的对等体名称匹配,流量就会通过ECMP在这些交换机之间进行均衡。

这样做可以非常有效地平衡互连流量。

root@chulak:~# incus list ic
+---------+---------+--------------------+-----------------------------------------------+-----------+-----------+----------+
|  NAME   |  STATE  |        IPV4        |                     IPV6                      |   TYPE    | SNAPSHOTS | LOCATION |
+---------+---------+--------------------+-----------------------------------------------+-----------+-----------+----------+
| ic-test | RUNNING | 10.47.238.2 (eth0) | fd42:4a11:5600:6807:216:3eff:feb5:2c79 (eth0) | CONTAINER | 0         | chulak   |
+---------+---------+--------------------+-----------------------------------------------+-----------+-----------+----------+
root@chulak:~# incus exec ic-test bash
root@ic-test:~# ping 10.170.69.2
PING 10.170.69.2 (10.170.69.2) 56(84) bytes of data.
From 45.45.148.162 icmp_seq=1 Destination Net Unreachable
--- 10.170.69.2 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
root@ic-test:~#

root@chulak:~# incus network peer create ovn-ic-test peer1 dcmtl --type=remote
Network peer peer1 created
root@chulak:~# incus network peer create ovn-ic-test peer2 dcmtl --type=remote
Network peer peer2 created
root@chulak:~# incus network peer create ovn-ic-test peer3 dcmtl --type=remote
Network peer peer3 created
root@chulak:~# incus network peer create ovn-ic-test peer4 dcmtl --type=remote
Network peer peer4 created

root@chulak:~# incus exec ic-test bash
root@ic-test:~# ping 10.170.69.2
PING 10.170.69.2 (10.170.69.2) 56(84) bytes of data.
64 bytes from 10.170.69.2: icmp_seq=1 ttl=62 time=11.8 ms
64 bytes from 10.170.69.2: icmp_seq=2 ttl=62 time=6.01 ms
--- 10.170.69.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 6.012/8.930/11.848/2.918 ms

文档:https://linuxcontainers.cn/incus/docs/main/howto/network_integrations/

OVN NIC的混杂模式

OVN NIC上现在提供了新的security.promiscuous配置键。

启用后,任何目标MAC地址未知的OVN流量现在都将发送到OVN NIC。

这主要用于嵌套环境,您希望某些嵌套容器或VM直接位于父OVN网络上,而无需拥有自己的专用端口。
这通常是开发/测试用例,因为混杂模式会导致大量不必要的网络流量到达NIC。

root@server01:~# incus launch images:ubuntu/24.04 t1
Launching t1
root@server01:~# incus exec t1 bash
root@t1:~# ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
48: eth0@if49: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1422 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 00:16:3e:f3:d4:3e brd ff:ff:ff:ff:ff:ff link-netnsid 0
root@t1:~# ip link set eth0 address 00:16:3e:f3:d4:30
root@t1:~# ip -4 a add dev eth0 10.104.61.100/24
root@t1:~# ping 10.104.61.1
PING 10.104.61.1 (10.104.61.1) 56(84) bytes of data.
^C
--- 10.104.61.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1009ms

root@t1:~#
exit

root@server01:~# incus config device override t1 eth0 security.promiscuous=true
Device eth0 overridden for t1
root@server01:~# incus exec t1 bash
root@t1:~# ip link set eth0 address 00:16:3e:f3:d4:30
root@t1:~# ip -4 a add dev eth0 10.104.61.100/24
root@t1:~# ping 10.104.61.1
PING 10.104.61.1 (10.104.61.1) 56(84) bytes of data.
64 bytes from 10.104.61.1: icmp_seq=1 ttl=254 time=1.20 ms
^C
--- 10.104.61.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.197/1.197/1.197/0.000 ms
root@t1:~#

文档:https://linuxcontainers.cn/incus/docs/main/reference/devices_nic/#nictype-ovn

能够关闭OVN NIC上的IP分配

另一个新的OVN NIC选项是能够完全关闭IP分配。

这通常与前面的情况相关,其中混杂NIC通常不需要拥有自己的IPv4和IPv6地址。为了处理这种情况,现在可以将ipv4.addressipv6.address都设置为none,从而禁用分配。

请注意,OVN不允许仅禁用一种协议,因此目前必须将这两个键都设置为none才能使其正常工作。

root@server01:~# incus config device set t1 eth0 ipv4.address=none ipv6.address=none
root@server01:~# incus start t1
root@server01:~# incus exec t1 bash
root@t1:~# ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
root@t1:~#

文档:https://linuxcontainers.cn/incus/docs/main/reference/devices_nic/#nictype-ovn

可自定义的OIDC范围请求

现在可以配置正在请求的OpenID Connect范围列表。

在服务器配置中设置oidc.scopes将覆盖默认值openid, offline_access,并且可用于通过诸如profile之类的范围提取其他信息。

文档:https://linuxcontainers.cn/incus/docs/main/server_config/#openid-connect-configuration

可配置的LVM PV元数据大小

包含数千个逻辑卷的非常大的LVM卷组可能会超出预留的元数据大小。

这在LVM精简置备池(默认)上已经可以配置,但对于粗置备,没有匹配的配置。

现在可以设置lvm.metadata_size配置键来覆盖LVM的默认值。
请注意,这只能在创建时完成。

stgraber@castiana:~$ incus storage create demo lvm lvm.use_thinpool=false
Storage pool demo created
stgraber@castiana:~$ sudo vgs -o name,mda_size
  VG   VMdaSize
  demo  1020.00k
stgraber@castiana:~$ incus storage delete demo
Storage pool demo deleted

stgraber@castiana:~$ incus storage create demo lvm lvm.use_thinpool=false lvm.metadata_size=100MiB
Storage pool demo created
stgraber@castiana:~$ sudo vgs -o name,mda_size
  VG   VMdaSize
  demo  <101.00m
stgraber@castiana:~$ incus storage delete demo
Storage pool demo deleted

文档:https://linuxcontainers.cn/incus/docs/main/reference/storage_lvm/#configuration-options

可配置的OVS套接字路径

在某些情况下,OpenVSwitch不会在通常的地址运行。

最常见的案例是MicroOVN用户,其中OpenVSwitch套接字存储在/var/snap/microovn/common/...中。

到目前为止,这些用户必须跳过一些步骤才能在/run中获得有效的OVS套接字,以便Incus正确连接到它。

通过此更改,现在可以将network.ovs.connection配置键设置为有效的OVSDB连接字符串,并让Incus通过该字符串访问OpenVSwitch。默认值为unix:/run/openvswitch/db.sock

文档:https://linuxcontainers.cn/incus/docs/main/server_config/#server-options-misc

完整变更日志

以下是此版本中所有更改的完整列表

完整提交列表
  • incus/remote/list: 添加对列选择的支持
  • i18n: 更新翻译模板
  • incus/cluster/group/list: 添加对列选择的支持
  • i18n: 更新翻译模板
  • 使用Weblate(简体中文)翻译
  • 使用Weblate(简体中文)翻译
  • client: 导入文档示例

  • 客户端: 文档名称变量
  • 客户端: 文档别名 & 服务器/协议默认值
  • incusd/storage: 修复子目录卷的 UsedBy 值
  • incusd/instance: 修复备份文件锁定问题
  • incusd/projects: 在缺少池的情况下不失败项目创建
  • incusd/device/pci: 允许热插拔
  • incusd/instance/qmp: 添加 CheckPCIDevice
  • incusd/instance/qemu: 使用 monitor.CheckPCIDevice
  • incusd/instance/qemu: 微调 deviceStart 注释
  • incusd/instance/qemu: 添加对通用 PCI 的热插拔支持
  • 客户端: 修复示例中的错别字
  • 使用Weblate(简体中文)翻译
  • incus/operation/list: 添加对列选择的支持
  • i18n: 更新翻译模板
  • doc/firewalld: 更新 Docker 链接
  • incus/network/zone/list: 添加对列选择的支持
  • i18n: 更新翻译模板
  • incusd/instance/drivers/qmp: 导出 RunJSON
  • api: qemu_raw_qmp
  • incusd/instance: 添加原始 QMP 配置选项
  • doc: 将 QMP 添加到词汇表
  • doc: 更新配置
  • incusd/instance/qemu: 添加 QMP 钩子
  • incusd/project: 更新底层属性
  • incus/network/forward/list: 添加对列选择的支持
  • i18n: 更新翻译模板
  • 使用Weblate(简体中文)翻译
  • cmd/incusd:将主机名添加到DHCP请求
  • incus/network/list-leases: 添加对列选择的支持
  • i18n: 更新翻译模板
  • 使用Weblate(简体中文)翻译
  • doc: 更新 incus_alias.md
  • incus/network/list-allocations: 添加对列选择的支持
  • i18n: 更新翻译模板
  • api: network_load_balancer_health_check
  • incusd/network/ovn: 简化 CreateLoadBalancer
  • incusd/network: 更新以适应 CreateLoadBalancer 的更改
  • incusd/network/ovn: 在 LoadBalancer 中添加健康检查支持
  • incusd/network: 添加健康检查配置选项
  • incusd/network/ovn: 添加健康检查选项
  • incusd/network/ovn: 保留最后一个 IPv4 地址
  • doc/network/load_balancer: 添加配置选项
  • doc: 更新配置
  • incus/admin/init: 提示输入目录存储位置
  • tests: 更新以适应初始化中的额外步骤
  • i18n: 更新翻译模板
  • incus/network/integration/list: 添加对列选择的支持
  • i18n: 更新翻译模板
  • incus/storage/bucket/list: 添加对列选择的支持
  • i18n: 更新翻译模板
  • api: oidc_scopes
  • incusd/config: 添加 oidc.scopes
  • incusd/oidc: 添加自定义范围支持
  • doc: 更新配置
  • incus/storage/bucket: 在密钥列表中添加对列选择的支持
  • i18n: 更新翻译模板
  • incus/snapshot/list: 添加对列选择的支持
  • i18n: 更新翻译模板
  • incusd/storage/lvm: 修复调整大小逻辑以保留 LV 状态
  • incusd/network/ovn: 设置缺失的 send_periodic 字段
  • incusd/profiles: 提高列表性能
  • incusd/server/db: 将事务截止时间增加到 30 秒
  • incusd/db/profiles: 支持 ToAPI 中的设备缓存
  • incusd: 尽可能将配置文件设备缓存传递给 ToAPI 调用
  • incusd/db/instances: 支持 ToAPI 的设备缓存
  • incusd: 尽可能将实例设备缓存传递给 ToAPI 调用
  • incusd/db/instances: 允许将配置文件设备传递给实例 ToAPI
  • incusd: 尽可能将配置文件设备缓存传递给实例 ToAPI 调用
  • incusd/instances: 删除旧的重试逻辑
  • incusd/network_integration: 修复文档字符串中的错别字
  • doc: 更新配置
  • incusd/main_forknet:调整DHCP客户端以首先应用DNS
  • incusd/network/ovn: 使用稳定的随机数作为 IC 网关底盘优先级
  • api: network_integrations_peer_name
  • incusd/network_integrations: 将 peerName 添加到 ovn.transit.pattern
  • incusd/network/ovn: 将 peerName 暴露给 ovn.transit.pattern
  • doc: 更新配置
  • incus/cluster/list-tokens: 添加对列选择的支持
  • i18n: 更新翻译模板
  • incusd/storage_volumes_state: 处理驱动程序返回的不受支持的响应
  • incusd/db/cluster:删除网络集成/对等唯一索引
  • incusd/db/cluster: 更新模式
  • lxd-to-incus: 处理 /run/incus/ 中的 Incus 套接字
  • incusd/network/ovn: 记录中转子网
  • incusd/network/ovn: 添加中转交换机地址分配函数
  • incusd/network/ovn: 设置中转交换机分配
  • incusd/auth/openfga: 避免使用已弃用的 ApiSchema 和 ApiHost
  • incusd/auth: 重组权限列表
  • incusd/auth/openfga: 对 openfga 模型中的条目进行排序
  • incusd/auth/openfga: 添加缺失的网络集成权限
  • incusd/auth/openfga: 需要管理员级别才能创建项目
  • incusd/auth/openfga: 重建模型
  • incusd/auth: 修复网络集成对象
  • incus/config/trust/list-tokens: 添加对列选择的支持
  • i18n: 更新翻译模板
  • incus/network/peer/list: 添加对列选择的支持
  • i18n: 更新翻译模板
  • incus/network/load-balancer/list: 添加对列选择的支持
  • i18n: 更新翻译模板
  • 使用Weblate(简体中文)翻译
  • 将 Cloud Init 的“user”更改为“users”
  • shared/api: 修复卷备份的错误结构体命名
  • 客户端: 更新以适应已修复的卷备份结构体
  • incus: 更新以适应已修复的卷备份结构体
  • incusd: 更新以适应已修复的卷备份结构体
  • incusd/storage_volume_backup: 修复 swagger 引用
  • incusd/storage_bucket_backup: 修复 swagger 引用
  • doc/rest-api: 刷新 swagger YAML
  • incusd/device/nic: 使突发速率对入站流量动态化
  • incusd/storage/lvm: 允许在线调整大小
  • incusd/storage/zfs: 允许在线调整 ZFS 块卷的大小
  • incusd/device/disk: 在调整大小时添加回调
  • incusd/instance/drivers/qmp: 添加调整大小处理
  • incusd/instance/qemu: 添加磁盘调整大小处理
  • incusd/node/config: 添加 network.ovs.connection
  • doc: 将 /var/run 切换到仅 /run
  • incusd/cluster/config: 从 /var/run 切换到 /run
  • incusd/instance/agent-loader: 不要硬编码路径
  • incusd/syslog: 更新 OVS 路径
  • doc: 更新配置
  • incusd/network/ovs: 使 OVS 数据库可配置
  • incusd/state: 添加 OVS 函数
  • incusd: 在 State 上设置 OVS 函数
  • incusd: 移植到 state.OVS
  • incusd: 根据需要重置 OVS
  • incusd/network/ovn: 限制 MAC_Binding 爆炸
  • incusd/network/ovn: 将 ARP 限制添加到更新的路由器
  • incusd/network/ovn: 等待更长时间以使 northd 分配地址
  • incusd/apparmor: 不要持续查询版本并缓存
  • incusd/storage/driver/dir: 在配额更改时不要不必要地重新应用项目 ID
  • incusd/storage/quota: 在缺少路径时不要失败
  • incusd/storage/lvm: 对繁忙环境重试 setactivation 跳过
  • api: qemu_scriptlet
  • incusd/instance: 添加 qemu scriptlet 配置选项
  • incusd: 将 QEMU 默认值移动到子包
  • incusd/scriptlet: 移动日志记录器定义
  • incusd/scriptlet: 添加辅助函数
  • incusd/scriptlet: 添加 Unmarshal 函数
  • incusd/scriptlet: 添加 qemu scriptlet
  • incusd/project: 更新底层属性
  • doc: 更新元数据
  • incusd/scriptlet: 删除已弃用的 starlark.SourceProgram
  • Makefile: 将 Go 最低版本切换到 1.22
  • gomod: 更新依赖项
  • doc: 更新需求
  • incusd/instance/drivers/qemu: 修复节点名称溢出逻辑
  • incusd/instance/drivers/qemu: 添加缺失的节点名称处理
  • incusd/api_internal: 添加 API 以通知卷调整大小
  • incusd/cluster: 修复跨多个服务器共享卷的重定向循环
  • incusd/storage/backend: 在块自定义卷调整大小后通知实例
  • api: instance_auto_restart
  • incusd/instance: 添加 boot.autorestart
  • doc: 更新元数据
  • incusd/instance/drivers: 实现 shouldAutoRestart
  • incusd/instance/drivers/lxc: 实现 boot.autorestart
  • incusd/instance/drivers/qemu: 实现 boot.autorestart
  • tests: 验证自动重启逻辑
  • 客户端: 修复推送模式复制中的错误处理
  • incusd/network/ovn: 修复 send_periodic 语法
  • incusd/project: 验证组名称
  • incusd/db: 在放置期间确认集群组有效性
  • doc/cluster_group: 提到重命名组
  • api: storage_lvm_metadatasize
  • doc/storage_lvm: 添加 lvm.metadata_size
  • incusd/storage/lvm: 添加 lvm.metadata_size
  • incusd/storage/zfs: 仅在工具存在时尝试加载模块
  • incusd/instance/edk2: 添加 Void Linux x86_64 路径
  • incusd/profiles: 在强制删除时清空默认配置文件
  • 回退 "incusd/instance/agent-loader: 不要硬编码路径"
  • incusd/device: 添加新的 Register 函数
  • incusd/instance/drivers: 使用 Register 函数
  • incusd/device: 不要使 Register 依赖于 validate
  • incusd/storage/drivers: 添加 isDeleted 标志
  • incusd/storage/drivers/ceph: 重做 parseClone
  • incusd/storage/drivers/ceph: 重做 parseParent
  • incusd/storage/drivers/ceph: 使用 isDeleted 标志
  • incusd/instance/qemu: 允许 setCPUs 重用 QMP
  • incusd/instance/qmp: 处理 QMP 偶尔返回多个响应
  • incusd/seccomp: 更新系统调用编号
  • incusd/instance/drivers/qemu: 将热插拔插槽数量加倍
  • incusd/instance/qemu: 重做 PCI 热插拔
  • incusd/instance/drivers/edk2: 限制对 GetenvEdk2Path 的调用
  • incusd/instance/drivers/edk2: 实际检查文件是否存在
  • incusd/device/config: 修复注释
  • api: ovn_nic_promiscuous
  • doc/devices/nic_ovn: 添加 security.promiscuous
  • incusd/network/ovn: 仅在未设置路由器接口时设置 LSP 上的 DHCP 选项
  • incusd/network/ovn: 添加对混杂逻辑交换机端口的支持
  • incusd/network/ovn: 连接 security.promiscuous
  • incusd/device/nic: 添加 security.promiscuous
  • api: ovn_nic_ip_address_none
  • doc/devices/nic_ovn: 为 ipv4.address/ipv6.address 添加 none
  • incusd/device/nic_ovn: 允许将“none”作为 ipv4.address/ipv6.address 的值
  • incusd/network/ovn: 添加对禁用 LSP 上分配的支持
  • incusd/network/ovn: 连接对 ipvX.address=none 的支持
  • incusd/network/ovn: 修复负载均衡器的 BGP 通告
  • incus-user: 处理已删除的项目
  • Makefile: 将 Go 最低版本设置为 1.22.0
  • Makefile: 删除已弃用的标志
  • gomod: 更新依赖项
  • incusd/auth: 更新以适应 openfga-go-sdk API 中断

文档

Incus 文档可以在以下地址找到:
https://linuxcontainers.cn/incus/docs/main/

软件包

Incus 上游只发布常规的发布版 tarball,因此没有官方的 Incus 软件包。以下是启动和运行 Incus 的一些可用选项。

在Linux上安装Incus服务器

Incus 可用于大多数常见的 Linux 发行版。您可以在我们的文档中找到详细的安装说明。

https://linuxcontainers.cn/incus/docs/main/installing/

Incus客户端的Homebrew软件包

客户端工具可通过 HomeBrew 在 Linux 和 MacOS 上使用。

https://formulae.brew.sh.cn/formula/incus

Incus客户端的Chocolatey软件包

客户端工具可通过 Chocolatey 供 Windows 用户使用。

https://community.chocolatey.org/packages/incus/6.5.0

Incus客户端的Winget软件包

客户端工具也可通过 Winget 供 Windows 用户使用。

https://winstall.app/apps/LinuxContainers.Incus

支持

每月功能发布仅支持到下一个版本发布为止。需要更长时间支持和更少更改的用户应考虑使用 Incus 6.0 LTS。

社区支持提供于:https://discuss.linuxcontainers.org
商业支持可通过以下途径获得:https://zabbly.com/incus
错误报告地址:https://github.com/lxc/incus/issues

Incus 6.4已发布

2024年8月9日

简介

Incus团队很高兴地宣布发布Incus 6.4!

这是一个非常均衡的版本,每个人都能从中获得一些新东西!

它包含许多错误修复和新功能,以帮助改进先前版本中添加的OCI支持。它还为更复杂的共享/集群环境引入了许多新功能。此外,它还包含大量错误修复,修复了存储、集群、OpenID身份验证、审计等方面的许多烦人问题。

image|690x309

像往常一样,您可以在线试用:https://linuxcontainers.cn/incus/try-it/

尽情享受!

新功能

集群组配置

集群组现在具有与大多数其他Incus对象类似的标准配置表。

这意味着通常的命令和API集
- incus cluster group edit
- incus cluster group get
- incus cluster group set
- incus cluster group show
- incus cluster group unset

每个集群组的VM的CPU基线和标志

在对集群组配置的支持基础上,我们现在支持在每个集群组的基础上定义VM CPU基线。

这使得可以为每个CPU模型/代拥有一个集群组,并让Incus计算这些服务器的通用CPU标志集。

例如,incus cluster group set foo instances.vm.cpu.x86_64.baseline=kvm64 instances.vm.cpu.x86_64.flags=auto将使Incus自动遍历foo集群组中的服务器,然后使用通用CPU标志集填充flags配置键。

但这还允许设置您自己的完全自定义CPU定义,例如,incus cluster group set foo instances.vm.cpu.x86_64.baseline=EPYCv2 instances.vm.cpu.x86_64.flags=-svm将公开一个带有禁用虚拟化扩展(svm)的基本第二代AMD EPYC CPU。

使用卷的子路径作为磁盘

现在可以将现有自定义卷中的路径用作磁盘条目的源。

stgraber@castiana:~$ incus launch images:ubuntu/24.04 demo
Launching demo
stgraber@castiana:~$ incus launch images:ubuntu/24.04 demo-sub
Launching demo-sub
stgraber@castiana:~$ incus storage volume create default demovol
Storage volume demovol created
stgraber@castiana:~$ incus config device add demo demovol disk pool=default source=demovol path=/mnt/demovol
Device demovol added to demo
stgraber@castiana:~$ incus exec demo bash
root@demo:~# mkdir -p /mnt/demovol/sub/path/
root@demo:~# echo world > /mnt/demovol/sub/path/hello
root@demo:~#·
exit
stgraber@castiana:~$ incus config device add demo-sub demovol disk pool=default source=demovol/sub/path path=/mnt/demovol
Device demovol added to demo-sub
stgraber@castiana:~$ incus exec demo-sub bash
root@demo-sub:~# cat /mnt/demovol/hello·
world

在此示例中,创建了一个名为 demovol 的自定义卷,然后将其附加到 demo 容器,在该卷中创建了一个子目录,然后将该子目录附加到另一个容器 demo-sub

每个存储池项目限制

Incus 项目可以应用资源限制,这在向第三方提供项目访问权限时非常理想。到目前为止,可以限制项目内的总磁盘使用量,但这将适用于所有存储池。

由于通常有不同的存储池代表不同的存储特性(本地与远程)或类别(ssd 与 hdd),因此能够为每个存储池提供限制非常有用。

为此,项目配置中现在可以使用一个新的配置键 limits.disk.pool.POOLNAME。将限制设置为 0 将完全禁用该存储池,并使其从该项目中的存储池列表中消失。

stgraber@dakara:~$ incus project info test-limits
+------------------+-----------+-------+
|     RESOURCE     |   LIMIT   | USAGE |
+------------------+-----------+-------+
| CONTAINERS       | UNLIMITED | 0     |
+------------------+-----------+-------+
| CPU              | UNLIMITED | 0     |
+------------------+-----------+-------+
| DISK             | UNLIMITED | 0B    |
+------------------+-----------+-------+
| INSTANCES        | UNLIMITED | 0     |
+------------------+-----------+-------+
| MEMORY           | UNLIMITED | 0B    |
+------------------+-----------+-------+
| NETWORKS         | UNLIMITED | 0     |
+------------------+-----------+-------+
| PROCESSES        | UNLIMITED | 0     |
+------------------+-----------+-------+
| VIRTUAL-MACHINES | UNLIMITED | 0     |
+------------------+-----------+-------+
stgraber@dakara:~$ incus storage list
+---------+--------+-------------+---------+---------+
|  NAME   | DRIVER | DESCRIPTION | USED BY |  STATE  |
+---------+--------+-------------+---------+---------+
| default | zfs    |             | 45      | CREATED |
+---------+--------+-------------+---------+---------+
| foo     | dir    |             | 0       | CREATED |
+---------+--------+-------------+---------+---------+
stgraber@dakara:~$ incus project set test-limits limits.disk.pool.foo=0 limits.disk.pool.default=5GiB limits.disk=10GiB
stgraber@dakara:~$ incus project info test-limits
+------------------+-----------+-------+
|     RESOURCE     |   LIMIT   | USAGE |
+------------------+-----------+-------+
| CONTAINERS       | UNLIMITED | 0     |
+------------------+-----------+-------+
| CPU              | UNLIMITED | 0     |
+------------------+-----------+-------+
| DISK             | 10.00GiB  | 0B    |
+------------------+-----------+-------+
| DISK (DEFAULT)   | 5.00GiB   | 0B    |
+------------------+-----------+-------+
| INSTANCES        | UNLIMITED | 0     |
+------------------+-----------+-------+
| MEMORY           | UNLIMITED | 0B    |
+------------------+-----------+-------+
| NETWORKS         | UNLIMITED | 0     |
+------------------+-----------+-------+
| PROCESSES        | UNLIMITED | 0     |
+------------------+-----------+-------+
| VIRTUAL-MACHINES | UNLIMITED | 0     |
+------------------+-----------+-------+
stgraber@dakara:~$ incus storage list
+---------+--------+-------------+---------+---------+
|  NAME   | DRIVER | DESCRIPTION | USED BY |  STATE  |
+---------+--------+-------------+---------+---------+
| default | zfs    |             | 45      | CREATED |
+---------+--------+-------------+---------+---------+
stgraber@dakara:~$ incus create images:ubuntu/24.04 c1 --storage default -d root,size=5GiB
Creating c1

The instance you are starting doesn't have any network attached to it.
  To create a new network, use: incus network create
  To attach a network to an instance, use: incus network attach

stgraber@dakara:~$ incus create images:ubuntu/24.04 c2 --storage default -d root,size=5GiB
Creating c2
Error: Failed instance creation: Failed checking if instance creation allowed: Reached maximum aggregate value "5GiB" for "limits.disk.pool.default" in project "test-limits"
stgraber@dakara:~$ incus project set test-limits limits.disk.pool.foo=5GiB
stgraber@dakara:~$ incus create images:ubuntu/24.04 c2 --storage foo -d root,size=5GiB
Creating c2

The instance you are starting doesn't have any network attached to it.
  To create a new network, use: incus network create
  To attach a network to an instance, use: incus network attach

stgraber@dakara:~$ incus project info test-limits
+------------------+-----------+----------+
|     RESOURCE     |   LIMIT   |  USAGE   |
+------------------+-----------+----------+
| CONTAINERS       | UNLIMITED | 2        |
+------------------+-----------+----------+
| CPU              | UNLIMITED | 0        |
+------------------+-----------+----------+
| DISK             | 10.00GiB  | 10.00GiB |
+------------------+-----------+----------+
| DISK (DEFAULT)   | 5.00GiB   | 5.00GiB  |
+------------------+-----------+----------+
| DISK (FOO)       | 5.00GiB   | 5.00GiB  |
+------------------+-----------+----------+
| INSTANCES        | UNLIMITED | 2        |
+------------------+-----------+----------+
| MEMORY           | UNLIMITED | 0B       |
+------------------+-----------+----------+
| NETWORKS         | UNLIMITED | 0        |
+------------------+-----------+----------+
| PROCESSES        | UNLIMITED | 0        |
+------------------+-----------+----------+
| VIRTUAL-MACHINES | UNLIMITED | 0        |
+------------------+-----------+----------+
stgraber@dakara:~$

在这里,我们可以看到一个项目设置了磁盘限制,首先隐藏其中一个池,然后填充另一个池,然后再对之前隐藏的池设置限制。

到目前为止,所有 OVN 网络都已设置了上行链路网络(network 属性)。
这是外部面向路由器端口所在的网络,所有进入/退出 OVN 网络的入站/出站流量都将通过该网络进行。

Incus 在该上行链路网络上选择一个 IPv4(和/或 IPv6)地址,然后使用它将所有流量路由出虚拟网络并进入物理网络。

现在,该 network 属性的特殊值 none 将指示 Incus 创建一个未连接到任何上行链路的 OVN 网络,因此它是完全隔离的。

root@server01:~# incus network create ovn-isolated network=none --type=ovn
Network ovn-isolated created
root@server01:~# incus launch images:ubuntu/24.04 c1 --network ovn-isolated
Launching c1
root@server01:~# incus list
+------+---------+--------------------+-----------------------------------------------+-----------+-----------+----------+
| NAME |  STATE  |        IPV4        |                     IPV6                      |   TYPE    | SNAPSHOTS | LOCATION |
+------+---------+--------------------+-----------------------------------------------+-----------+-----------+----------+
| c1   | RUNNING | 10.248.34.2 (eth0) | fd42:669c:8431:b3cc:216:3eff:fef3:fdb2 (eth0) | CONTAINER | 0         | server01 |
+------+---------+--------------------+-----------------------------------------------+-----------+-----------+----------+
root@server01:~# incus exec c1 bash
root@c1:~# ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
^C
--- 1.1.1.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1031ms

在这里,我们可以看到一个隔离的网络正在创建,并且一个容器被放置在该网络上。
该网络照常提供 IPv4 和 IPv6 地址,但无法发出任何流量。

每个实例的 LXCFS

现在可以启用新的服务器配置键 instances.lxcfs.per_instance,使 Incus 为每个容器启动一个专用的 LXCFS 实例。

这与默认情况下为整个系统运行单个 LXCFS 实例形成对比。

启用此功能会略微增加每个容器的资源使用量,但会降低一个容器淹没共享 LXCFS 实例的风险,并使 LXCFS 崩溃仅影响一个容器。

stgraber@castiana:~$ pgrep -a lxcfs
1101 /opt/incus/bin/lxcfs /var/lib/incus-lxcfs
stgraber@castiana:~$ incus config set instances.lxcfs.per_instance=true
stgraber@castiana:~$ incus restart demo
stgraber@castiana:~$ pgrep -a lxcfs
1101 /opt/incus/bin/lxcfs /var/lib/incus-lxcfs
962122 lxcfs -f -p /run/incus/demo/lxcfs.pid --runtime-dir /run/incus/demo/lxcfs /var/lib/incus/devices/demo/lxcfs

在创建/启动时支持环境文件

为了简化运行 OCI 容器的操作,现在可以通过一个环境变量文件指定环境变量,该文件在创建时读取并转换为 Incus 配置选项。

stgraber@castiana:~$ cat mysql.env
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress
MYSQL_RANDOM_ROOT_PASSWORD=1

stgraber@castiana:~$ incus launch docker:mysql mysql --environment-file mysql.env 
Launching mysql

stgraber@castiana:~$ incus config show mysql
architecture: x86_64
config:
  environment.GOSU_VERSION: "1.17"
  environment.HOME: /root
  environment.MYSQL_DATABASE: wordpress
  environment.MYSQL_MAJOR: innovation
  environment.MYSQL_PASSWORD: wordpress
  environment.MYSQL_RANDOM_ROOT_PASSWORD: "1"
  environment.MYSQL_SHELL_VERSION: 9.0.1-1.el9
  environment.MYSQL_USER: wordpress
  environment.MYSQL_VERSION: 9.0.1-1.el9
  environment.PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  environment.TERM: xterm
  image.architecture: x86_64
  image.description: docker.io/library/mysql (OCI)
  image.type: oci
  volatile.base_image: d8df069848906979fd7511db00dc22efeb0a33a990d87c3c6d3fcdafd6fc6123
  volatile.cloud-init.instance-id: f12e3ddb-ac93-4942-b3e1-dcd560893140
  volatile.container.oci: "true"
  volatile.eth0.host_name: vethac8631aa
  volatile.eth0.hwaddr: 00:16:3e:20:32:87
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":1000000000},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":1000000000}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":1000000000},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":1000000000}]'
  volatile.last_state.idmap: '[]'
  volatile.last_state.power: RUNNING
  volatile.uuid: 5ed7f63b-5b6c-4c89-9dfa-117c2b785370
  volatile.uuid.generation: 5ed7f63b-5b6c-4c89-9dfa-117c2b785370
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""

在此示例中,我们看到一个名为 mysql 的容器是从 OCI 镜像创建的,并使用 mysql.env 中定义的环境变量。

完整更改日志

以下是此版本中所有更改的完整列表

完整提交列表
  • incus-simplestreams: 修复拆分镜像
  • [lxd-import] github: 停止清除 core20
  • [lxd-import] github: 清除已禁用/被取代的 snap
  • [lxd-import] github: 将 snap 删除移动到“回收一些空间”步骤
  • [lxd-import] github: 将 docker 删除放到其自己的步骤中
  • [lxd-import] github: 使用单个命令屏蔽 lxc{,-net}.service
  • [lxd-import] lxd/instance/drivers/driver/qemu: 探测 Direct I/O 支持时不要泄漏文件描述符
  • [lxd-import] lxd/network/acl: 更改 ovn 日志的协议字段
  • [lxd-import] lxd/instance: 拒绝虚拟机的 limits.kernel 配置
  • [lxd-import] doc: limits.kernel 仅适用于容器(参见 #12874)
  • [lxd-import] lxd/storage: 修复具有自定义 zfs.pool_name 的池的大小调整
  • [lxd-import] lxd/storage/drivers/driver_zfs_utils: 修正错别字
  • [lxd-import] lxd/storage/drivers/driver_zfs_utils: 明确指出块大小以字节为单位
  • [lxd-import] lxd/task/group: 为清晰起见,将 cancel 类型设置为 context.CancelFunc
  • [lxd-import] doc: 添加关于如何删除镜像的段落
  • [lxd-import] test: 添加 exec 退出代码测试
  • [lxd-import] lxd/apparmor: 允许受限服务接收所需的信号
  • [lxd-import] lxd/rsync: 一致地以纳秒为单位比较文件
  • [lxd-import] test/suites/migration: 检查刷新后的文件内容
  • [lxd-import] test/suites/migration: 基于纳秒检查本地和远程实例刷新
  • [lxd-import] doc: 添加关于如何删除镜像的段落
  • [lxd-import] doc: 为 pyspelling 启用多进程
  • [lxd-import] Makefile: 使 run-parts 报告它运行的脚本
  • [lxd-import] lxd/storage/drivers/ceph: 禁用块卷上的文件系统配置键
  • [lxd-import] lxd/storage/drivers/lvm: 禁用块卷上的文件系统配置键
  • [lxd-import] test: 添加检查以恢复类型为块的自定义卷
  • [lxd-import] lxd/storage/drivers/ceph: 更新 UnmountVolumeSnapshot 文档字符串
  • [lxd-import] lxd: 改进对现有证书的错误检查
  • [lxd-import] shared/api: 更新证书字段的 Swagger 描述。
  • [lxd-import] shared/api: 修复 lint 错误(接收器命名)。
  • [lxd-import] lxd/db/cluster: 修复 lint 错误(revive: var-naming)。
  • [lxd-import] lxd-migrate: 忽略 lint 错误(revive: deep-exit)。
  • [lxd-import] lxc/remote: 修复 lint 错误(revive: exported)。
  • [lxd-import] lxd/storage/backend: 不要重复验证自定义存储卷
  • [lxd-import] lxd-generate: 返回有用的错误而不是恐慌。
  • [lxd-import] lxd/storage/backend: 对错误消息使用一致的引号
  • [lxd-import] lxd/project: 不要在 StorageVolumeParts 上恐慌
  • [lxd-import] github: 不要在重新挂载失败时中止
  • [lxd-import] test/main: 添加日志分组 (GHA)
  • [lxd-import] test/main: 在失败时显示 dmesg
  • [lxd-import] lxd/api/internal: 在 internalImportFromBackup 中使用正确的错误引用
  • [lxd-import] lxd/db/cluster/devices: 在 NewDeviceType 中使用设备类型的正确字符串引用
  • [lxd-import] lxd/instances/post: 改进 createFromBackup 中的错误
  • [lxd-import] lxd/storage/backend/lxd: 在 CreateInstanceFromBackup 中生成实例和卷数据库记录后更新 backup.yaml
  • [lxd-import] test/main: 不要将测试日志包装在日志组中
  • [lxd-import] lxd/device/disk: 删除 cloud-init:config 磁盘设备时删除 config.iso 文件
  • [lxd-import] lxd/images: 在 autoSyncImages 中的错误中添加项目
  • [lxd-import] lxd/project/project: 从 StorageVolumeProject 中删除优化
  • [lxd-import] lxd/storage/volumes: 删除 doCustomVolumeRefresh 中不必要的 2 行变量定义
  • [lxd-import] lxd/storage/volumes: 删除 doVolumeCreateOrCopy 中不必要的 2 行变量定义
  • [lxd-import] lxd/storage/volumes: 在 doCustomVolumeRefresh 中验证源项目
  • [lxd-import] [lxd-import] lxd/storage/volumes: 在 doVolumeCreateOrCopy 中验证源项目
  • [lxd-import] lxd/db/cluster: 删除冗余括号。
  • [lxd-import] lxd/db/cluster: 将 "node" 重命名为 "cluster member"。
  • [lxd-import] lxd/migrate/storage/volumes: 在 migrationSourceWs.DoStorage 中使用数据库中的卷名称
  • [lxd-import] lxd/network/network/utils: 修复 inRoutingTable 中从 int64 到 int 的不正确转换
  • [lxd-import] lxd/network/network/utils: 通过将 base 传递给 ParseInt 删除对 fmt.Sprintf 的不必要调用
  • [lxd-import] lxd/response: 如果 SyncResponse success=false,则使用 SmartError
  • [lxd-import] lxd/storage/drivers/driver/zfs/volumes: 修复 CreateVolumeFromCopy 中的错误范围
  • [lxd-import] lxd/storage/drivers/driver/zfs/volumes: 在 CreateVolumeFromCopy 中一起定义发送/接收通道
  • [lxd-import] lxd/storage/drivers/driver/zfs/volumes: 如果接收方失败,则在 CreateVolumeFromCopy 中终止发送方
  • [lxd-import] lxd/storage/drivers/driver/zfs/volumes: 在 CreateVolumeFromCopy 中处理多行错误
  • [lxd-import] lxd/storage/drivers/driver/btrfs/volumes: 修复 btrfs receive 失败时 RefreshVolume 发生挂起的问题
  • [lxd-import] lxd/storage/drivers/driver/btrfs/volumes: 在 RefreshVolume 中处理多行错误
  • [lxd-import] lxd/storage/drivers/driver/zfs/volumes: 使 RefreshVolume 与 BTRFS 驱动程序保持一致
  • [lxd-import] lxd/response: 在设置标头后回退到错误响应
  • [lxd-import] lxd/storage/backend/lxd: 在 BackupCustomVolume 中使用 VolumeDBGet 中的卷名称
  • [lxd-import] lxd/storage/drivers/btrfs: 阐明 UUID 发现超时时的回退情况
  • incusd/db/cluster: 修复导入隐藏
  • doc/rest-api: 刷新 swagger YAML
  • [lxd-import] lxd/db/cluster: 更新单元测试中的错误消息。
  • [lxd-import] lxd/storage/drivers: 向 roundVolumeBlockSizeBytes 添加卷参数
  • [lxd-import] lxd/storage/drivers/zfs: 四舍五入到 zfs.blocksize 或 16KiB
  • [lxd-import] test/storage: 添加非 2 的幂大小存储检查
  • [lxd-import] test/storage: 删除 zfs 四舍五入测试
  • [lxd-import] lxd/storage/drivers: 重构卷大小舍入逻辑
  • [lxd-import] lxd/storage/drivers/zfs: 激活卷时等待设备出现
  • [lxd-import] lxd/storage/drivers/zfs: 检查非 /dev/zvol/* 路径
  • incusd/storage/zfs: 修复导入隐藏
  • doc/storage_backup: 修正命令示例
  • doc/requirements: 添加 OCI 需求
  • doc/images: 提及 OCI 镜像
  • incusd/instance/edk2: 支持 arm64 上的 OVMF 文件名
  • incusd/instance/drivers/qemu: 将 CPU 标志计算限制为 x86_64
  • incus/s3: 修复 mcli minio 客户端可执行文件名称检查
  • incusd/instance/qemu: 修复架构检查反向
  • incusd/instance: 修复 OCI 的初始配置处理
  • client/oci: 添加缺少 skopeo 的错误
  • client/oci: 添加缺少 umoci 的错误
  • 将 RunDir 文件模式更改为 0711
  • incusd/instance/lxc: 使用真正的 PID1 处理 OCI 容器
  • incusd/apparmor/qemu: 略微放宽 apparmor 规则
  • incus-simplestreams: 处理组合镜像的删除
  • incusd/instance/lxc: 添加 OCI 的基本挂载处理
  • incusd/apparmor/qemu: 修正规则中的拼写错误
  • incusd/apparmor/dnsmasq: 略微放宽规则
  • incusd/db/node: 修复 GetAPI 中的版本检查
  • incusd/db: 允许使用不同的 API 扩展启动集群
  • incusd: 扩展心跳数据以获取最小 API 扩展计数
  • incusd/storage: 使用写回模式进行 qemu-img 转换
  • incusd/storage: 改进解压消息
  • incusd/operations: 处理仅百分比更新
  • incusd/storage: 将跟踪器传递给 qemu-img
  • incusd/db/cluster: 更新测试以适应放宽的 API 扩展检查
  • incusd/apparmor: 为 qemu-img 实现进度跟踪器
  • incusd/cgroup: 处理 io.stat 中的未知设备
  • incusd/instance_post: 始终设置目标项目
  • incusd/storage/drivers: 一致地设置 VolumeMultiNode
  • incusd/storage/lvm: 在快照期间需要独占锁
  • incusd/storage/lvm: 在调整大小期间正确处理激活
  • incusd/storage: 正确检测远程块上的文件系统
  • incusd/cluster: 始终尝试转发自定义卷请求
  • client: 始终设置 GetBody
  • client: 报告 OIDC 刷新失败
  • incus/remote: 转发 OIDC 身份验证失败
  • 使 run-parts 运行与不同版本兼容
  • client: 在代理指示时重试
  • 使用 qemu-img 转换输出更新进度
  • incusd/cluster: 添加 flagFormat
  • internal/cmd: 添加对格式选项的支持
  • incusd/isntance/edk2: 将 seabios 移动到 /usr/share/qemu
  • incusd/isntance/edk2: 添加 ArchLinux x86_64 路径
  • tests: 在属性测试中使用未来值
  • incusd/db/cluster: 清理缩进
  • incusd/db/cluster: 更新模式
  • incusd/db/generate: 为集群表添加异常
  • api: clustering_groups_config
  • incusd/db/cluster: 添加 cluster_groups_config
  • incusd/db/cluster: 更新模式
  • shared/api: 将配置添加到 ClusterGroupPut
  • doc/rest-api: 刷新 swagger YAML
  • incusd/db/cluster: 更新新集群组配置表的功能
  • incusd/cluster: 添加集群组配置逻辑
  • doc: 更新配置
  • incus/completion: 添加 cmpClusterGroupConfigs
  • incus/cluster/group: 添加获取/设置/取消设置
  • i18n: 更新翻译模板
  • doc: 添加集群组配置
  • tests: 添加集群组配置测试
  • incusd/resources: 添加 sortedMapKeys
  • incusd/resources/cpu: 对套接字、核心和线程进行排序
  • incusd/auth: 填充缺少的本地卷位置
  • incusd/cluster: 在移动时正确记录 volatile.cluster.group
  • incusd/migration: 首先显示源错误
  • incusd/instance/qemu: 阐明实时迁移错误
  • incusd/cluster: 在修复之前尝试 ping 服务器
  • incusd/instance/qemu: 修复错误的超时错误
  • api: instances_lxcfs_per_instance
  • incusd/instance/qemu: 在关机时发送两个 ACPI 事件
  • incusd/instance: 添加到导出的进度跟踪
  • incusd/server/config: 添加 instances.lxcfs.per_instance
  • incusd/instance/lxc: 添加对每个实例 LXCFS 的支持
  • doc: 更新配置
  • client: 当无法回溯时,删除 GetBody
  • client: 将 Seek 调用添加到 GetBody
  • 使用Weblate(简体中文)翻译
  • incusd: 简化镜像复制
  • incusd/images: 只从授权者中删除一次
  • incusd/images: 正确记录新的别名
  • incusd/images: 正确删除别名
  • incusd/images: 在正确的时间设置授权者条目
  • incusd/images: 在集群复制时不要更改镜像信息

  • incusd/storage_pools: 为挂起的存储池设置授权器
  • incusd/networks: 为挂起的网络设置授权器
  • incusd/network: 处理较长的接口名称
  • incus/cluster: 清理证书更新消息
  • i18n: 更新翻译模板
  • incus/top: 正确过滤磁盘使用情况
  • incusd/state: 添加集群网关
  • incusd/daemon: 对状态字段进行排序
  • incusd/daemon: 将集群网关添加到状态
  • incusd/acme: 更新以适应状态更改
  • incusd/images: 更新以适应状态更改
  • incusd/operations: 更新以适应状态更改
  • incusd/instances: 更新以适应状态更改
  • incusd/patches: 更新以适应状态更改
  • incusd/cluster: 更新以适应状态更改
  • incusd/instances: 使用 targetGroupPrefix
  • incusd/cluster: 拆分文件
  • incusd/cluster: 修复导入隐藏
  • incusd/cluster: 重构修复逻辑
  • incusd/cluster: 改进日志记录
  • incusd/cluster: 减少 dqlite 日志记录
  • incusd/cluster: 扩展 HasConnectivity 以进行 API 检查
  • incusd/cluster: 将 HasConnectivity 检查添加到事件处理
  • incusd: 不要在启动时阻塞集群查询
  • incusd/cluster: 重做离线服务器检测
  • incusd/cluster/evacuation: 添加单独的修复模式
  • incusd/cluster/healing: 最多尝试 5 次
  • incusd/cluster/healing: 添加日志记录
  • incusd/device/disk: 修复错误的 CanMigrate 逻辑
  • incusd/storage/lvm: 正确激活/停用 ISO
  • incusd/images: 将镜像类型作为标头公开
  • client: 如果是 OCI,则跳过镜像哈希
  • incusd/instance/lxc: 将 /init 添加到 OCI 初始化路径
  • incusd/device: 不要在 LXCFS 设备条目上失败
  • client: 在复制时也报告源错误
  • incusd/storage: 使 roundVolumeBlockSizeBytes 返回错误
  • incusd/instance_post: 修复跨服务器实时迁移
  • incus/image: 修正镜像复制逻辑
  • incusd/storage/lvm: 加固通用函数
  • incusd/api: 在缺少配置时不要恐慌
  • incusd/storage: 添加 Deactivate 标志
  • incusd/storage/lvm: 为集群添加停用步骤
  • incusd/cluster: 为当前正在启动的服务器返回清晰的状态
  • incusd/instance/lxc: 降低日志级别
  • incusd/instance/qemu: 降低日志级别
  • incusd/migrate: 减少日志记录
  • incusd/storage: 减少日志记录
  • incusd/instance/qemu: 删除双生命周期事件
  • tests/clustering: 使用正确的目标项目参数
  • incusd/isntance/edk2: 修复 CSM 处理
  • incusd/storage/zfs: 始终调用 tryGetVolumeDiskPathFromDataset
  • incusd/network/ovn: 要求功能性上行链路
  • doc: 添加 colima 指令
  • doc: 更新 incus_alias.md
  • incus/network/load_balancer: 修复示例
  • i18n: 更新翻译模板
  • incusd/network/ovn: 修复未初始化的外部 ID 导致的崩溃
  • doc/instances: 添加虚拟机代理安装说明
  • shared/api: 将 Config 添加到 ServerUntrusted
  • doc/rest-api: 刷新 swagger YAML
  • incusd/api_1.0: 将 user.ui 配置键公开给所有客户端
  • doc/server: 提到 user.ui 配置键
  • incusd/auth/oidc: 更好地处理注销
  • incusd/networks: 为 OVN 网络发出生命周期事件和授权条目
  • incusd/network/ovn: 修复缩进
  • doc/storage_volume: 修复快照命令
  • shared/api: 添加 EventLifecycleInstanceMigrated
  • shared/api: 对生命周期事件进行排序
  • incusd/lifecycle: 添加 InstanceMigrated
  • incusd/lifecycle: 对生命周期事件进行排序
  • incusd/isntance/operationlock: 添加 ActionMigrate
  • incusd/instance/common: 添加对迁移操作的支持
  • incusd/instance/qemu: 添加对迁移操作和生命周期的支持
  • incusd/instance/lxc: 添加对迁移操作和生命周期的支持
  • shared/api: 添加集群疏散和修复的生命周期事件
  • incusd/lifecycle: 添加集群疏散和修复的生命周期事件
  • incusd/cluster: 添加疏散的生命周期事件
  • incusd/request: 从事件地址中剥离端口
  • incusd/instance: 正确链接实例和操作
  • incusd/operations: 为嵌套操作添加 CopyRequestor
  • incusd/instance: 在 exec/console 期间跟踪操作
  • doc/clustering: 更好地记录修复
  • incusd/instance: 在创建期间跟踪操作
  • incusd/instance: 在删除期间跟踪操作
  • incusd/instance: 跟踪 API 操作
  • incusd/instance: 在快照上设置操作
  • incus-migrate: 正确处理项目
  • incusd/apparmor: 支持委托时允许挂载 zfs
  • doc/clustering: 添加集群访问方法
  • cmd/incusd: 设置保持活动超时
  • incusd/auth/oidc: 处理无法设置 Cookie 的情况
  • incusd/instance/qemu: 取消引用 ceph 配置路径
  • incusd/apparmor/qemu: 猜测 ceph 配置路径
  • 使用Weblate(简体中文)翻译
  • 使用Weblate(简体中文)翻译
  • 使用Weblate(简体中文)翻译
  • incusd/instance/lxc: 尊重 LXCFS_OPTS
  • api: clustering_groups_vm_cpu_definition
  • incusd/cluster_groups: 添加 CPU 定义键
  • doc: 更新配置
  • incusd/instance/qemu: 使用集群组配置
  • incusd/instance/drivers: 提取 GetClusterCPUFlags
  • incusd/cluster/group: 支持自动 CPU 标志
  • incusd: 将 OVN 切换到 getter 函数
  • incusd/network: 移植到新的 OVN 状态函数
  • incus: 添加对环境文件(.env)的支持
  • i18n: 更新翻译模板
  • incusd/storage/lvm: 重新尝试激活/停用
  • incusd/storage/lvm: 在冷迁移期间不要激活卷
  • 使用Weblate(简体中文)翻译
  • 使用Weblate(简体中文)翻译
  • shared/cliconfig: 添加 CacheDir
  • incus: 配置缓存目录
  • api: disk_volume_subpath
  • incusd/device/disk: 允许自定义卷内的相对路径
  • doc/devices_disk: 提到子路径
  • tests: 测试卷子路径
  • api: projects_limits_disk_pool
  • incusd/projects: 添加新的 limits.disk.pool 配置键
  • doc: 更新配置
  • incus/project: 处理池磁盘限制
  • incusd/project: 添加每个池的磁盘限制
  • incusd/project: 添加 HiddenStoragePools
  • incusd/storage: 隐藏限制为零的池
  • tests: 添加每个池限制的测试
  • incus/image/alias: 添加对列选择的支持
  • i18n: 更新翻译模板
  • incusd/main_forknet: 使我们的 DHCP 客户端永远不会失败
  • 使用Weblate(简体中文)翻译
  • api: network_ovn_isolated
  • incusd/network/ovn: 加固删除逻辑
  • doc/network/ovn: 涵盖隔离网络
  • incusd/networks: 为上行链路保留“none”
  • incusd/network/ovn: 允许创建隔离的 OVN 网络(无上行链路)
  • incusd/device/nic_ovn: 处理没有上行链路的网络
  • gomod: 更新依赖项
  • 发布 Incus 6.4

文档

Incus 文档可以在以下地址找到:
https://linuxcontainers.cn/incus/docs/main/

软件包

Incus 上游只发布常规的发布版 tarball,因此没有官方的 Incus 软件包。以下是启动和运行 Incus 的一些可用选项。

在 Linux 上安装 Incus 服务器

Incus 可用于大多数常见的 Linux 发行版。您可以在我们的文档中找到详细的安装说明。

https://linuxcontainers.cn/incus/docs/main/installing/

Incus 客户端的 Homebrew 软件包

客户端工具可通过 HomeBrew 在 Linux 和 MacOS 上使用。

https://formulae.brew.sh.cn/formula/incus

Incus 客户端的 Chocolatey 软件包

客户端工具可通过 Chocolatey 供 Windows 用户使用。

https://community.chocolatey.org/packages/incus/6.4.0

Incus 客户端的 Winget 软件包

客户端工具也可通过 Winget 供 Windows 用户使用。

https://winstall.app/apps/LinuxContainers.Incus

支持

每月功能发布仅支持到下一个版本发布为止。需要更长时间支持和更少更改的用户应考虑使用 Incus 6.0 LTS。

社区支持提供于:https://discuss.linuxcontainers.org
商业支持可通过以下途径获得:https://zabbly.com/incus
错误报告地址:https://github.com/lxc/incus/issues

Incus 6.3 已发布

2024 年 7 月 12 日

简介

Incus 团队很高兴地宣布发布 Incus 6.3!

image|690x486

此版本的亮点是对运行 OCI 应用容器的初步支持。
这允许直接通过 Incus 使用常见的 Docker/OCI 镜像,这些容器与我们通常的系统容器和虚拟机共存!

像往常一样,您可以在线试用:https://linuxcontainers.cn/incus/try-it/

尽情享受!

新功能

对 OCI 应用容器的初步支持

Incus 现在能够访问 Docker Hub 等应用容器注册表,检索镜像,转换(扁平化)以供 Incus 使用,然后从中创建工作容器。

这仍然是我们 OCI 容器支持的早期阶段,根据用户反馈,可能需要填补相当多的空白,但对于许多简单的用例(用户目前在同一系统上同时运行 Docker 和 Incus,或者他们在 Incus 容器内使用 Docker 只是为了运行单个软件),Incus 现在应该能够直接处理这种情况。

所有 Incus 容器配置选项(无论是资源限制、系统调用拦截……)都适用于这些容器。它们也都在与我们的系统容器相同的安全容器环境中运行。

stgraber@dakara:~$ incus remote add docker https://docker.io --protocol=oci
stgraber@dakara:~$ incus launch docker:mysql mysql \
> -c environment.MYSQL_DATABASE=wordpress \
> -c environment.MYSQL_USER=wordpress \
> -c environment.MYSQL_PASSWORD=wordpress \
> -c environment.MYSQL_RANDOM_ROOT_PASSWORD=1
Launching mysql

stgraber@dakara:~$ incus list mysql
+-------+---------+----------------------+------------------------------------------+-----------------+-----------+
| NAME  |  STATE  |         IPV4         |                   IPV6                   |      TYPE       | SNAPSHOTS |
+-------+---------+----------------------+------------------------------------------+-----------------+-----------+
| mysql | RUNNING | 172.17.250.26 (eth0) | 2602:fc62:c:250:216:3eff:fefa:468 (eth0) | CONTAINER (APP) | 0         |
+-------+---------+----------------------+------------------------------------------+-----------------+-----------+

stgraber@dakara:~$ incus launch docker:wordpress wordpress \
> -c environment.WORDPRESS_DB_HOST=172.17.250.26 \
> -c environment.WORDPRESS_DB_USER=wordpress \
> -c environment.WORDPRESS_DB_PASSWORD=wordpress \
> -c environment.WORDPRESS_DB_NAME=wordpress
Launching wordpress

stgraber@dakara:~$ incus list wordpress
+-----------+---------+-----------------------+-------------------------------------------+-----------------+-----------+
|   NAME    |  STATE  |         IPV4          |                   IPV6                    |      TYPE       | SNAPSHOTS |
+-----------+---------+-----------------------+-------------------------------------------+-----------------+-----------+
| wordpress | RUNNING | 172.17.250.119 (eth0) | 2602:fc62:c:250:216:3eff:fe61:c1fc (eth0) | CONTAINER (APP) | 0         |
+-----------+---------+-----------------------+-------------------------------------------+-----------------+-----------+
stgraber@dakara:~$

集群内的基线 CPU 定义

到目前为止,Incus 的实时迁移逻辑的一个主要限制是它期望集群中的所有服务器运行相同的 CPU。如果两个系统之间的 CPU 不同,则实时迁移将失败或稍后导致崩溃。

这是因为 Incus 将始终公开其运行所在机器的所有 CPU 标志。
这对于在独立系统上获得最大性能很有帮助,但在异构集群中,这并不完全适用。

在此版本中,Incus 现在将自动计算给定 CPU 架构中所有服务器的通用 CPU 标志集,并将其用作任何启用实时迁移的实例(migration.stateful=true)的 CPU 定义。

文件系统支持 io.busio.cache

io.busio.cache 选项已存在一段时间了,用于 VM 磁盘。
使用 io.bus 提供 virtio-scsivirtio-blknvme 选项,以及 io.cache 允许 nonewritebackunsafe 缓存。

在传递文件系统而不是磁盘时,现在也支持这些配置键。
在这种情况下,它们的值略有不同,io.busauto(默认)、9pvirtiofs 之一,而 io.cache 支持 none(默认)、metadataunsafe

这有效地允许控制文件系统如何公开到 VM,然后在使用 virtiofs 时调整缓存行为。

incus top 的改进

Incus 6.2 引入了新的 incus top 命令。
在此版本中,我们使其更有用,使其能够针对远程服务器工作,正确支持集群环境并处理项目。

+---------+---------------+-------------+-----------+-----------+
| PROJECT | INSTANCE NAME | CPU TIME(S) |  MEMORY   |   DISK    |
+---------+---------------+-------------+-----------+-----------+
| default | incus-ui      | 63.40       | 12.76MiB  | 1.54GiB   |
+---------+---------------+-------------+-----------+-----------+
| default | kernel-test   | 1865037.10  | 578.01MiB | 32.84GiB  |
+---------+---------------+-------------+-----------+-----------+
| default | speedtest     | 84.10       | 23.14MiB  | 400.12MiB |
+---------+---------------+-------------+-----------+-----------+
| default | win11         | 1865.11     | 15.51GiB  |           |
+---------+---------------+-------------+-----------+-----------+
| demo    | mysql         | 6.77        | 464.20MiB | 276.62MiB |
+---------+---------------+-------------+-----------+-----------+
| demo    | wordpress     | 1.81        | 53.66MiB  | 386.62MiB |
+---------+---------------+-------------+-----------+-----------+
| vpn     | vpn-dev       | 102.97      | 36.83MiB  | 412.00MiB |
+---------+---------------+-------------+-----------+-----------+
| vpn     | vpn-lab       | 57.29       | 27.03MiB  | 347.75MiB |
+---------+---------------+-------------+-----------+-----------+
Press 'd' + ENTER to change delay
Press 's' + ENTER to change sorting method
Press CTRL-C to exit

Delay: 10s
Sorting Method: Alphabetical

服务器资源中的 CPU 标志

用于公开有关机器硬件配置的大量详细信息的资源 API 现已更新,以公开 CPU 标志。

这是实现前面提到的基线 CPU 功能所必需的。
新数据可以直接在 API 中找到,并为每个 CPU 内核提供。

stgraber@dakara:~$ incus query /1.0/resources | jq .cpu.sockets[0].cores[0].flags -c
["fpu","vme","de","pse","tsc","msr","pae","mce","cx8","apic","sep","mtrr","pge","mca","cmov","pat","pse36","clflush","mmx","fxsr","sse","sse2","ht","syscall","nx","mmxext","fxsr_opt","pdpe1gb","rdtscp","lm","constant_tsc","rep_good","nopl","xtopology","nonstop_tsc","cpuid","extd_apicid","aperfmperf","rapl","pni","pclmulqdq","monitor","ssse3","fma","cx16","sse4_1","sse4_2","x2apic","movbe","popcnt","aes","xsave","avx","f16c","rdrand","lahf_lm","cmp_legacy","svm","extapic","cr8_legacy","abm","sse4a","misalignsse","3dnowprefetch","osvw","ibs","skinit","wdt","tce","topoext","perfctr_core","perfctr_nb","bpext","perfctr_llc","mwaitx","cpb","cat_l3","cdp_l3","hw_pstate","ssbd","mba","ibrs","ibpb","stibp","vmmcall","fsgsbase","bmi1","avx2","smep","bmi2","erms","invpcid","cqm","rdt_a","rdseed","adx","smap","clflushopt","clwb","sha_ni","xsaveopt","xsavec","xgetbv1","xsaves","cqm_llc","cqm_occup_llc","cqm_mbm_total","cqm_mbm_local","clzero","irperf","xsaveerptr","rdpru","wbnoinvd","cppc","arat","npt","lbrv","svm_lock","nrip_save","tsc_scale","vmcb_clean","flushbyasid","decodeassists","pausefilter","pfthreshold","avic","v_vmsave_vmload","vgif","v_spec_ctrl","umip","pku","ospke","vaes","vpclmulqdq","rdpid","overflow_recov","succor","smca","fsrm","debug_swap"]

incus-simplestreams 中的统一镜像支持

用于使用 simplestreams 索引格式管理托管 Incus 镜像的静态 Web 服务器的 incus-simplestreams 工具现已更新,不仅支持拆分镜像,还支持统一镜像。

Incus 镜像可以由两个文件组成,一个包含元数据文件,另一个包含根文件系统或根磁盘,或者一个包含元数据以及根文件系统或根磁盘(作为该单个 tarball 内的目录/文件)的单个 tarball。

要将统一镜像添加到服务器,只需使用单个文件而不是通常的两个文件调用 incus-simplestreams add 即可。

完成 libovsdb 过渡

在过去 4-5 个版本中,我们一直在慢慢地将越来越多的逻辑从对 ovs-vsctlovn-nbctlovn-sbctl 命令行工具的直接调用迁移到使用原生 OVSDB 客户端。

这项工作现已完成,Incus 不再需要系统上存在任何 OVS/OVN 工具即可与 OVN 交互。

新逻辑与相关数据库保持持久连接,从而显着减少与 OVN 交互所需的时间和 CPU 开销。此持久连接还允许直接从 OVN 接收和响应事件,这在以前的方法中是不可能的。

打包人员须知

此版本引入了 OCI 支持,这需要 PATH 中存在 skopeoumoci 作为命令才能使该功能正常工作。

此外,INCUS_OVMF_PATH 环境变量已重命名为 INCUS_EDK2_PATH,以避免使用特定于体系结构的名称(arm64 使用 AAVMF),而是依靠固件的通用名称。

完整更改日志

以下是此版本中所有更改的完整列表

完整提交列表
  • incus/project: 修复错误的 --show-access 输出
  • cmd/incus-user: 避免在网络描述中出现双重 user-user-
  • 使用 Weblate(德语)翻译
  • 使用 Weblate(日语)翻译
  • incus/admin_sql: 修复描述
  • incus/storage_bucket: 修复字符串引用
  • incus/profile: 修复示例
  • incus/project: 修复示例
  • incus/snapshot: 改进恢复示例
  • incus/storage_bucket: 修复示例中的错别字
  • incus/storage_bucket: 修复导出示例
  • incus/exec: 添加一些示例
  • i18n: 更新翻译模板
  • incus-user: 不要无谓地更新默认配置文件
  • incus/top: 支持远程服务器
  • incus/top: 正确处理项目
  • incus/top: 处理集群
  • incusd/instance/qemu: 避免 vsockIDInt 的大小端问题
  • internal/linux: 定义一些 IOCTL
  • incusd/instance/qemu: 不要使用硬编码 ioctl
  • incusd/storage/btrfs: 不要使用硬编码 ioctl

  • incusd/devices: 简化 ioctl 逻辑
  • shared/cliconfig: 删除旧的迁移逻辑
  • shared/cliconfig: 通用化逻辑
  • incusd/seccomp: 修复 32 位平台上的 sysinfo 逻辑
  • shared/cliconfig: 始终填写协议
  • incus: 通用化镜像服务器逻辑
  • incus/console: 稍微重新整理逻辑
  • incus: 处理 --console 中已停止的容器
  • incus/console: 不要导出内部函数
  • 文档: 更新使用现有服务器构建集群的文档
  • github: 清理工作流文件
  • github: 构建 Go tip 版本
  • github: 更改测试中的 Go 版本
  • test/lint/golangci: 正确拉取父级引用
  • cmd/incusd: 修复 forknet 中的拼写错误
  • api: resources_cpu_flags
  • shared/api: 为 ResourceCPUCore 添加 Flags
  • doc/rest-api: 刷新 swagger YAML
  • incusd/resources: 为 ResourceCPUCore 添加 CPU Flags
  • incusd/network/ovn: 将 CreateLogicalRouterRoute 移植到 libovsdb
  • incusd/network/ovn: 将 DeleteLogicalRouterRoute 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 将 DeleteLogicalRouterPort 移植到 libovsdb
  • incusd/network/ovn: 删除 LogicalRouterPortDeleteIPv6Advertisements
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 将 DeleteLogicalSwitch 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 删除 logicalSwitchFindAssociatedPortGroups
  • doc/instances_console: 微调 SPICE 客户端的措辞
  • incusd/network/ovn: 对负载均衡器表进行特殊处理
  • incusd/network/ovn: 对齐函数上下文处理
  • incusd/network/ovn: 将 DeleteLogicalSwitchDHCPOption 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalSwitchPortLocation 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalSwitchPortUUID 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalRouterPortHardwareAddress 移植到 libovsdb
  • incusd/network/ovn: 添加 GetLogicalRouter
  • incusd/network/ovn: 将 DeleteLoadBalancer 移植到 libovsdb
  • incusd/network/acl: 更新 OVN 功能更改
  • incusd/network: 更新 OVN 功能更改
  • incusd/network: 简化 OVN 网络删除逻辑
  • incus/network_load_balancer: 修复示例
  • i18n: 更新翻译模板
  • incusd/network/ovn: 将 UpdateLogicalSwitchIPAllocation 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateLogicalSwitchDHCPv4Revervations 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalSwitchDHCPv4Revervations 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalSwitchDHCPOptions 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateLogicalSwitchDHCPv4Options 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateLogicalSwitchDHCPv6Options 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/networks: 正确完成 OVN 网络
  • incusd/networks: 正确记录描述
  • incusd/response: 添加 Code 函数
  • incusd/operations: 实现 Code 函数
  • incusd: 实现 Code 函数
  • incus-agent: 实现 Code 函数
  • 客户端: 修复 POST 请求中的 OIDC 重新认证
  • 客户端: 修复 WebSocket 中的 OIDC 重新认证
  • incus/network: 添加缺少的 stdin 处理
  • i18n: 更新翻译模板
  • lxd-to-incus: 处理卷配置键
  • incusd/project: 在授权器上不要失败创建
  • doc/instance_units: 阐明用法
  • incusd/network/ovn: 将 logicalSwitchPortACLRules 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalSwitchPorts 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateLogicalSwitchPortOptions 移植到 libovsdb
  • incusd/network/ovn: 将 CreatePortGroup 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/device/nic: 更新 OVN 功能更改
  • incusd/network/acl: 更新 OVN 功能更改
  • incusd/network/ovn: 将 GetPortGroupsByProject 移植到 libovsdb
  • incusd/network/ovn: 将 CreateAddressSet 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateAddressSetAdd 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateAddressSetRemove 移植到 libovsdb
  • incusd/network/ovn: 将 DeleteAddressSet 移植到 libovsdb
  • incusd/network/acl: 更新 OVN 功能更改
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 将 UpdateLogicalSwitchPortLinkRouter 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateLogicalSwitchPortLinkProviderNetwork 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalSwitchIPs 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalSwitchPortDNS 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 将 UpdateLogicalSwitchPortDNS 移植到 libovsdb
  • incusd/network/ovn: 将 UpdatePortGroupMembers 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateLogicalRouterPolicy 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 将 CreateLoadBalancer 移植到 libovsdb
  • incusd/network/ovn: 将 GetLogicalRouterRoutes 移植到 libovsdb
  • incusd/network/ovn: 将 DeleteLogicalRouterPeering 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • incusd/apparmor: 更新为当前 QEMU
  • incusd/apparmor: 允许 forkproxy 使用 /dev/shm
  • incusd/network/ovn: 将 CreateLogicalRouterPeering 移植到 libovsdb
  • incusd/network: 更新 OVN 功能更改
  • 使用Weblate(简体中文)翻译
  • incusd/network/ovn: 将 logicalSwitchPortDeleteDNSOperations 移植到 libovsdb
  • incusd/network/ovn: 将 DeleteLogicalSwitchPortDNS 移植到 libovsdb
  • incusd/network/ovn: 将 logicalSwitchPortDeleteOperations 移植到 libovsdb
  • incusd/network/ovn: 将 CleanupLogicalSwitchPort 移植到 libovsdb
  • incusd/network/ovn: 将 aclRuleDeleteOperations 移植到 libovsdb
  • incusd/network/ovn: 将 aclRuleAddOperations 移植到 libovsdb
  • incusd/network/ovn: 将 ClearPortGroupPortACLRules 移植到 libovsdb
  • incusd/network/ovn: 将 UpdatePortGroupPortACLRules 移植到 libovsdb
  • incusd/network/ovn: 将 UpdateLogicalSwitchACLRules 移植到 libovsdb
  • incusd/network/ovn: 将 UpdatePortGroupACLRules 移植到 libovsdb
  • incusd/network/acl: 更新 OVN 功能更改
  • incusd/network: 更新 OVN 功能更改
  • incusd/network/ovn: 删除 nbctl
  • api: disk_io_bus_cache_filesystem
  • incusd/device/disk: 扩展 io.bus 选项
  • incusd/device/disk: 扩展 io.cache 选项
  • incusd/device/disk: 添加对 virtiofs 上 io.cache 的支持
  • incusd/device/disk: 添加对文件系统上 io.bus 的支持
  • incusd/instance/driver_qemu: 处理 9p 被禁用
  • doc: 更新配置
  • doc/installing: 更新 Debian/Ubuntu 构建说明
  • doc/installing: 提及从上游安装 Go
  • incusd/instance/edk2: 添加新的软件包来跟踪 EDK2 固件
  • incusd/instance/qemu: 更新到新的 edk2 软件包
  • incusd/apparmor: 更新到新的 edk2 软件包
  • doc: 清理 OVMF/EDK2 处理以涵盖 aarch64
  • doc/installing: 使用 Incus 6.0.0 作为示例
  • incusd/instance/qemu: 修复仅 virtiofs 磁盘的处理
  • incus/storage_volume: 微调帮助消息
  • i18n: 更新翻译模板
  • incus/storage_volume: 修复 lint
  • doc/installing: 提及 incus-tools 软件包
  • incus-simplestreams: 添加对统一镜像的支持
  • incus-simplestreams: 微调帮助消息
  • incus-simplestreams: 重构统一逻辑
  • gomod: 更新依赖项
  • incusd/apparmor: 允许 devpts 挂载
  • incusd: 改进配置文件重命名错误
  • incusd/sys: 添加集群资源缓存路径
  • incusd/daemon: 在本地缓存其他服务器资源
  • incusd/instance/drivers/qmp: 添加 QueryCPUModel
  • incusd/instance/qemu: 使用集群 CPU 标志进行 migration.stateful
  • incus-user: 使用较短的接口名称表示较长的 UID
  • incusd/device/network: 修复 OVN 中的 Tap 接口 MTU
  • incusd/isntance: 不要在 INFO 消息中公开所有内部标志
  • incusd/instance/lxc: 允许从 Create 操作调用 Update
  • cmd/incusd: 添加 forknet dhcp
  • shared/subprocess: 允许在 Windows 上构建
  • api: instance_oci
  • client: 添加基本的 OCI 注册表客户端
  • incus: 添加 OCI 远程支持
  • shared/cliconfig: 添加 OCI 远程支持
  • incusd: 添加 OCI 注册表支持
  • incusd/instance/lxc: 基本 OCI 支持
  • internal/instance: 添加 volatile.container.oci
  • incusd/instance/lxc: 添加 volatile.container.oci
  • incus: 添加对 volatile.container.oci 的支持
  • incusd/instance: 处理从镜像创建时的 OCI 配置
  • 测试: 添加基本的 OCI 测试
  • gomod: 更新依赖项
  • doc: 更新配置
  • 文档: 将 OCI 添加到词汇表
  • i18n: 更新翻译模板
  • shared/subprocess: 修复 gofmt
  • incusd/storage/lvmcluster: 不允许存储桶
  • incusd/storage/lvmcluster: 不要独占锁定 ISO 卷
  • incusd/device/disk: 允许将同一个 ISO 附加到多个实例
  • incusd/device/disk: 允许使用代理/cloud-init 磁盘进行实时迁移
  • incusd/instance/qemu: 修复使用代理/cloud-init 磁盘进行实时迁移
  • incusd/device/disk: 在未初始化的池上不要崩溃
  • incusd/storage/lvmcluster: 始终使用共享访问
  • incusd/instance/lxc: 当没有每个实例的值时,不要报告文件系统指标
  • incus/top: 将间隔设置为 10 秒(服务器端最小值为 8)
  • incus/top: 隐藏零值
  • incusd/device/disk: 将虚拟磁盘标记为始终可迁移
  • tests: 更新最近更改的指标测试

文档

Incus 文档可以在以下地址找到:
https://linuxcontainers.cn/incus/docs/main/

软件包

Incus 上游只发布常规的发布版 tarball,因此没有官方的 Incus 软件包。以下是启动和运行 Incus 的一些可用选项。

在 Linux 上安装 Incus 服务器

Incus 可用于大多数常见的 Linux 发行版。您可以在我们的文档中找到详细的安装说明。

https://linuxcontainers.cn/incus/docs/main/installing/

Incus 客户端的 Homebrew 软件包

客户端工具可通过 HomeBrew 在 Linux 和 MacOS 上使用。

https://formulae.brew.sh.cn/formula/incus

Incus 客户端的 Chocolatey 软件包

客户端工具可通过 Chocolatey 供 Windows 用户使用。

https://community.chocolatey.org/packages/incus/6.3.0

Incus 客户端的 Winget 软件包

客户端工具也可通过 Winget 供 Windows 用户使用。

https://winstall.app/apps/LinuxContainers.Incus

支持

每月功能发布仅支持到下一个版本发布为止。需要更长时间支持和更少更改的用户应考虑使用 Incus 6.0 LTS。

社区支持提供于:https://discuss.linuxcontainers.org
商业支持可通过以下途径获得:https://zabbly.com/incus
错误报告地址:https://github.com/lxc/incus/issues

旧闻