类型:nic

注意

nic 设备类型支持容器和虚拟机。

NIC 支持容器和虚拟机的热插拔(ipvlan NIC 类型除外)。

网络设备,也称为网络接口控制器NIC,提供与网络的连接。Incus 支持几种不同类型的网络设备(NIC 类型)。

nictypenetwork

在将网络设备添加到实例时,有两种方法可以指定要添加的设备类型:通过 nictype 设备选项或 network 设备选项。

这两个设备选项是互斥的,您只能在创建设备时指定其中一个。但是,请注意,当您指定 network 选项时,nictype 选项会从网络类型自动派生。

nictype

使用 nictype 设备选项时,您可以指定不受 Incus 控制的网络接口。因此,您必须指定 Incus 使用网络接口所需的所有信息。

使用此方法时,必须在创建设备时指定 nictype 选项,并且以后无法更改。

network

使用 network 设备选项时,NIC 将链接到现有的 托管网络。在这种情况下,Incus 拥有有关网络的所有必需信息,您只需在添加设备时指定网络名称即可。

使用此方法时,Incus 会自动派生 nictype 选项。该值是只读的,无法更改。

从网络继承的其他设备选项在 NIC 特定设备选项的“托管”列中标记为“是”。如果您使用的是 network 方法,则无法直接自定义这些选项以用于 NIC。

有关更多信息,请参见 关于网络

可用的 NIC 类型

以下 NIC 可以使用 nictypenetwork 选项添加

  • bridged:使用主机上的现有网桥,并创建一个虚拟设备对,将主机网桥连接到实例。

  • macvlan:基于现有网络设备设置一个新的网络设备,但使用不同的 MAC 地址。

  • sriov:将启用 SR-IOV 的物理网络设备的虚拟函数传递到实例。

  • physical:将主机的物理设备传递到实例。目标设备将从主机消失,并出现在实例中。

以下 NIC 只能使用 network 选项添加

  • ovn:使用现有 OVN 网络,并创建一个虚拟设备对,将实例连接到该网络。

以下 NIC 只能使用 nictype 选项添加

  • ipvlan: 基于现有网络设备设置新的网络设备,使用相同的 MAC 地址但不同的 IP。

  • p2p: 创建一对虚拟设备,将其中一端放入实例,另一端留在主机上。

  • routed: 创建一对虚拟设备来连接主机到实例,并设置静态路由和代理 ARP/NDP 条目,允许实例加入指定父接口的网络。

可用的设备选项取决于 NIC 类型,并在以下各节的表格中列出。

nictype: bridged

注意

您可以通过 nictype 选项或 network 选项选择此 NIC 类型(有关托管 bridge 网络的信息,请参见 桥接网络)。

一个 bridged NIC 使用主机上的现有桥接,并创建一对虚拟设备来连接主机桥接到实例。

设备选项

类型为 bridged 的 NIC 设备具有以下设备选项

类型

默认值

托管

描述

boot.priority

整数

-

VM 的启动优先级(值越大,越优先启动)

host_name

字符串

随机分配

主机内部接口的名称

hwaddr

字符串

随机分配

新接口的 MAC 地址

ipv4.address

字符串

-

通过 DHCP 分配给实例的 IPv4 地址(可以是 none,当 security.ipv4_filtering 设置后,限制所有 IPv4 流量)

ipv4.routes

字符串

-

要在主机上添加到 NIC 的 IPv4 静态路由的逗号分隔列表

ipv4.routes.external

字符串

-

路由到 NIC 并发布到上行网络(BGP)的 IPv4 静态路由的逗号分隔列表

ipv6.address

字符串

-

通过 DHCP 分配给实例的 IPv6 地址(可以是 none,当 security.ipv6_filtering 设置后,限制所有 IPv6 流量)

ipv6.routes

字符串

-

要在主机上添加到 NIC 的 IPv6 静态路由的逗号分隔列表

ipv6.routes.external

字符串

-

路由到 NIC 并发布到上行网络(BGP)的 IPv6 静态路由的逗号分隔列表

limits.egress

字符串

-

出站流量的 I/O 限制,单位为 bit/s(支持各种后缀,请参见 存储、内存和网络限制的单位

limits.ingress

字符串

-

入站流量的 I/O 限制,单位为 bit/s(支持各种后缀,请参见 存储、内存和网络限制的单位

limits.max

字符串

-

入站和出站流量的 I/O 限制(与设置 limits.ingresslimits.egress 相同)

limits.priority

整数

-

出站流量的 skb->priority 值(32 位无符号整数),用于内核排队机制 (qdisc) 来优先处理网络数据包(此值的具体效果取决于 qdisc 实现,例如,SKBPRIOQFQ。在设置此值之前,请参阅内核 qdisc 文档。)

mtu

整数

父 MTU

新接口的 MTU

name

字符串

内核分配

实例内部接口的名称

network

字符串

-

将设备链接到的托管网络(而不是直接指定 nictype

parent

字符串

-

主机设备的名称(如果直接指定 nictype,则需要此选项)

queue.tx.length

整数

-

NIC 的发送队列长度

security.ipv4_filtering

布尔值

防止实例欺骗其他实例的 IPv4 地址(启用 security.mac_filtering

security.ipv6_filtering

布尔值

防止实例欺骗其他实例的 IPv6 地址(启用 security.mac_filtering

security.mac_filtering

布尔值

防止实例欺骗其他实例的 MAC 地址

security.port_isolation

布尔值

防止 NIC 与网络中启用了端口隔离的其他 NIC 通信

vlan

整数

-

用于非标记流量的 VLAN ID(可以是 none,以从默认 VLAN 中删除端口)

vlan.tagged

整数

-

用于标记流量的 VLAN ID 或 VLAN 范围的逗号分隔列表

nictype: macvlan

注意

您可以通过 nictype 选项或 network 选项选择此 NIC 类型(有关托管 macvlan 网络的信息,请参见 Macvlan 网络)。

一个 macvlan NIC 基于现有网络设备设置新的网络设备,但使用不同的 MAC 地址。

如果您使用的是 macvlan NIC,Incus 主机与实例之间的通信是不可能的。主机和实例都可以与网关通信,但它们不能直接通信。

设备选项

类型为 macvlan 的 NIC 设备具有以下设备选项

类型

默认值

托管

描述

boot.priority

整数

-

VM 的启动优先级(值越大,越优先启动)

gvrp

布尔值

使用 GARP VLAN 注册协议注册 VLAN

hwaddr

字符串

随机分配

新接口的 MAC 地址

mode

字符串

bridge

Macvlan 模式(bridgevepapassthruprivate 中的一个)

mtu

整数

父 MTU

新接口的 MTU

name

字符串

内核分配

实例内部接口的名称

network

字符串

-

将设备链接到的托管网络(而不是直接指定 nictype

parent

字符串

-

主机设备的名称(如果直接指定 nictype,则需要此选项)

vlan

整数

-

要连接到的 VLAN ID

nictype: sriov

注意

您可以通过 nictype 选项或 network 选项选择此 NIC 类型(有关托管 sriov 网络的信息,请参见 SR-IOV 网络)。

一个 sriov NIC 将支持 SR-IOV 的物理网络设备的虚拟功能传递到实例中。

支持 SR-IOV 的网络设备将一组虚拟功能 (VF) 与网络设备的单个物理功能 (PF) 关联。PF 是标准的 PCIe 功能。另一方面,VF 是非常轻量级的 PCIe 功能,专门用于数据移动。它们具有一组有限的配置功能,以防止更改 PF 的属性。

鉴于 VF 对系统来说就像常规的 PCIe 设备一样,它们可以像常规的物理设备一样传递到实例中。

VF 分配

sriov 接口类型希望通过 parent 属性传递系统上支持 SR-IOV 的网络设备的名称。然后,Incus 检查系统上是否有任何可用的 VF。

默认情况下,Incus 分配它找到的第一个空闲 VF。如果它检测到没有启用的 VF 或所有当前启用的 VF 正在使用中,它会将支持的 VF 数增加到最大值,并使用第一个空闲 VF。如果所有可能的 VF 都在使用中,或者内核或网卡不支持增加 VF 数,则 Incus 会返回错误。

注意

如果您需要 Incus 使用特定的 VF,请使用 physical NIC 而不是 sriov NIC,并将它的 parent 选项设置为 VF 名称。

设备选项

类型为 sriov 的 NIC 设备具有以下设备选项

类型

默认值

托管

描述

boot.priority

整数

-

VM 的启动优先级(值越大,越优先启动)

hwaddr

字符串

随机分配

新接口的 MAC 地址

mtu

整数

内核分配

新接口的 MTU

name

字符串

内核分配

实例内部接口的名称

network

字符串

-

将设备链接到的托管网络(而不是直接指定 nictype

parent

字符串

-

主机设备的名称(如果直接指定 nictype,则需要此选项)

security.mac_filtering

布尔值

防止实例欺骗其他实例的 MAC 地址

vlan

整数

-

要连接到的 VLAN ID

nictype: ovn

注意

您只能通过 network 选项选择此 NIC 类型(有关托管 ovn 网络的信息,请参见 OVN 网络)。

一个 ovn NIC 使用现有的 OVN 网络,并创建一对虚拟设备来连接实例到它。

SR-IOV 硬件加速

要使用 acceleration=sriov,您必须在您的 Incus 主机中拥有兼容的 SR-IOV 物理 NIC,该 NIC 支持以太网交换机设备驱动程序模型 (switchdev)。Incus 假设物理 NIC (PF) 在 switchdev 模式下配置并连接到 OVN 集成 OVS 桥接,并且它有一个或多个活动的虚拟功能 (VF)。

要实现此目的,请遵循以下基本先决条件设置步骤

  1. 设置 PF 和 VF

    1. 在 PF 上激活一些 VF(在以下示例中称为 enp9s0f0np0,PCI 地址为 0000:09:00.0)并取消绑定它们。

    2. 在 PF 上启用 switchdev 模式和 hw-tc-offload

    3. 重新绑定 VF。

    echo 4 > /sys/bus/pci/devices/0000:09:00.0/sriov_numvfs
    for i in $(lspci -nnn | grep "Virtual Function" | cut -d' ' -f1); do echo 0000:$i > /sys/bus/pci/drivers/mlx5_core/unbind; done
    devlink dev eswitch set pci/0000:09:00.0 mode switchdev
    ethtool -K enp9s0f0np0 hw-tc-offload on
    for i in $(lspci -nnn | grep "Virtual Function" | cut -d' ' -f1); do echo 0000:$i > /sys/bus/pci/drivers/mlx5_core/bind; done
    
  2. 通过启用硬件卸载并将 PF NIC 添加到集成桥接(通常称为 br-int)来设置 OVS

    ovs-vsctl set open_vswitch . other_config:hw-offload=true
    systemctl restart openvswitch-switch
    ovs-vsctl add-port br-int enp9s0f0np0
    ip link set enp9s0f0np0 up
    
VDPA 硬件加速

要使用 acceleration=vdpa,您必须拥有兼容的 VDPA 物理 NIC。设置与 SR-IOV 硬件加速相同,只是您还必须启用 vhost_vdpa 模块,并检查您是否有一些可用的 VDPA 管理设备

modprobe vhost_vdpa && vdpa mgmtdev show

设备选项

类型为 ovn 的 NIC 设备具有以下设备选项

类型

默认值

托管

描述

acceleration

字符串

none

启用硬件卸载(nonesriovvdpa 中的一个,请参见 SR-IOV 硬件加速

boot.priority

整数

-

VM 的启动优先级(值越大,越优先启动)

host_name

字符串

随机分配

主机内部接口的名称

hwaddr

字符串

随机分配

新接口的 MAC 地址

ipv4.address

字符串

-

通过 DHCP 分配给实例的 IPv4 地址,none 可用于禁用 IP 分配

ipv4.routes

字符串

-

指向 NIC 的 IPv4 静态路由的逗号分隔列表

ipv4.routes.external

字符串

-

指向 NIC 并发布到上行链路网络的 IPv4 静态路由的逗号分隔列表

ipv6.address

字符串

-

通过 DHCP 分配给实例的 IPv6 地址,none 可用于禁用 IP 分配

ipv6.routes

字符串

-

指向 NIC 的 IPv6 静态路由的逗号分隔列表

ipv6.routes.external

字符串

-

指向 NIC 并发布到上行链路网络的 IPv6 静态路由的逗号分隔列表

name

字符串

内核分配

实例内部接口的名称

嵌套

字符串

-

将此 NIC 嵌套在其中的父 NIC 名称(另请参见 vlan

network

字符串

-

将设备链接到的托管网络(必填)

security.acls

字符串

-

要应用的网络 ACL 的逗号分隔列表

security.acls.default.egress.action

字符串

拒绝

用于与任何 ACL 规则不匹配的出站流量的操作

security.acls.default.egress.logged

布尔值

是否记录与任何 ACL 规则不匹配的出站流量

security.acls.default.ingress.action

字符串

拒绝

用于与任何 ACL 规则不匹配的入站流量的操作

security.acls.default.ingress.logged

布尔值

是否记录与任何 ACL 规则不匹配的入站流量

security.promiscuous

布尔值

让 OVN 将未知网络流量发送到此网络接口(某些嵌套情况需要)

vlan

整数

-

嵌套时使用的 VLAN ID(另请参见 nested

注意

请注意,在 ipv4.addressipv6.address 中使用 none 需要禁用另一个协议。目前,OVN 无法仅在 IPv4 或 IPv6 上禁用 IP 分配。

nictype: physical

注意

  • 您可以通过 nictype 选项或 network 选项选择此 NIC 类型(有关托管 physical 网络的信息,请参见 物理网络)。

  • 每个父设备只能有一个 physical NIC。

physical NIC 提供从主机到物理设备的直接直通。目标设备将从主机消失并出现在实例中(这意味着每个目标设备只能有一个 physical NIC)。

设备选项

类型为 physical 的 NIC 设备具有以下设备选项

类型

默认值

托管

描述

boot.priority

整数

-

VM 的启动优先级(值越大,越优先启动)

gvrp

布尔值

使用 GARP VLAN 注册协议注册 VLAN

hwaddr

字符串

随机分配

新接口的 MAC 地址

mtu

整数

父 MTU

新接口的 MTU

name

字符串

内核分配

实例内部接口的名称

network

字符串

-

将设备链接到的托管网络(而不是直接指定 nictype

parent

字符串

-

主机设备的名称(如果直接指定 nictype,则需要此选项)

vlan

整数

-

要连接到的 VLAN ID

nictype: ipvlan

注意

  • 此 NIC 类型仅适用于容器,不适用于虚拟机。

  • 您只能通过 nictype 选项选择此 NIC 类型。

  • 此 NIC 类型不支持热插拔。

一个 ipvlan NIC 使用相同的 MAC 地址但不同的 IP,基于现有网络设备设置一个新网络设备。

如果您使用的是 ipvlan NIC,则 Incus 主机与实例之间的通信是不可能的。主机和实例都可以与网关通信,但它们不能直接通信。

Incus 目前支持 L2 和 L3S 模式下的 IPVLAN。在此模式下,网关由 Incus 自动设置,但必须使用 ipv4.address 和/或 ipv6.address 选项在容器启动之前手动指定 IP 地址。

DNS

名称服务器必须在容器内部配置,因为它们不会自动设置。为此,请设置以下 sysctls

  • 使用 IPv4 地址时

    net.ipv4.conf.<parent>.forwarding=1
    
  • 使用 IPv6 地址时

    net.ipv6.conf.<parent>.forwarding=1
    net.ipv6.conf.<parent>.proxy_ndp=1
    

设备选项

类型为 ipvlan 的 NIC 设备具有以下设备选项

类型

默认值

描述

gvrp

布尔值

使用 GARP VLAN 注册协议注册 VLAN

hwaddr

字符串

随机分配

新接口的 MAC 地址

ipv4.address

字符串

-

要添加到实例的 IPv4 静态地址的逗号分隔列表(在 l2 模式下,这些可以指定为 CIDR 值或使用 /24 子网的单个地址)

ipv4.gateway

字符串

auto (l3s),- (l2)

l3s 模式下,是否添加自动 IPv4 默认网关(可以是 autonone);在 l2 模式下,网关的 IPv4 地址

ipv4.host_table

整数

-

要添加 IPv4 静态路由的自定义策略路由表 ID(除了主路由表之外)

ipv6.address

字符串

-

要添加到实例的 IPv6 静态地址的逗号分隔列表(在 l2 模式下,这些可以指定为 CIDR 值或使用 /64 子网的单个地址)

ipv6.gateway

字符串

auto (l3s),- (l2)

l3s 模式下,是否添加自动 IPv6 默认网关(可以是 autonone);在 l2 模式下,网关的 IPv6 地址

ipv6.host_table

整数

-

要添加 IPv6 静态路由的自定义策略路由表 ID(除了主路由表之外)

mode

字符串

l3s

IPVLAN 模式(l2l3s

mtu

整数

父 MTU

新接口的 MTU

name

字符串

内核分配

实例内部接口的名称

parent

字符串

-

主机设备的名称(必填)

vlan

整数

-

要连接到的 VLAN ID

nictype: p2p

注意

您只能通过 nictype 选项选择此 NIC 类型。

p2p NIC 创建一个虚拟设备对,将一侧放在实例中,并将另一侧留在主机上。

设备选项

类型为 p2p 的 NIC 设备具有以下设备选项

类型

默认值

描述

boot.priority

整数

-

VM 的启动优先级(值越大,越优先启动)

host_name

字符串

随机分配

主机内部接口的名称

hwaddr

字符串

随机分配

新接口的 MAC 地址

ipv4.routes

字符串

-

要在主机上添加到 NIC 的 IPv4 静态路由的逗号分隔列表

ipv6.routes

字符串

-

要在主机上添加到 NIC 的 IPv6 静态路由的逗号分隔列表

limits.egress

字符串

-

出站流量的 I/O 限制,单位为 bit/s(支持各种后缀,请参见 存储、内存和网络限制的单位

limits.ingress

字符串

-

入站流量的 I/O 限制,单位为 bit/s(支持各种后缀,请参见 存储、内存和网络限制的单位

limits.max

字符串

-

入站和出站流量的 I/O 限制(与设置 limits.ingresslimits.egress 相同)

limits.priority

整数

-

出站流量的 skb->priority 值(32 位无符号整数),用于内核排队机制 (qdisc) 来优先处理网络数据包(此值的具体效果取决于 qdisc 实现,例如,SKBPRIOQFQ。在设置此值之前,请参阅内核 qdisc 文档。)

mtu

整数

内核分配

新接口的 MTU

name

字符串

内核分配

实例内部接口的名称

queue.tx.length

整数

-

NIC 的发送队列长度

nictype: routed

注意

您只能通过 nictype 选项选择此 NIC 类型。

routed NIC 创建一个虚拟设备对以连接主机到实例,并设置静态路由和代理 ARP/NDP 条目以允许实例加入指定父接口的网络。对于容器,它使用虚拟以太网设备对,而对于 VM,它使用 TAP 设备。

此 NIC 类型在操作上类似于 ipvlan,因为它允许实例加入外部网络而无需配置网桥并共享主机的 MAC 地址。但是,它与 ipvlan 不同,因为它不需要内核中的 IPVLAN 支持,主机和实例可以互相通信。

此 NIC 类型尊重主机上的 netfilter 规则并使用主机的路由表来路由数据包,这在主机连接到多个网络时可能很有用。

IP 地址、网关和路由

您必须在实例启动之前手动指定 IP 地址(使用 ipv4.address 和/或 ipv6.address)。

对于容器,NIC 在主机端配置以下链接本地网关 IP 并将其设置为容器 NIC 接口中的默认网关

169.254.0.1
fe80::1

对于 VM,必须通过手动方式或通过 cloud-init 等机制配置网关(请参阅 操作指南)。

注意

如果您的容器映像配置为在接口上执行 DHCP,它可能会删除自动添加的配置。在这种情况下,您必须通过手动方式或通过 cloud-init 等机制配置 IP 地址和网关。

NIC 类型在主机上配置指向实例的 veth 接口的静态路由,用于实例的所有 IP。

多个 IP 地址

每个 NIC 设备都可以添加多个 IP 地址。

但是,最好使用多个 routed NIC 接口。在这种情况下,将后续接口上的 ipv4.gatewayipv6.gateway 值设置为 none 以避免默认网关冲突。还可以考虑使用 ipv4.host_address 和/或 ipv6.host_address 为这些后续接口指定不同的主机端地址。

父接口

此网卡可以在设置了parent网络接口的情况下工作,也可以在未设置的情况下工作。

在设置了parent网络接口的情况下,实例 IP 的代理 ARP/NDP 条目将被添加到父接口,这允许实例在第 2 层加入父接口的网络。

要启用此功能,必须通过sysctl在主机上应用以下网络配置

  • 使用 IPv4 地址时

    net.ipv4.conf.<parent>.forwarding=1
    
  • 使用 IPv6 地址时

    net.ipv6.conf.all.forwarding=1
    net.ipv6.conf.<parent>.forwarding=1
    net.ipv6.conf.all.proxy_ndp=1
    net.ipv6.conf.<parent>.proxy_ndp=1
    

设备选项

类型为routed的网卡设备具有以下设备选项

类型

默认值

描述

gvrp

布尔值

使用 GARP VLAN 注册协议注册 VLAN

host_name

字符串

随机分配

主机内部接口的名称

hwaddr

字符串

随机分配

新接口的 MAC 地址

ipv4.address

字符串

-

要添加到实例的 IPv4 静态地址的逗号分隔列表

ipv4.gateway

字符串

auto

是否添加自动默认 IPv4 网关(可以是autonone

ipv4.host_address

字符串

169.254.0.1

要添加到主机端veth接口的 IPv4 地址

ipv4.host_table

整数

-

要添加 IPv4 静态路由的自定义策略路由表 ID(除了主路由表之外)

ipv4.neighbor_probe

布尔值

true

是否探测父网络以查看 IP 地址可用性

ipv4.routes

字符串

-

要添加到主机到网卡的 IPv4 静态路由的逗号分隔列表(没有 L2 ARP/NDP 代理)

ipv6.address

字符串

-

要添加到实例的 IPv6 静态地址的逗号分隔列表

ipv6.gateway

字符串

auto

是否添加自动默认 IPv6 网关(可以是autonone

ipv6.host_address

字符串

fe80::1

要添加到主机端veth接口的 IPv6 地址

ipv6.host_table

整数

-

要添加 IPv6 静态路由的自定义策略路由表 ID(除了主路由表之外)

ipv6.neighbor_probe

布尔值

true

是否探测父网络以查看 IP 地址可用性

ipv6.routes

字符串

-

要添加到主机到网卡的 IPv6 静态路由的逗号分隔列表(没有 L2 ARP/NDP 代理)

limits.egress

字符串

-

出站流量的 I/O 限制,单位为 bit/s(支持各种后缀,请参见 存储、内存和网络限制的单位

limits.ingress

字符串

-

入站流量的 I/O 限制,单位为 bit/s(支持各种后缀,请参见 存储、内存和网络限制的单位

limits.max

字符串

-

入站和出站流量的 I/O 限制(与设置 limits.ingresslimits.egress 相同)

limits.priority

整数

-

出站流量的 skb->priority 值(32 位无符号整数),用于内核排队机制 (qdisc) 来优先处理网络数据包(此值的具体效果取决于 qdisc 实现,例如,SKBPRIOQFQ。在设置此值之前,请参阅内核 qdisc 文档。)

mtu

整数

父 MTU

新接口的 MTU

name

字符串

内核分配

实例内部接口的名称

parent

字符串

-

要将实例加入的宿主设备的名称

queue.tx.length

整数

-

NIC 的发送队列长度

vlan

整数

-

要连接到的 VLAN ID

bridgedmacvlanipvlan,用于连接到物理网络

bridgedmacvlanipvlan接口类型可用于连接到现有的物理网络。

macvlan实际上允许你将物理网卡分叉,得到一个第二个接口,然后由实例使用。此方法可以让你免于创建桥接设备和虚拟以太网设备对,并且通常比桥接提供更好的性能。

此方法的缺点是macvlan设备虽然能够相互通信以及与外部通信,但无法与父设备通信。这意味着如果你需要实例与主机本身通信,则不能使用macvlan

在这种情况下,最好使用bridge设备。桥接还可以让你使用 MAC 过滤和 I/O 限制,而这些限制无法应用于macvlan设备。

ipvlan类似于macvlan,不同之处在于分叉的设备具有静态分配的 IP,并在网络上继承父设备的 MAC 地址。