3.4.1 VIO虚拟以太网原理

article/2025/9/17 2:36:24

最后更新2021/08/12

VIO Server在此完全实现了一个标准的以太网交换机的功能,现在业界都有了高大上的名称:SDN(Software Defined Network),如果没有足够的网络知识(幸好只是网络链路层),很难真正了解VIO虚拟以太网的内部原理。当然,参照标准配置去实现还是非常容易的,但是在故障面前就会力不从心,因此建议读者能够了解一些基本的网络概念,同时在本节的说明过程,作者也会对重要概念增加额外说明。

在VIO虚拟以太网实施中,有一些网络技术本质上与VIO实现无关,但在虚拟化系统整体设计时会考虑到,例如EtherChannel、Link Aggregation、NIB等等,我们将在<4.2.4虚拟网络系统>讨论,此处只分析VIO虚拟网络系统直接相关的技术。

VIO Server在虚拟以太网架构中都做了什么?简单地说,它实现了以太网桥接功能,也就是转发以太网数据帧的功能:从一边收到的数据帧进行简单的处理,从另一边发送出去。由于VIO的数据处理过程实在简单,只按照需要增、删数据帧的Tag(标记),因此在处理过程中并不需要太多的CPU资源,而且增加的网络延时不大。但是与采用专用硬件ASIC芯片的网络交换机及有大量专用内存做缓存的高端路由器相比,VIO延时是实实在在存在的,特别是当连接高带宽、长距离传输的以太网时,延时的负面影响被放大,性能变得比较差,需要进行一些参数调整以满足特定的网络情况。

下面我们先了解一下以太网Tag Vlan技术。
交换机VLAN Trunk图 3-14 交换机VLAN Trunk

如<图 3-14交换机VLAN Trunk>所示,网络设备可以实现跨交换机的VLAN,也就是属于VLAN1的数据帧只能转发给VLAN1对应的端口,VLAN2的数据帧只能转发给VLAN2对应的端口。数据帧跨越交换机时,有两种情况,<图 3-14交换机VLAN Trunk>中左侧系统多个VLAN的数据帧会通过同一交换机端口转发,交换机必须能够识别数据帧所属的VLAN,而右侧系统则不需要如此,因为不同VLAN的数据帧不会混合,所以网络设备无需进行识别工作,只需要设置固定的端口模式VLAN就可以。

网络设备使用VLAN Tagging(VLAN标记)技术来识别数据帧所属的VLAN,也就是数据帧自身需要包含所属VLAN的标记位。VLAN Tagging的标记插接在以太网数据帧之中,其中VLAN标识被称为VLAN ID(或简称VID,为了明确含义,在后续的说明中,作者依然使用VLAN ID的全称),如<图 3-15 以太网数据帧VLAN Tagging>所示。数据帧中标记VLAN的数据共12位,可以表示2^12-1=4095个VLAN(因此VIO支持最多4094个VLAN,还有一个0号留做他用)。
以太网数据帧VLAN Tagging图 3-15 以太网数据帧VLAN Tagging

VIO进行数据帧转发时进行VLAN ID识别、VLAN ID增、删处理,处理方式与数据帧VLAN ID数值以及VIO Server虚拟以太网卡的设置有关。虚拟网卡设置有4个重要参数影响到VIO对数据帧的转发,参考<图 3-16 VIO虚拟以太网卡设置图>。

  • 必须选择Access external network,否则VIO Server根本不会进行数据帧转发,也就不可能实现沟通物理网络和虚拟网络的功能,也只有VIO Server设定的虚拟以太网卡才有此选项,普通AIX分区上设定虚拟以太网卡时根本没有该选项。在本书中,选择了此选项的虚拟以太网卡又被称为虚拟服务以太网卡或者服务端虚拟以太网卡,否则被称为客户端虚拟以太网卡。
  • 选择IEEE 802.1q compatible adapter才能让此虚拟以太网卡同时支持多个VLAN。
  • VLAN ID(图中箭头所示),此项设置的ID是Default VLAN ID或者被称为Port VLAN ID / PVID,不同于其他设置,稍后要进一步解释。
  • Additional VLAN ID,此项是此虚拟以太网卡支持的所有VLAN标记,增加的方式是依次输入New VLAN ID,并点击Add按钮,新VLAN就添加到其中,可以点击右侧的下拉钮查看,也可以选择特定的ID后点击右侧的Remove钮删除。
    VIO虚拟以太网卡设置图 3-16 VIO虚拟以太网卡设置

VIO进行数据帧转发时进行VLAN ID识别、VLAN ID增、删处理,处理方式与数据帧VLAN ID数值有关。根据数据帧VLAN ID的类型,可以分为无VLAN ID、不符合任何配置的VLAN ID、符合Default(缺省)VLAN ID、符合其他VLAN ID四种情况,VIO将对其分别采用不同的处理策略。
VIO及网络设备Tagging配合表 3-3 VIO及网络设备Tagging配合——物理网到虚拟网

VIO及网络设备Tagging接收表 3-4 VIO及网络设备Tagging配合——虚拟网到物理网

在研究VIO及网络设备Tagging配合问题时要注意VIO和网络设备的配置是各自独立的,只有两者完全一致,才能达到我们需要的转发目标,否则就会出现各种莫名其妙的链路故障。其中最重要的一件事情是:千万不要假设VIO的Default VLAN ID和网络设备Default VLAN是同一个!也不要假设VIO所配置的所有VLAN都在网络设备的定义之中,反之亦然。

为了避免VIO和网络设备两端配合出现问题,同时减少网络广播,建议网络设备的配置是:使用Tagging模式,支持IEEE 802.1q VLAN,将所需要的所有VLAN的VLAN ID都加入到连接VIO物理网卡端口;同时,VIO自身的配置要求是选择Access external network、选择支持IEEE 802.1q VLAN、将所要支持的所有VLAN的VLAN ID加入到Additional VLANs下拉列表中、使用在全网络中不需要的VLAN ID作为Default VLAN ID。

另外当同一物理小型机系统中有多个虚拟服务以太网卡(虚拟SEA)的时候(无论在同一个VIO Server还是不同VIO Server上),没有关系的虚拟SEA的Default VLAN ID都不要相同(连接不同vswitch除外),而两个VIO互为接管的一对虚拟SEA,他们的Default VLAN ID则一定要相同,并且连接相同的vswitch。较新的HMC在启动VIO分区的时候会检测VLAN ID冲突,如果发现冲突,并且虚拟服务以太网卡设置为分区必须,则此VIO分区无法启动。如果发现冲突,而虚拟服务网卡不是必须设备,则VIO分区可以启动,但此卡不会被激活。

如果我们需要让VIO支持VLAN 100、200、300三个VLAN,则需要将这三个VLAN ID添加到网络设备下联VIO物理网卡的端口;同时在VIO虚拟网卡(虚拟SEA)定义中添加100、200、300到Additional VLANs,另外使用一个没有用的VLAN ID添加到VLAN ID项(例如10作为缺省VLAN ID暨PVID)。特别注意不要使用1,因为很多网络设备的缺省ID都是1,会导致VIO收到很多很多不应当发给自己的包,同时VIO一些ID不正确的包也会被发送给网络设备。网络设计的一个重要原则就是“本地丢弃”,如果不需要,马上丢掉,不要转发给任何其它设备。

如果把100添加到VLAN ID项,则100成为VIO的缺省VLAN ID,任何从Hypervisor内部虚拟网100发送过来的数据帧都被删掉VLAN ID,因为这是“缺省”的,VIO认为即使没有VLAN ID,网络设备也应当识别。不幸的是网络设备没有将100设置为自己“缺省”的VLAN(一般都是1为缺省),遇到没有VLAN ID的数据包,就发送到自己“缺省”VLAN,例如VLAN 1,于是数据包就一去而不知所踪。

网络设备是否设置Tagging也会影响到网络的效能和安全性。我们知道VLAN的目的是增加网络隔离度,限制网络广播。只有Tagging模式才能让网络设备正确识别来自VIO的数据帧所属的VLAN,如果网络设备没有设置成支持Tagging,则对于VIO发送来的数据帧无法识别其所属VLAN,网络设备(根据厂商、型号、设置不同)可能采取的动作或者是丢弃掉该数据帧,或者不得不将其向端口所属的所有VLAN广播发送。前者会导致网络不通,后者则会导致网络负载过重。

以上分析只介绍了VIO虚拟以太网的基本工作原理,我们继续来深入讨论其实现过程。我们注意到,前述说明的配置都是在控制VIO虚拟网卡(即虚拟SEA)的参数,并未涉及物理网卡或者(逻辑)SEA,而我们知道真正的虚拟以太网需要这3部分配合到一起才可以实现。下面我们追随数据帧的旅程来看一下VIO虚拟以太网实现的全过程,我们按Tagging和Un-Tagging两种设置来分析。

在Tagging模式下,网络设备根据数据帧所在VLAN发送给VIO物理网卡接口,同时为数据帧增加VLAN ID,也就是说只有VIO物理网卡接口(网络设备端口)配置的VLAN中的数据帧才会被发给VIO,如果网络设备端口没有设置此VLAN ID,数据根本不会发送过来。

下一步,VIO物理网卡接收到数据帧之后只进行CRC校验等操作,而不对数据帧做任何其他处理,也不会进行VLAN识别,此工作由VIO SEA(逻辑SEA网卡设备驱动程序)完成。通过前面的介绍,我们知道逻辑SEA通过VIO命令定义,因此通过VIO命令就可以确定哪些数据帧会得到处理。参考定义(逻辑)SEA的命令:

#mkvdev -sea entx -vadapter enty, enty1, enty2 -default enty -defaultid id
entz Available

定义逻辑SEA的命令中有5个参数,分别是命令中的entx、enty、enty1、enty2、id。

命令中entx对应于物理以太网卡(物理SEA),IBM在设计VIO命令时用SEA标记,而我们知道IBM官方SEA标识的是此命令执行后生成的逻辑网卡entz,即本书概念中的逻辑SEA,这也就是为什么作者一直在说IBM非要把简单的事情搞复杂的原因。

命令中enty对应于虚拟以太网卡(虚拟SEA),虚拟SEA控制着VIO是否及如何处理数据帧。由于定义虚拟SEA中包括Additional VLANs参数,所有定义在虚拟SEA中的VLAN将被VIO进行转发。命令参数中我们注意到虚拟网卡可以有多个:enty、enty1、enty2等等,也就是说VIO进行转发处理的VLAN是所有enty、enty1、enty2等等的集合(这些虚拟SEA的Default VLAN ID也不要/能相同)。每个enty所包含的VLAN ID可以是一个,也可以是多个,不同的设置从原理角度没有什么不同,但管理、性能方面或者实现的工作模式有一些区别,我们将在<4.2.4 虚拟网络系统>讨论这个问题。

命令中default参数对应的enty定义了缺省的虚拟SEA,也就是如果物理SEA接收到没有VLAN ID的数据帧则会发送给enty所定义的VLAN。问题又出现了,enty可能定义了多个VLAN,数据帧到底会发送给哪个VLAN?数据帧会发送给enty的(Hypervisor虚拟以太网内)Default VLAN,其它enty1和enty2的缺省VLAN无效。

命令最后一个参数是defaultid,此参数用于控制数据帧由Hypervisor向物理以太网转发时的行为。虚拟SEA卡从自己的Default VLAN接收到数据帧之后,按照defaultid参数添加VLAN ID,并通过物理以太网卡发送出去。

题外话:第一次看到这里还很清醒的读者绝对是天才,IBM又一次成功地设计出了选择天才的技术。 有兴趣的读者可以自己选取一个VLAN ID去分析具有此VLAN ID tagging的数据包到底会被发送到什么地方。以作者多年设计、实施IBM虚拟化系统的经验,这几个虚拟SEA的Default VLAN或命令中的ID一定不要选择需要真正用于通信的VLAN的ID。

上述命令会产生一个新的逻辑设备(示例中是entz),这就是IBM官方定义的SEA(本书中称为逻辑SEA)。SEA设备的驱动程序进行数据帧转发,其转发规则我们前面已经介绍过。经过SEA的转发,数据帧就从物理网络进入小型机内的虚拟以太网(虚拟SEA),并进而进入小型机Hypervisor的虚拟以太网对应的VLAN之内。小型机Hypervisor依照与以太网交换机相同的规则进行数据帧交换,因此与当前VLAN相连的虚拟以太网卡都可以收到转发进来的数据帧。当然,由于Hypervisor实现了以太网交换机的功能,因此数据帧不会总是采用广播方式发送,当Hypervisor识别了目的网卡的MAC地址之后,以后的数据帧则会一步到位地仅发给目标虚拟以太网卡,既可以是普通AIX分区或VIO Server的客户端虚拟以太网卡,也可以是VIO Server的服务端虚拟以太网卡(即虚拟SEA)。

再下一步,如果以太网卡上绑定有可用的(处于Available状态)高层协议处理设备(AIX/VIO中用en标识,例如en0、en1等),则数据帧上传给操作系统的其他协议层,完成网络高层处理,返回的数据帧不一定从源路径返回,其中涉及到了网络路由选择过程。但无论最终选择了哪个设备,都会回到某一个虚拟以太网卡或者物理网卡,开始了新的数据帧的转发过程。

在最后,我们要注意以下几个问题:

  • 尽管可以在服务端虚拟以太网网卡即虚拟SEA上设定en设备,绑定IP,但其不能与SEA绑定共存。也就是先绑定了IP,则无法再建SEA(逻辑SEA),建了SEA就无法再绑定IP。依照系统架构设计的通用法则:Simply is the best 越简单越好这一原则,绝对不要在虚拟服务网卡(即虚拟SEA、选择了Access external network的虚拟网卡)上绑IP。
  • SEA(逻辑SEA)上是可以绑定IP的,但是基于性能和管理角度考虑,同样建议不要绑IP(绑定IP之后对应的en设备才会Available,en设备变成Defined之后,IP自动失效)。从性能角度考虑,如果绑定了IP,任何流经此逻辑SEA的数据帧都会被发送给高层IP协议层去扫描,以便确认是否需要对IP包进行处理,这显然大大增加了网络负载,因为SEA的主要工作是做数据帧转发,绝大部分数据帧都不是发给它自己的。从管理角度考虑,如果SEA支持多个VLAN,我们通常采用无用的VLAN ID作为SEA Default VLAN,而如果绑定IP,此IP隶属于SEA Default VLAN,需要设置为可用的VLAN才能使其他网络设备与此IP通信,这必然对整体网络设计增加了复杂性,需要从网络设备到虚拟SEA、逻辑SEA三方面一同考虑Default VLAN ID问题,任何地方的失误都会导致IP不通。虽然采用网络设备Un-tagged方式可以避免这个问题,但是在大型网络系统中,Un-tagged的VLAN无法避免大量的带宽被广播风暴侵占。因此,只有在小型、测试性的网络中,可以在逻辑SEA上配置IP,否则就不要这样做。

在Un-Tagging模式下,可以把系统想象为交换机与HUB级联在一起,Un-Tagging的网络设就就是一个HUB集线器。在Hypervisor内部的虚拟网中可以通过交换技术减少网络广播,而数据帧从VIO的物理SEA发出之后,就不存在广播隔离,任何广播包将会全网发送。反之,网络设备广播来的数据包只能发送给虚拟SEA的Default VLAN,此时就一定要选择正确的Default VLAN。综合以上信息考虑,在大型网络系统,强烈建议网络设备使用Tagging;如果仅用于功能测试,VIO连接在HUB上,则可以使用Hypervisor单一VLAN设计(设置虚拟SEA时不选择IEEE 802.1q),简化网络结构。

<图 3-17 VIO虚拟以太网卡设置示例图>给了我们一个实例来说明众多网络设备的相互关系和配置命令。注意,为了便于说明,此图给出了几种不同的组合,但其实这并非一个很好的设计,不要按照此图架构真正的VIO虚拟网络。图中使用PVID标识对应设备的Default VLAN ID,而用VID标识其他Additional VLAN ID。
虚拟以太网设置示例图 3-17 VIO虚拟以太网卡设置示例

图中VIOS1的ent0、1为物理网卡,即物理SEA;ent2为虚拟客户网卡,与普通AIX分区 的虚拟网卡相同;ent3、4、5为虚拟SEA;ent7、8则为VIO命令生成的SEA(逻辑SEA)。图中ent0、8、4、5架构了VLAN 2、200、300;ent7则负责VLAN 100。由于实际例子中虚拟SEA的Default VLAN ID 2和100是真实有用的VLAN,因此要求网络设备做同样的设置,即网络设备对应端口的缺省VLAN ID必须与VIO上联端口SEA的缺省ID相匹配,也是2和100,否则隶属VLAN 2和VLAN 100的Client 2 en0或Client 1 en0无法与外界通信。

通过实例图,我们可以看出一个物理SEA能够对应多个虚拟SEA。为什么不建立一个完全一一映射的对应关系呢?即一个物理SEA只对应一个虚拟SEA和一个逻辑SEA。这是为了在保持虚拟网络系统稳定可靠的同时增加虚拟网络动态变更的能力。

首先,物理网卡并不知道所连接的网络设备都对其开通了哪些VLAN,只有也必须通过虚拟SEA的定义才能告知VIO对哪些VLAN的数据帧进行处理。虚拟SEA规定了VIO对哪些数据帧进行转发,哪些不转发(其实是发给Default ID所在VLAN,通常我们不使用这个VLAN,也就等同于将数据包丢弃掉)。那么一个新问题是如果我要增、删VIO支持的VLAN,应当如何处理?对于网络设备本身,通常有很好的动态支持能力,可以直接更改端口所支持的VLAN ID,VIO也可以同样设计,例如采用Dlpar的方式,添加虚拟SEA的Additional VLAN。但是,我们不要忘记,Dlpar是两步骤过程,既要告知Hypervisor更改虚拟SEA支持的VLAN,还要在VIO内部再次使用cfgmgr/cfgdev之类的命令让VIO的驱动程序更新这一变更。对于程序设计者,我们都知道如果变更较大,修改别人的程序远没有重新编写快,而且更不容易出错。VIO的设计者也正是基于这个考虑,放弃了支持使用Dlpar修改虚拟SEA以变更VLAN,而采用添加、删除一个新设备的方式来实现。

如果要增加一个VLAN,可以通过Dlpar增加一个全新的虚拟服务以太网卡(也就是虚拟SEA),给此网卡分配新VLAN ID。VIO通过cfgdev/cfgmgr识别出新增虚拟SEA之后,使用chdev命令将新虚拟SEA添加给逻辑SEA,这样逻辑SEA就会对应出第二个虚拟SEA,以此类推可以增加多个新VLAN。反向操作,则可以很容易地删除掉增加的VLAN。不过对于初始配置的第一组虚拟SEA、逻辑SEA和VLAN,不能采用此办法删除,因此有一种设计策略是为每个VLAN设置一个虚拟SEA,而所有的虚拟SEA都绑定于同一物理SEA和逻辑SEA。

在VIO虚拟以太网技术分析到此处还遗存三个问题需要解释:网络环路导致的VIO虚拟以太网广播风暴问题、VIO虚拟以太网高可靠问题、VIO虚拟以太网负载分担问题。

VIO实现虚拟以太网,这完全是网络功能的再现。我们都听说过网络广播风暴现象。与网络设备类似,VIO架构的虚拟以太网也可能引起广播风暴,原因也是来自于网络环路。VIO的SEA会转发网络中的数据帧,而这种转发是双向的,既无论是外界物理以太网还是Hypervisor内部虚拟以太网中的广播包都会被VIO转发到另一端,如果VIO网络系统中出现了闭合环路,则广播数据帧会在这个闭合环路中循环转发,最终耗尽网络设备或者VIO的全部处理资源。
网络闭合环路产生的原因是物理以太网和虚拟以太网之间同时有两个链路(VIO SEA)存在,它们都在进行数据帧转发。最常见的情况是有两个物理/虚拟/逻辑SEA的链路工作于同一VLAN,这意味着只要两个链路中有任何一个相同的VLAN就会有问题,而如果网络设备是Un-Tagged模式,则无论VLAN是否相同,只要两路同时工作,都会有问题。参考<图 3-18 VIO虚拟以太网网络环路示例图>,尽管两个VIO的虚拟SEA分别承载VLAN2/200和2/100,但由于他们有相同的VLAN 2,就会产生网络循环,当后一个SEA链路生成时(使用mkvdev命令建立),网络循环就会产生,马上就会造成网络拥塞。另外,这种循环并不一定非要在两个VIO之间产生,在一个VIO内部的两块虚拟网卡之间也是可能的。
以太网网络环路示例图 3-18 VIO虚拟以太网网络环路示例
幸运的是最近版本的Hypervisor微码对此类型的网络循环进行了一定的校验,就是在激活虚拟以太网服务网卡的时候(通常是VIO启动或者通过Dlpar增加新的虚拟服务网卡时),如果已经有另一个虚拟服务网卡承载相同的VLAN,而且两块网卡的优先级相同,则Hypervisor自动删除后激活的网卡中重复的VLAN ID(服务网卡是Desired虚拟IO设备),或者阻止VIO启动/Dlpar执行(服务网卡是Required虚拟IO设备)。再进一步,为什么VIO只检测虚拟网卡的优先级而不是直接禁止第二个重复VLAN ID?这引出了对VIO虚拟网络建立高可靠的要求。

VIO虚拟以太网络也需要实现高可靠设计,VIO自身负责网络数据帧转发,一旦VIO宕机或者因维护工作而短暂停机,虚拟以太网和外界通信立刻中断。VIO虚拟网络架构允许两个VIO同时服务与同一个VLAN,这两个VIO之间建立高可靠的接管设置。注意,对同一个VLAN只能采用热备接管方式,而绝对不能是负载均衡,只要两个VIO同时转发同一个VLAN的数据,立刻就会产生网络环路。

根据虚拟以太网服务网卡的优先级设定,VIO可以让高优先级(优先级数值小)的虚拟以太网服务网卡所在链路工作,低优先级的链路处于热备状态。如果高优先级的VIO出现故障,另一个热备链路马上被激活。为了检测VIO活动状态,VIO虚拟网络架构又引入了心跳技术,就是在两个VIO之间为每对互为备份的虚拟以太网卡链路设定一个心跳网络,由于此网络仅需要存在于一台物理小型机上的两个VIO之间,也就是仅需要Hypervisor虚拟以太网,而不会延伸到物理网络中,因此选择一个不需要的VLAN ID就可以。

VIO虚拟网络架构不仅支持主备模式,也支持负载均衡,只是负载均衡的最小单位是VLAN,也就是说如果VIO1和VIO2同时服务于vlan1,vlan2, vlan3,VIO1可以是vlan1/2的主服务设备,vlan3的备份设备;而VIO2则是vlan1/2的备份设备,vlan3的主服务设备。

在<2.5.8构架虚拟Ethernet(以太网络)构架虚拟Ethernet(以太网络)>一节介绍了如何通过VIO创建最简单的虚拟以太网,下面是两种虚拟以太网的高级模式:双VIO主备模式和双VIO负载均衡模式。两种模式的设置命令几乎相同,物理、逻辑配置也相同,下面参考设计图分别配置主备模式和负载均衡模式:
VIO 设计图主备模式vio a为主vio,vio b为备vio,在两个VIO上分别执行如下命令,由于两个vio的所有物理、虚拟设备顺序号相同,因此待执行命令完全相同(最后ent10就是命令生成的支持以太网帧转发的驱动设备):

mkvdev -sea ent0 -vadapter ent3,ent4,ent5, ent6 -default ent3 -defaultid=10 -attr ha_mode=auto ctl_chan=ent9ent10 Available 

如果是负载均衡模式呢?几乎同样的命令,不仔细看都发现不了不同,设计架构图也几乎是相同的:
负载均衡模式

#mkvdev -sea ent0 -vadapter ent3,ent4,ent5, ent6 -default ent3 -defaultid=10 -attr ha_mode=sharing ctl_chan=ent9ent10 Available

其实,负载均衡可以由主备模式的设置(如果其它设置匹配、允许)直接转换而来:

chdev -dev ent10  -attr ha_mode=sharing

当然,负载均衡设施还是需要更多要求的:

  • 两个vio必须v2.2.1.0或更新
  • 必须两个vio都设置sharing,由于命令总有先后,先执行命令的vio是“主”vio;如果是通过主备转换成负载均衡,则需要在主vio上执行chdev
  • 两个vio对应的所有vlan trunk id等必须相同

通过entstat命令可以查看具体设置:

#entstat -d ent10 | grep -i state
or
#entstat -d ent10

http://chatgpt.dhexx.cn/article/PXSyZcIb.shtml

相关文章

Vivado调用VIO核

文章目录 前言一、IP核的介绍二、VIO核1.作用2.调用方法 总结 前言 提示&#xff1a;本篇文章所使用的软件为Vivado2018.3&#xff1a; 以四选一数据选择器为例&#xff0c;使用verilog hdl语言以及Vivado自带的VIO,IP来实现功能 提示&#xff1a;以下是本篇文章正文内容&…

海思3519 VIO Sample例程讲解

海思VIO Sample例程讲解 海思SDK解压出来后&#xff0c;Sample包含各个功能模块的历程&#xff0c;本篇讲解VIO Sample历程。 进入VIO模块可以看到&#xff0c;VIO的main函数文件&#xff0c;先从main函数执行程序。 进入文件后首先看下VIO实现的功能&#xff0c;可以看到VIO…

PL-VIO论文阅读

PL-VIO: Tightly-Coupled Monocular Visual–Inertial Odometry Using Point and Line Features Yijia He 1,2,* , Ji Zhao 3, Yue Guo 1,2, Wenhao He 1 and Kui Yuan 1 2018 摘要 To address the problem of estimating camera trajectory and to build a structural 3D m…

DM-VIO简析

今天主要是针对DMVIO/DM-VIO的简析&#xff0c;中文网上有的东西都太少了&#xff0c;只能靠看完论文和组员们一起改代码。Lukas组这个东西在中文网被称为有史以来最好的VIO&#xff0c;但是实际过程中我们还是发现了许多不完美的地方。。。(比如ZUPT更新改造中该有的问题仍然在…

VIOSLAM 综述

文章目录 1.VIO 松耦合/紧耦合。2. 相机和IMU的缺点及互补性3. VIO融合算法流程及其模块分解:4. VIO 算法核心:5. 实验结果与总结:6. 参考文献: 1.VIO 松耦合/紧耦合。 Visual-Inertial Odometry&#xff08;VIO&#xff09;即视觉惯性里程计&#xff0c;有时也叫视觉惯性系统…

VIO系统介绍

VIO&#xff08;visual-inertial odometry&#xff09;即视觉惯性里程计&#xff0c;有时也叫视觉惯性系统&#xff08;VINS&#xff0c;visual-inertial system&#xff09;&#xff0c;是融合相机和IMU数据实现SLAM的算法&#xff0c;根据融合框架的区别又分为紧耦合和松耦合…

vivado VIO (virtual input output)虚拟IO的使用

转自&#xff1a;https://blog.csdn.net/wordwarwordwar/article/details/77150930 一般情况下ILA和VIO都是用在chipscope上使用&#xff0c;VIO可以作为在chipscope时模拟IO。 譬如&#xff1a; 在使用chipscope时需要使用按键出发&#xff0c;但是没有设计按键或者板子不再身…

【Vivado那些事儿】-VIO原理及应用

虚拟输入输出&#xff08;Virtual Input Output,VIO)核是一个可定制的IP核&#xff0c;它可用于实时监视和驱动内部FPGA的信号&#xff0c;如图所示。 可以定制VIO的输入和输出端口的数量与宽度&#xff0c;用于和FPGA设计进行连接。由于VIO核与被监视和驱动的设计同步&#xf…

python logger.exception_Python logging设置和logger解析

一、logging模块讲解 1.函数:logging.basicConfig() 参数讲解: (1)level代表高于或者等于这个值时,那么我们才会记录这条日志 (2)filename代表日志会写在这个文件之中,如果没有这个字段则会显示在控制台上 (3)format代表我们的日志显示的格式自定义,如果字段为空,那么默认…

Logger 基本用法

Logger 基本用法 简介 Simple, pretty and powerful logger for android 为Android提供的&#xff0c;简单、强大而且格式美观的工具 本质就是封装系统提供的Log类&#xff0c;加上一些分割线易于查找不同的Log&#xff1b;logcat中显示的信息可配置。最初的样子如下图 包含…

【Logback】<logger>、<root>标签详解

文章目录 背景一、\<logger>使用1.1、使用示例1.1、属性配置说明 & 演示1.1.1、name1.1.2、level1.1.3、additivity1.1.3.1、效果演示&#xff1a;additivitytrue1.1.3.1、效果演示&#xff1a;additivity"false" 1.2 appender-ref 二、\<root>使用2…

python之logger

import logging import os.path import time def test_log():"""指定保存日志的文件路径&#xff0c;日志级别&#xff0c;以及调用文件将日志存入到指定的文件中:paramlogger:"""# 创建一个loggerlogger logging.getLogger()logger.setLevel(l…

Python中logger日志模块详解

1 logging模块简介 logging模块是Python内置的标准模块&#xff0c;主要用于输出运行日志&#xff0c;可以设置输出日志的等级、日志保存路径、日志文件回滚等&#xff1b;相比print&#xff0c;具备如下优点&#xff1a; 可以通过设置不同的日志等级&#xff0c;在release版…

logger:一款管理日志的Python神器

最近要新开一个项目&#xff0c;需要配个 logger 来管理日志&#xff0c;今天分享一下&#xff0c;喜欢记得点赞、关注、收藏。 【注】文末提供交流互助群 import logging ori_logger logging.getLogger(custom_logger) ori_logger.setLevel(logging.INFO) ori_logger.addHa…

Tensorboard + Logger 日志记录

在Pytorch 训练模型的时候&#xff0c;需要日志帮助开发者记录些重要信息和参数&#xff0c;以方便开发者更好的调节模型及参数&#xff0c;常见的日志非 Tensorboard不可&#xff0c;但是Pytorch 对 Tensorboard 的支持不是十分完美&#xff0c;在记录模型重要参数时 Tensorbo…

深入理解 rootLogger、logLogger、qtLogger

作者: 一去、二三里个人微信号: iwaleon微信公众号: 高效程序员 在使用 Log4Qt 时,你会发现有一系列的 logger - rootLogger()、logLogger()、qtLogger(),简直傻傻分不清楚! 为什么会有这么多 logger? 各 logger 之间有什么关系? 它们均适用于哪种场景? 参考文档对这部…

logger 报错

logger 报错&#xff1a;&#xff08;log4j 起不来&#xff0c;log message打不出来&#xff09; No appenders could be found for logger (com.vip.qa.android.base.DriverFactory). log4j:WARN Please initialize the log4j system properly. 原因&#xff1a; log4j.prop…

java的logger_java.util.logging.Logger 使用详解

概述: 第1部分 创建Logger对象 要使用J2SE的日志功能,首先要取得java.util.logging.Logger实例,这可以通过Logger类的两个静态getLogger()方法来取得: staticLogger getLogger(String name) 查找或创建一个logger。staticLogger getLogger(String name, String resourceBun…

Logger日志使用教程

Java util Logger的使用步骤 Java util Logger是java原生的日志生成工具&#xff0c;不需要另外引用类库&#xff0c;使用方便&#xff0c;学习简单&#xff0c;能够在小型应用中灵活使用。下面从实际应用角度&#xff0c;对Logger的使用步骤作出总结&#xff0c;以实现快速掌握…

Logger 日志管理

转载请注明出处&#xff1a; http://blog.csdn.net/like_program/article/details/52986553 1.Logger 是什么 在我们日常的开发中&#xff0c;肯定是少不了要和 Log 打交道&#xff0c;回想一下我们是怎么使用 Log 的&#xff1a;先定义一个静态常量 TAG&#xff0c;TAG 的值通…