基于 VIOS 的虚拟以太网适配器的工作原理和配置实现
本文对 Power 系统中基于 VIOS 的虚拟以太网适配器(Virtual Ethernet Adapter)的工作原理、基本配置选项和配置步骤进行了讲解,并介绍了两种常用的 High Availability 的配置场景。Power System 的系统工程师可以通过本文了解虚拟以太网适配器的配置方法,软件工程师则可以学习到虚拟以太网适配器的工作原理。
PowerVM 中相关概念简介
Power System 通过 PowerVM 软件体系实现对各种硬件资源,如 CPU,内存,I/O 设备等均实现了虚拟化,其中与以太网适配器虚拟相关的概念包括:
LPAR:即 Logical Partation,逻辑分区,Power System 中的虚拟化是通过进行逻辑分区实现的,每个逻辑分区在创建时可以分配到 Power 服务器的硬件资源,而后安装操作系统和应用软件。一个 Lpar 是应用程序执行的资源集合。
Power Hypervisor:Power 系统固件中提供的基础软件,它为 Lpar 之间资源共享以及各自独立运行提供支持,并为所有资源的虚拟化提供底层支持。
VIOS:即 Virtual I/O Server,为 I/O 设备如 SCSI,CD 和网络适配器的虚拟提供支持。它需要以一个 AIX Lpar 为载体运行于 Power 服务器中,作为 I/O 无力设备的 Server 为其它 lpar 提供虚拟化支持。
为支持以太网适配器的虚拟化,需要在 Power 服务器中创建 VIOS LPAR,并在其中配置物理以太网适配器资源,其他的 LPAR 通过 Power Hypervisor 与 VIOS 通信,进而实现对物理以太网适配器资源的共享使用。
VLAN 简介
Power System 中使用 VIOS 实现对以太网适配器的虚拟依赖和遵循于 IEEE 802.1Q VLAN。IEEE 802.1Q VLAN 是一个工作在 2 层的网络区域协议,一个 VLAN 是一个二层广播区域。只有处于同一个 VLAN 内部的服务器可以通信,这为不同 VLAN 之间提供了安全屏蔽。
一个 VLAN 网络中包括的网元为主机和支持 VLAN 的交换机:
VLAN 中的主机:若支持 802.1Q VLAN 则称为 VLAN-awared 主机,通过操作系统的设置可以使从主机发送的数据包即带有 VLAN ID;若不支持 802.1Q,称为 VLAN-unawared 主机,其发送的数据报不带有 VLAN ID。
VLAN 中的交换机:必须支持 VLAN,这需要对交换机中的交换端口进行配置,首先必须为每个端口配置一个 Port Virtual ID(后简称 PVID,其次还也可以根据网络拓扑需求为不同端口配置各自的附加 Virtual ID(后简称 VID)。这样,交换机中将存在两种端口:只拥有 PVID 的端口称为 tagged 端口,同时拥有 PVID 和附加 VID 的端口称为 untagged 端口。
当数据报到达交换机,交换机会检查数据报中是否带有 VLAN ID,如果没有则为数据报添加 VLAN ID,其取值即为交换机接收端口的 PVID;如果数据报本身带有 VLAN ID,则不需要修改数据报;而后,根据数据报中的目的 MAC 地址匹配查找交换机的转出端口,找到后判断该端口配置的所有 VID( 包括 PVID 和附加的 VID) 中是否存在与数据报中 VLAN ID 相同的值,如果有则确定该端口为最终转出端口,没有则丢弃数据报。在确定了最终转出端口和交换机将数据报转发出去之前,会判断数据包中的 VID 是否为交换机自动添加的 PVID,是则需要去除 VID 后再转发,否则直接转发。这样,交换机只会在拥有同样 VID 的端口中转发数据报,保证了 VLAN 内部的通信和 VLAN 之间通信的安全隔离。
基于 VIOS 的虚拟以太网适配器的工作原理
为了支持虚拟以太网适配器,Power Hypervisor 实现了一个支持 IEEE 802.1Q VLAN 的虚拟以太网交换机 ( 后称 Hypervisor 虚拟交换机 ) 和一套虚拟以太网适配器管理机制。Hypervisor 虚拟交换机通过 VLAN 来实现 LPAR 之间的通信,它在各个 LPAR 之间虚拟出了一个或多个 VLAN,只有同一 VLAN 中的 LPAR 可以进行内部通信。每一个 LPAR,包括 VIOS,可以创建一个或多个虚拟以太适配器,通过它们实现与 Hypervisor 虚拟交换机端口的连接,以及对该交换机端口 VLAN 的设置。
LPAR 之间通信:通过 Hypervisor 实现。Hypervisor 虚拟交换机实现的是一个虚拟网络,LPAR 之间的通信不需要物理以太网适配器的支持,每个 LPAR 的虚拟以太网适配器可以通过 Hypervisor 虚拟交换机直接通信。
LPAR 与外部网络之间的通信:需要安装 VIOS LPAR,由 VIOS 与 Hypervisor 一起实现。在 VIOS 中需要配置连通外部网络的物理以太网适配器;需要创建一个或多个虚拟以太网适配器,用来连接 Hyperviso 虚拟交换机;需要创建一个 Shared Ethernet Adapter( 后简称 SEA),SEA 基于物理以太网适配器和虚拟以太适配器创建,用来桥接外部网络和 Hypervisor 虚拟交换机;这样,可以实现 Client LPAR 对 VIOS 中的物理以太网适配器的虚拟使用,实现与外部网络的通信。
当 Client LPAR 向发送数据报时,首先通过本地的虚拟以太适配器到达 Hypervisor 虚拟交换机,该交换机遵循 IEEE 802.1Q 进行数据报转发。若在 LPAR 之间的内部虚拟网中找到匹配的目的网元,虚拟交换机将数据报直接转发到目的 LPAR 的虚拟以太适配器。若没有找到则说明目的网元不在 LPAR 之间的虚拟交换网络中,即该数据报是给外网的,这时虚拟交换机将转发数据报到 VIOS 的虚拟以太适配器,并通过 SEA 转发到物理以太网适配器,进而流向外网。
当 VIOS 从物理网络适配器收到外网发送给 Client LPAR 的数据报时,对于 untagged 的数据报,SEA 将其转发到指定的 default 虚拟以太网适配器;对带有其他 VLAN ID 的数据报,SEA 将其转发到设置了相同 VID 的虚拟以太网适配器;而后通过 Hypervisor 虚拟交换机流向 Client LPAR 的虚拟以太适配器。对于相关设置参数的讲解请参看下一章。
图 1 为使用 VIOS 实现用来支持 AIX LPAR 的虚拟以太网适配器的一个实例:
图 1. 使用 VIOS 实现虚拟以太网适配器的实例
图 1 中,Power 服务器中创建了 4 个操作系统为 AIX 的 Client LPAR 和一个 VIOS LPAR,每一个 Client LPAR 定义了一个虚拟以太适配器,VIOS 中配置了一个 SEA 用来桥接内部虚拟网络和外部网络。
LPAR1 ent0 对应的 Hypervisor 虚拟交换端口为 tagged 端口,设置了 PVID 1 和 VID 3;LPAR2 ent0 对应的交换端口为 untagged 端口,只设置了 PVID 1;LPAR3 ent0 对应的交换端口为 tagged 端口,设置了 PVID 2 和 VID 3;LPAR4 ent0 对应的交换端口为 untagged 端口,只设置了 PVID 2;VIOS 的 ent1 对应的交换端口为 tagged 端口,设置了 PVID 1 和 VID 3;LPAR2 和 LPAR4 属于 VLAN-unawared 主机,LPAR1 和 LPAR3 属于 VLAN-awared 主机(AIX 中通过使用 smitty vlan 在虚拟以太适配器 ent0 上创建 ent1 并分配 VID 为 10 来实现)。外部网络的交换机连接端口为 tagged 端口,设置了 PVID 1 和 VID 3。
这种配置在网络中创建了三个 VLAN:
- VLAN1,连接的 LPAR 为 LPAR1/en0,LPAR2/en0,VIOS/en2。使用该 VLAN,LPAR1 en0 和 LPAR2 en0 除了可以实现 LPAR 之间的通信,还可以与 VIOS 的 ent2 通信,进而通过 SEA 和 VIOS 的 ent0 和外部网络通信。
- VLAN2,连接的 LPAR 为 LPAR3/en0,LPAR4/en0。使用该 VLAN,LPAR4 en0 则只能通过 VLAN 2 和 LPAR3 的 en0 通信,不能访问外部网络。
- VLAN3:连接的 LPAR 为 LPAR1/en1,LPAR3/en1。使用该 VLAN,LPAR1 en1 和 LPAR3 en1 除了可以实现 LPAR 之间的通信,还可以和外部以太网交换机中处于 VLAN 3 的主机通信。
LPAR2 和 LPAR3 之间均不存在 VLAN,故不能直接实现内部通信。
LPAR4 和 LPAR1/2 之间均不存在 VLAN,故不能直接实现内部通信。
基于 VIOS 的虚拟以太网适配器的主要配置选项
Hypervisor 虚拟交换机的配置选项
由于 Hypervisor 虚拟交换机并不需要真正的物理端口,交换机的虚拟端口和最终分配给 LPAR 的虚拟以太网适配器之间也并不存在物理网线来连接,Hypervisor 在实现虚拟交换机时,将交换机的虚拟端口直接关联到分配给 LPAR 的虚拟以太网适配器上,进而通过对 LPAR 的虚拟以太网适配器的配置来实现对关联的虚拟交换机端口的设置。
这些设置可以通过 HMC,在为 LPAR 创建虚拟以太网适配器时进行设置或修改,主要包括:
- VLAN ID:实现对底层 Hypervisor 虚拟交换机端口的 PVID 的设置,此项必须设置,交换机使用它来实现对 VLAN-unawared LPAR 的 VLAN 支持。
- IEEE 802.1Q Compatible Adapter 选项:用来设置 tagged 交换端口,即为虚拟交换机端口添加 VID,以支持 tagged 数据报的 VLAN。一般使用 untagged 端口的 PVID 即可满足基本的内外网通行,只有在需要划分多个 VLAN 的进行高级控制的时候,才需要选择该选项进行 VID 的设置。
- Access External Network 选项:指定本适配器是否与外部网络相连,在对 VIOS LPAR 中与 SEA 关联的且用于与外网通信的虚拟以太网适配器配置时,必须开启改选项,Client LPAR 中的虚拟以太网适配器不需要开启。这样,当 Client LPAR 发送数据报的时候,Hypervisor 若在关联的 VLAN 中匹配不到目的 MAC 地址,则会转发数据报到启动“Access External Networks”功能的虚拟以太网适配器。
- Trunk Priority 参数:在 VIOS LPAR 中,设置该值指定与 SEA 关联的虚拟以太网适配器的 Priority,主要用于支持 SEA HA 设置,这时存在两个 SEA,则 Priority 值越优先权越高,成为 Primary SEA。
SEA 的配置参数
SEA 类似一个二层的 Bridge,其设置通过使用“mkvdev”创建 SEA 设备的时候完成,也可以通过“chdev”进行修改。
SEA 的属性可以使用“lsdev”查看:
$ lsdev -dev ent4 -attr Attributevaluedescription user_settable ctl_chanent3Control Channel adapter for SEA failover True gvrpnoEnable GARP VLAN Registration Protocol (GVRP) True ha_modeautoHigh Availability Mode True jumbo_framesnoEnable Gigabit Ethernet Jumbo Frames True large_receivenoEnable receive TCP segment aggregation True largesend1Enable Hardware Transmit TCP Resegmentation True netaddr9.3.4.1Address to ping True pvid1PVID to use for the SEA device True pvid_adapterent2Default virtual adapter to use for non-VLAN-tagged packets True real_adapterent0Physical adapter associated with the SEA True thread1Thread mode enabled (1) or disabled (0) True virt_adaptersent2List of virtual adapters associated with the SEA (comma separated) True
- real_adapter:SEA 基于的物理以太网适配器。
- virt_adapter:SEA 基于的虚拟以太网收配器列表。
- pvid:SEA 的 PVID,SEA 对于从外网收到的 untagged 的数据报,会添加该 PVID 为数据报的 VLAN ID。
- pvid_adapter:默认转发的虚拟以太网适配器,SEA 对于从外网收到的 untagged 数据报,会将其转发到 default 虚拟以太网适配器。
- 用来支持 SEA Failover 的一些参数:ctl_chan 用来设置控制通道;ha_mode 用来指定 HA mode;netaddr 用来指定 SEA 将要进行 ping 测试的外网 IP。
基于 VIOS 的虚拟以太网适配器的基本配置步骤
本部分将实现一个使用虚拟以太网适配器进行网络通信的最基本的环境:Power 服务器中创建单一 VIOS 和多个 Client LPAR,它们都作为 VLAN-unwared LPAR 连接在由 Hypervisor 交换机提供的 PVID=1 的 VLAN 中;该环境支持 LPAR 之间和 LPAR 与外网之间的通信。
具体步骤(主要针对与虚拟以太适配器设置相关的步骤)如下:
- 创建一个 VIOS,为其创建虚拟以太网适配器,设置 VLAN ID 并启动“Access External Network”,这里不开启“IEEE 802.1q compatible adapter”选项,利用 PVID VLAN 实现通信。
图 2. 为 VIOS 创建虚拟以太适配器
图 3. 为 VIOS 的虚拟以太适配器设置参数
其中:
Adapter ID 为根据随机编号,不能与 LPAR 中以后的虚拟设备重复;
VLAN ID 为 1,用来设置 Hypervisor 虚拟交换机中将为该 LPAR 生成的与之连接的虚拟端口的 PVID,该 LPAR 将可以利用 VLAN1 实现通信;
未开启“IEEE 802.1q compatible adapter”,则没有对 Hypervisor 虚拟交换机的对应的虚拟端口进行附加的 VID 设置,对于需要多个 VLAN 的网络需求可以开启该选项并设置多个 VID;
开启“Access external network”,说明该虚拟以太网适配器可以与外网连接,当 Hypervisor 虚拟交换机收到发往外网的数据报的时候,可以选择转发给该适配器;
设置“Trunk priority”为 0,对于存在多个 VIOS 的 HA 的网络拓扑,Trunk 值越小表明 VIOS 的优先级越高;这里该 VIOS 将为 Primary。
创建虚拟以太适配器以后,查看虚拟设备,会发现 ent2:
$ lsdev – virtual name status descritption ent2 Available Virtual I/O Ethernet Adapter (l-lan)
- 在 VIOS 中创建 SEA:
察看物理以太适配器:$ lsdev – type adapter name status descritption ent0 Available 2-Port 10/100/1000 Base-Tx PCI-X Adapter(14108902)
基于物理以太网适配器 ent0 和虚拟以太网适配器 ent2 创建 SEA:
$ mkvdev – sea ent0 – vadapter ent2 – default ent2 – defaulted 1 ent3 Available en3 en3
其中,-vdapater 指定关联的虚拟以太适配器,-default 指定 SEA 对于 untagged 数据报的 default 转发端口,-defaultid 指定 SEA 的 default PVID。这样,当接收到 untagged 数据报时,SEA 会使用 PVID 1 作为 VLAN ID 添加到数据报,并转发到 ent2。
- 为每个 Client LPAR 创建虚拟以太网适配器,设置 VLAN ID 与 VIOS 的虚拟以太适配器的 VLAN ID 一致:
图 4. 为 Client LPAR 的虚拟以太适配器设置参数
其中的参数意义和步骤 1 中为 VIOS 创建 ent2 时完全相同,需要注意的是:
VLAN ID:必须与 VIOS 的 ent2 设置相同,这样才能保证该 LPAR 与 VIOS 在同一个 VLAN 中。
未开启“Access external network”,说明该虚拟以太网适配器不与外网连接,当 Hypervisor 虚拟交换机收到发往外网的数据报的时候,不会转发给该适配器;只有 VIOS 的虚拟以太网适配器需要开启该选项。
基于 VIOS 的虚拟以太网适配器的 HA 配置
由于所有的 LPAR 均通过 VIOS 和外部网络通信,如果 SEA 或者物理以太驱动器在通信中出现故障,LPAR 和外部的通信将被暂时中断,直到故障恢复。这样,如图 1 所示的配置中存在单点故障的危险,不能满足对故障率要求较高的使用场景。本章将介绍两种使用 VIOS 实现的虚拟以太网适配器的 HA 配置。
SEA failover
SEA failover 方法在 VIOS 层面提供以太网的 HA 支持。首先,需要配置两个 VIOS/SEA。其次,两个 SEA 之间通过专门的 VLAN 实现一个控制通道,用来交换 keep-alive 或者 heartbeat 消息,以检测对端 SEA 的状态以及互通情况;控制通道中的消息无法流向外网,故不能检测 SEA 和外网之间单纯的连接故障,为此 SEA 通过周期性的 ping 检测来监控与外网连通的情况,这需要为 SEA 配置一个可到达的外网 IP 作为 ping 的目的 IP,同时也为 SEA 上的本地接口设置一个外网 IP。同时,需要为两个 SEA 设置 Priority,这通过设置关联的虚拟以太适配器的“Trunk Priority”值实现,Priority 值越小优先级越高。
以图 5 为例,VIOS1 的 SEA 为 Primary SEA,VIOS2 的 SEA 为 Standby SEA,Primary SEA 为 Active SEA,它们与 Client LPAR 的 ent0 同时连接于 VLAN 1 中,Client LPAR 通过 Active SEA 与外网通信。两个 SEA 通过虚拟以太适配器 ent3 和专门的 VLAN 99 实现控制通道;同时为 SEA 和 en4 分别设置外网 IP,用于 ping 检测。这样无论是 Active SEA 本身出现故障与或是其与外网的连接出现故障,Standby SEA 都将检测到,并将自己置为 Active,继续为 Client LPAR 提供与外部的通信。
图 5. SEA Failover 实例
以图 5 为例,SEA Failover 的配置步骤为 :
- 创建两个 VIOS 并安装。
- 为每个 VIOS 创建 2 个虚拟以太适配器:
ent2 设置 VLAN ID=1,即为虚拟交换机 PVID=1,VLAN 1 用于 LPAR 和外网的通信;开启“Access external network”功能;设置 VIOS1 的 ent2 的“trunk priority”为 1,设置 VIOS2 的 ent2 的“trunk priority”为 2。
- 为每个 VIOS 创建 SEA:
$mkvdev -sea ent0 -vadapter ent2 -default ent2 – defaulted 1 -attr ha_mode=auto ctl_chan=ent3 netaddr=9.3.4.1
如果 SEA 已经创建,可以通过 chdev 对其修改来代替 mkvdev:
$chdev -dev ent4 -attr ha_mode=auto ctl_chan=ent3
其中,ha_mode 设置 Failover 模式,ctl_chan 设置用于控制通道的虚拟以太网适配器 ent3,netaddr 设置周期性 ping 检测的目的外网 IP 地址。
- 使用 cfgassist 通过 SMIT 或者 mktcpip 命令创建 SEA 本地接口 en4 并为其设置公网 IP
- 创建 Clinet LPAR,设置 VLAN ID 为 1。
Network Interface Backup
Network Interface Backup(后简称 NIB)是在 Client LPAR 的操作系统层面提供的 HA,由操作系统本身提供的相关功能实现,这里以 AIX 为例进行介绍。
Client LPAR 中,AIX 使用两个虚拟以太网适配器创建一个 EtherChannel,其中一个为 Primary 适配器,另一个为 Backup 适配器。在 NIB HA 模式中,EtherChannel 仅使用 Primary 适配器进行网络通信。LPAR 通过周期性的 ping 指定的外网地址来确定虚拟以太适配器的可用性,如果某一时间检测到 Primary 适配器不可用,将切换到 Backup 适配器。在网络通信中同时使用多个适配器以增加带宽的 Link Aggregation 模式不被支持。同时,Primary 和 Backup 适配器需要被设置到不同的 VLAN 中,并且分别为每个 VLAN 配置一个 VIOS。
以图 6 中为例,Client LPAR 的虚拟以太适配器 ent0 和 ent1 分别处于 VLAN1 和 VLAN2,VIOS1 和 VIOS2 分别连接于 VLAN1 和 VLAN2。在 Client LPAR 中基于 ent0 和 ent1 创建了 NIB 模式的 EtherChannel ent2,并设置 ent0 为 Primary,ent1 为 Standby。初始时,LPAR 的 ent2 使用底层 ent0 和 VLAN1 与外网进行通信,同时 LPAR 通过周期性的 ping 指定的外网地址来确定 ent0 和 ent1 的可用性,当 VIOS1 和外网的连接出现问题时,LPAR 的 ent2 将切换到 ent1,使用 VLAN2,VIOS2 和外网通信。
图 6. NIB 配置实例
以图 6 为例,NIB 的配置步骤为:
- 创建两个 VIOS 并安装。
- 为每个 VIOS 创建 1 个虚拟以太适配器 ent2,指定 VLAN ID 分别为 1 和 2,同时都开启“Access external network”功能。
- 为每个 VIOS 创建 SEA,分别设置 defaultid 为 1 和 2:
VIOS1: $mkvdev -sea ent0 -vadapter ent2 -default ent2 – defaultid 1 VIOS2: $mkvdev -sea ent0 -vadapter ent2 -default ent2 – defaultid 2
- 创建 Client LPAR,为 LPAR 创建两个虚拟以太适配器,指定它们的 VLAN ID 分别为 1 和 2,安装 LPAR。
- 在 LPAR 的 AIX 中配置 EtherChannel,通过 smitty etherchannel 实现:
图 7. 通过 SMIT 配置 EtherChannel
该操作将会创建新的虚拟以太网适配器,即 ent2。
总结
SystemP 通过 VIOS 实现的以太网适配器虚拟化依赖于 Hypervisor 对 VLAN 的支持以及 VIOS 对物理网卡虚拟化的支持,本文前面各章对其工作原理,配置步骤和参数进行了详细的介绍。在实际环境中,采用 HA 的场景更加常见,在本文最后部分有所介绍。读者如果需要更深入的学习可以查看参考文献。
本文转自:https://www.ibm.com/developerworks/cn/aix/library/1011_hanyf_powervioseth/