收藏 分享(赏)

openstack网络模块详解.ppt

上传人:Facebook 文档编号:8390207 上传时间:2019-06-24 格式:PPT 页数:67 大小:3MB
下载 相关 举报
openstack网络模块详解.ppt_第1页
第1页 / 共67页
openstack网络模块详解.ppt_第2页
第2页 / 共67页
openstack网络模块详解.ppt_第3页
第3页 / 共67页
openstack网络模块详解.ppt_第4页
第4页 / 共67页
openstack网络模块详解.ppt_第5页
第5页 / 共67页
点击查看更多>>
资源描述

1、Neutron,popsuper1982,经典的三节点部署,分三个网络: External Network/API Network,这个网络是连接外网的,无论是用户调用Openstack的API,还是创建出来的虚拟机要访问外网,或者外网要ssh到虚拟机,都需要通过这个网络 Data Network,数据网络,虚拟机之间的数据传输通过这个网络来进行,比如一个虚拟机要连接另一个虚拟机,虚拟机要连接虚拟的路由都是通过这个网络来进行 Management Network,管理网络,Openstack各个模块之间的交互,连接数据库,连接Message Queue都是通过这个网络来。,架构,neutron

2、分成多个模块分布在三个节点上。 Controller节点: neutron-server,用于接受API请求创建网络,子网,路由器等,然而创建的这些东西仅仅是一些数据结构在数据库里面 Network节点: neutron-l3-agent,用于创建和管理虚拟路由器,当neutron-server将路由器的数据结构创建好,它是做具体的事情的,真正的调用命令行将虚拟路由器,路由表,namespace,iptables规则全部创建好 neutron-dhcp-agent,用于创建和管理虚拟DHCP Server,每个虚拟网络都会有一个DHCP Server,这个DHCP Server为这个虚拟网络里

3、面的虚拟机提供IP neutron-openvswith-plugin-agent,这个是用于创建虚拟的L2的switch的,在Network节点上,Router和DHCP Server都会连接到二层的switch上 Compute节点: neutron-openvswith-plugin-agent,这个是用于创建虚拟的L2的switch的,在Compute节点上,虚拟机的网卡也是连接到二层的switch上,架构,创建网络,#!/bin/bash TENANT_NAME=“openstack“ TENANT_NETWORK_NAME=“openstack-net“ TENANT_SUBNET

4、_NAME=“$TENANT_NETWORK_NAME-subnet“ TENANT_ROUTER_NAME=“openstack-router“ FIXED_RANGE=“192.168.0.0/24“ NETWORK_GATEWAY=“192.168.0.1“ PUBLIC_GATEWAY=“172.24.1.1“ PUBLIC_RANGE=“172.24.1.0/24“ PUBLIC_START=“172.24.1.100“ PUBLIC_END=“172.24.1.200“ TENANT_ID=$(keystone tenant-list | grep “ $TENANT_NAME “

5、 | awk print $2)(1) TENANT_NET_ID=$(neutron net-create -tenant_id $TENANT_ID $TENANT_NETWORK_NAME -provider:network_type gre -provider:segmentation_id 1 | grep “ id “ | awk print $4) (2) TENANT_SUBNET_ID=$(neutron subnet-create -tenant_id $TENANT_ID -ip_version 4 -name $TENANT_SUBNET_NAME $TENANT_NE

6、T_ID $FIXED_RANGE -gateway $NETWORK_GATEWAY -dns_nameservers list=true 8.8.8.8 | grep “ id “ | awk print $4) (3) ROUTER_ID=$(neutron router-create -tenant_id $TENANT_ID $TENANT_ROUTER_NAME | grep “ id “ | awk print $4) (4) neutron router-interface-add $ROUTER_ID $TENANT_SUBNET_ID (5) neutron net-cre

7、ate public -router:external=True (6) neutron subnet-create -ip_version 4 -gateway $PUBLIC_GATEWAY public $PUBLIC_RANGE -allocation-pool start=$PUBLIC_START,end=$PUBLIC_END -disable-dhcp -name public-subnet (7) neutron router-gateway-set $TENANT_ROUTER_NAME public,先从逻辑上理解虚拟网络,创建网络,为这个Tenant创建一个privat

8、e network,不同的private network是需要通过VLAN tagging进行隔离的,互相之间broadcast不能到达,这里我们用的是GRE模式,也需要一个类似VLAN ID的东西,称为Segment ID 创建一个private network的subnet,subnet才是真正配置IP网段的地方,对于私网,我们常常用192.168.0.0/24这个网段 为这个Tenant创建一个Router,才能够访问外网 将private network连接到Router上 创建一个External Network 创建一个Exernal Network的Subnet,这个外网逻辑上代

9、表了我们数据中心的物理网络,通过这个物理网络,我们可以访问外网。因而PUBLIC_GATEWAY应该设为数据中心里面的Gateway, PUBLIC_RANGE也应该和数据中心的物理网络的CIDR一致,否则连不通,而之所以设置PUBLIC_START和PUBLIC_END,是因为在数据中心中,不可能所有的IP地址都给Openstack使用,另外可能搭建了VMware Vcenter,可能有物理机器,仅仅分配一个区间给Openstack来用。 将Router连接到External Network,虚拟网络的背后的实现 GRE,第一次看到这个图太头晕,不要紧,后面会慢慢解释每一部分,虚拟网络的背后

10、的实现 VLAN,Compute节点,Network节点,更头晕则接着忽略,ip addr ovs-vsctl show Ip netns exec XXX,把GRE和VLAN混在一块,图画的不错,显然更晕,怎么理解?,回到大学寝室,或者你的家里,是不是只有寝室长的电脑插两块网卡,要上网,寝室长的电脑必须开着,其他寝室同学只需要一张网卡,什么?你们寝室直接买路由器?好吧,暴露年龄了,2000年初的时候,路由器还是不普遍的,那就把Computer1和switch合在一起,想象成你们家的路由器,怎么理解?,把寝室想象成物理机,电脑就变成了虚拟机,室长的电脑或是路由器,每个电脑都插的switch,忽

11、略qbr,虚拟机直接连到switch上,怎么理解?,物理机分开,统一的br-int断开,如何连接,External Network,Private Network,Security Group,Tap Interface,Interconnection Network,Br-int分开了,在虚拟机眼里,还是同一个switch,至于物理机之间br-int怎么连在一起,虚拟机可不管。,Br-int之下,是物理机之间的互联,有各种方法,GRE, VLAN, VXLAN,更加深入:Tap Interface,virsh dumpxml instance-0000000c,更加深入:Tap Interf

12、ace,Tap/Tun Device 将guest system的网络和host system的网络连在一起 Tun/tap驱动程序中包含两个部分,一部分是字符设备驱动,还有一部分是网卡驱动部分,更加深入:Security Group Layer,iptables,1、首先数据包进入,先进入mangle表的PREROUTING链,在这里可以根据需要改变数据包头内容 2、之后进入nat表的PREROUTING链,在这里可以根据需要做DNAT,也就是目标地址转换 3、进入路由判断,判断是进入本地的还是转发的 1) 如果进入本地的话进入INPUT链,之后按条件过滤限制进入 之后进入本机,在进入OUT

13、PUT链,按条件过滤限制出去 离开本地 2) 如果是转发的话进入,进入FORWARD链,根据条件限制转发 之后进入POSTROUTING链,这里可以做SNAT 离开网络接口,更加深入:Security Group Layer,1)filter表主要处理过滤功能的 INPUT链:过滤所有目标地址是本机的数据包 FORWARD链:过滤所有路过本机的数据包 OUTPUT链:过滤所有由本机产生的数据包 2)nat表主要处理网络地址转换,可以进行SNAT(改变数据包的源地址),DNAT(改变数据包的目标地址) PREROUTING链:可以再数据包到达防火墙时改变目标地址 OUTPUT链:可以改变本地产生

14、的数据包的目标地址 POSTROUTING链:在数据包离开防火墙时改变数据包的源地址 3)mangle表修改数据包: 包含PREROUTING链,INPUT链,FORWARD链,OUTPUT链,POSTROUTING链 这里mangle不做过多操作 还有一个表示raw表的,不常用的 优先级rawmanglenatfilter raw最高,filter最低 iptables默认操作的是filter表,更加深入:Security Group Layer,iptables -nvL,更加深入:br-int & br-tun,由Openvswitch实现 Openvswitch是一个virutal s

15、witch, 支持Open Flow协议,当然也有一些硬件Switch也支持Open Flow协议,他们都可以被统一的Controller管理,从而实现物理机和虚拟机的网络联通。,更加深入: br-int & br-tun,Flow Table包含许多entry,每个entry是对packet进行处理的规则,Match Field涵盖TCP/IP协议各层: Layer 1 Tunnel ID, In Port, QoS priority, skb mark Layer 2 MAC address, VLAN ID, Ethernet type Layer 3 IPv4/IPv6 fields,

16、 ARP Layer 4 TCP/UDP, ICMP, ND Action也主要包含下面的操作: Output to port (port range, flood, mirror) Discard, Resubmit to table x Packet Mangling (Push/Pop VLAN header, TOS, .) Send to controller, Learn,更加深入: br-int & br-tun,更加深入: br-int & br-tun,更加深入: br-int & br-tun,/etc/openvswitch/conf.db,更加深入: br-int &

17、br-tun,br-int主要使用openvswitch中port的vlan功能 Port的一个重要的方面就是VLAN Configuration,有两种模式: trunk port 这个port不配置tag,配置trunks 如果trunks为空,则所有的VLAN都trunk,也就意味着对于所有的VLAN的包,本身带什么VLAN ID,就是携带者什么VLAN ID,如果没有设置VLAN,就属于VLAN 0,全部允许通过。 如果trunks不为空,则仅仅带着这些VLAN ID的包通过。 access port 这个port配置tag,从这个port进来的包会被打上这个tag 如果从其他的tru

18、nk port中进来的本身就带有VLAN ID的包,如果VLAN ID等于tag,则会从这个port发出 从其他的access port上来的包,如果tag相同,也会被forward到这个port 从access port发出的包不带VLAN ID 如果一个本身带VLAN ID的包到达access port,即便VLAN ID等于tag,也会被抛弃。,更加深入: br-int & br-tun,ovs-vsctl add-br ubuntu_brip link add first_br type veth peer name first_if ip link add second_br typ

19、e veth peer name second_if ip link add third_br type veth peer name third_ifovs-vsctl add-port ubuntu_br first_br ovs-vsctl add-port ubuntu_br second_br ovs-vsctl add-port ubuntu_br third_br ovs-vsctl set Port vnet0 tag=101 ovs-vsctl set Port vnet1 tag=102 ovs-vsctl set Port vnet2 tag=103 ovs-vsctl

20、set Port first_br tag=103 ovs-vsctl clear Port second_br tag ovs-vsctl set Port third_br trunks=101,102 需要监听ARP,所以禁止MAC地址学习 ovs-vsctl set bridge ubuntu_br flood-vlans=101,102,103,从192.168.100.102来ping 192.168.100.103,应该first_if和second_if能够收到包 从192.168.100.100在ping 192.168.100.105, 则second_if和third_i

21、f可以收到包 从192.168.100.101来ping 192.168.100.104, 则second_if和third_if可以收到包,更加深入: br-int & br-tun,br-tun主要使用openvswitch的tunnel功能和Flow功能 Openvswitch支持三类Tunnel gre vxlan ipsec_gre,ovs-vsctl add-br testbr ovs-vsctl add-port testbr gre0 - set Interface gre0 type=gre options:local_ip=192.168.100.100 options:r

22、emote_ip=192.168.100.101 ovs-vsctl add-port testbr vxlan0 - set Interface vxlan0 type=vxlan options:local_ip=192.168.100.100 options:remote_ip=192.168.100.102 ovs-vsctl add-port testbr ipsec0 - set Interface ipsec0 type=ipsec_gre options:local_ip=192.168.100.101 options:remote_ip=192.168.100.102 opt

23、ions:psk=password,更加深入: br-int & br-tun,对于Flow Table的管理,由ovs-ofctl来控制 addflow switch flow modflows switch flow delflows switch flow 主要控制两类 Match Field Actions,更加深入: br-int & br-tun,Match Field,更加深入: br-int & br-tun,Actions: output:port 和 output:NXM_NX_REG01631 enqueue:port:queue mod_vlan_vid:vlan_vi

24、d strip_vlan mod_dl_src:mac 和 mod_dl_dst:mac mod_nw_src:ip 和 mod_nw_dst:ip mod_tp_src:port 和 mod_tp_dst:port set_tunnel:id resubmit(port,table) move:srcstartenddststartend load:valuedststartend learn(argument,argument.),更加深入: br-int & br-tun,rootNetworkNodeCliu8:# ovs-ofctl dump-flows br-tun NXST_FL

25、OW reply (xid=0x4):/in_port=1是指包是从patch-int,也即是从虚拟机来的,所以是发送规则,跳转到table1 cookie=0x0, duration=73932.142s, table=0, n_packets=12, n_bytes=1476, idle_age=3380, hard_age=65534, priority=1,in_port=1 actions=resubmit(,1)/in_port=2是指包是从GRE来的,也即是从物理网络来的,所以是接收规则,跳转到table2 cookie=0x0, duration=73914.323s, tab

26、le=0, n_packets=9, n_bytes=1166, idle_age=3376, hard_age=65534, priority=1,in_port=2 actions=resubmit(,2) cookie=0x0, duration=73930.934s, table=0, n_packets=0, n_bytes=0, idle_age=65534, hard_age=65534, priority=0 actions=drop/multicast,跳转到table21 cookie=0x0, duration=73928.59s, table=1, n_packets=

27、6, n_bytes=468, idle_age=65534, hard_age=65534, priority=0,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,21)/unicast,跳转到table20 cookie=0x0, duration=73929.695s, table=1, n_packets=3, n_bytes=778, idle_age=3380, hard_age=65534, priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 acti

28、ons=resubmit(,20)/这是接收规则的延续,如果接收的tun_id=0x1则转换为本地的tag,mod_vlan_vid:1,跳转到table 10 cookie=0x0, duration=73906.864s, table=2, n_packets=9, n_bytes=1166, idle_age=3376, hard_age=65534, priority=1,tun_id=0x1 actions=mod_vlan_vid:1,resubmit(,10)cookie=0x0, duration=73927.542s, table=2, n_packets=0, n_byte

29、s=0, idle_age=65534, hard_age=65534, priority=0 actions=dropcookie=0x0, duration=73926.403s, table=3, n_packets=0, n_bytes=0, idle_age=65534, hard_age=65534, priority=0 actions=dropcookie=0x0, duration=73925.611s, table=10, n_packets=9, n_bytes=1166, idle_age=3376, hard_age=65534, priority=1 actions

30、=learn(table=20,hard_timeout=300,priority=1,NXM_OF_VLAN_TCI011,NXM_OF_ETH_DST=NXM_OF_ETH_SRC,load:0-NXM_OF_VLAN_TCI,load:NXM_NX_TUN_ID-NXM_NX_TUN_ID,output:NXM_OF_IN_PORT),output:1cookie=0x0, duration=73924.858s, table=20, n_packets=0, n_bytes=0, idle_age=65534, hard_age=65534, priority=0 actions=re

31、submit(,21)/这是发送规则的延续,如果接收到的dl_vlan=1,则转换为物理网络的segmentid=1,set_tunnel:0x1 cookie=0x0, duration=73907.657s, table=21, n_packets=0, n_bytes=0, idle_age=65534, hard_age=65534, priority=1,dl_vlan=1 actions=strip_vlan,set_tunnel:0x1,output:2cookie=0x0, duration=73924.117s, table=21, n_packets=6, n_bytes=

32、468, idle_age=65534, hard_age=65534, priority=0 actions=drop,更加深入: br-int & br-tun,ovs-ofctl show br-tun查看port id,更加深入: br-int & br-tun,配置Flow 删除所有的FlowTable 0 从port 1进来的,由table 1处理从port 2/3进来的,由Table 3处理默认丢弃,ovs-ofctl del-flows br-tun,ovs-ofctl add-flow br-tun “hard_timeout=0 idle_timeout=0 priorit

33、y=1 in_port=1 actions=resubmit(,1)“,ovs-ofctl add-flow br-tun “hard_timeout=0 idle_timeout=0 priority=1 in_port=2 actions=resubmit(,3)“ ovs-ofctl add-flow br-tun “hard_timeout=0 idle_timeout=0 priority=1 in_port=3 actions=resubmit(,3)“,ovs-ofctl add-flow br-tun “hard_timeout=0 idle_timeout=0 priorit

34、y=0 actions=drop“,更加深入: br-int & br-tun,Table 1: 对于单播,由table 20处理对于多播,由table 21处理Table 2: 默认丢弃,ovs-ofctl add-flow br-tun “hard_timeout=0 idle_timeout=0 priority=1 table=1 dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,20)“,ovs-ofctl add-flow br-tun “hard_timeout=0 idle_timeout=0 priori

35、ty=1 table=1 dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,21)“,ovs-ofctl add-flow br-tun “hard_timeout=0 idle_timeout=0 priority=0 table=2 actions=drop“,更加深入: br-int & br-tun,Table 3: 默认丢弃Tunnel ID - VLAN IDTable 10: MAC地址学习,ovs-ofctl add-flow br-tun “hard_timeout=0 idle_timeout=0 pr

36、iority=0 table=3 actions=drop“,ovs-ofctl add-flow br-tun “hard_timeout=0 idle_timeout=0 priority=1 table=3 tun_id=0x1 actions=mod_vlan_vid:1,resubmit(,10)“ ovs-ofctl add-flow br-tun “hard_timeout=0 idle_timeout=0 priority=1 table=3 tun_id=0x2 actions=mod_vlan_vid:2,resubmit(,10)“,ovs-ofctl add-flow

37、br-tun “hard_timeout=0 idle_timeout=0 priority=1 table=10 actions=learn(table=20,priority=1,hard_timeout=300,NXM_OF_VLAN_TCI011,NXM_OF_ETH_DST=NXM_OF_ETH_SRC,load:0-NXM_OF_VLAN_TCI,load:NXM_NX_TUN_ID-NXM_NX_TUN_ID,output:NXM_OF_IN_PORT),output:1“,table=10, priority=1 actions=learn( table=20, hard_ti

38、meout=300,priority=1, NXM_OF_VLAN_TCI011, NXM_OF_ETH_DST=NXM_OF_ETH_SRC, load:0-NXM_OF_VLAN_TCI, load:NXM_NX_TUN_ID-NXM_NX_TUN_ID, output:NXM_OF_IN_PORT), output:1,table=20, priority=2, dl_vlan=1, dl_dst=fa:16:3e:7e:ab:cc actions= strip_vlan, set_tunnel:0x3e9, output:2,Table 10是用来学习MAC地址的,学习的结果放在Tab

39、le 20里面,Table20被称为MAC learning table NXM_OF_VLAN_TCI这个是VLAN Tag,在MAC Learning table中,每一个entry都是仅仅对某一个VLAN来说的,不同VLAN的learning table是分开的。在学习的结果的entry中,会标出这个entry是对于哪个VLAN的。 NXM_OF_ETH_DST=NXM_OF_ETH_SRC这个的意思是当前包里面的MAC Source Address会被放在学习结果的entry里面的dl_dst里面。这是因为每个switch都是通过Ingress包来学习,某个MAC从某个port进来,s

40、witch就应该记住以后发往这个MAC的包要从这个port出去,因而MAC source address就被放在了Mac destination address里面,因为这是为发送用的。 load:0-NXM_OF_VLAN_TCI意思是发送出去的时候,vlan tag设为0,所以结果中有actions=strip_vlan load:NXM_NX_TUN_ID-NXM_NX_TUN_ID意思是发出去的时候,设置tunnel id,进来的时候是多少,发送的时候就是多少,所以结果中有set_tunnel:0x3e9 output:NXM_OF_IN_PORT意思是发送给哪个port,由于是从po

41、rt2进来的,因而结果中有output:2,学习指令,学习结果,更加深入: br-int & br-tun,Table 20: 这个是MAC Address Learning Table,如果不空就按照规则处理 如果为空,就使用默认规则,交给Table 21处理Table 21: 默认丢弃VLAN ID - Tunnel ID,ovs-ofctl add-flow br-tun “hard_timeout=0 idle_timeout=0 priority=0 table=20 actions=resubmit(,21)“,ovs-ofctl add-flow br-tun “hard_tim

42、eout=0 idle_timeout=0 priority=0 table=21 actions=drop“,ovs-ofctl add-flow br-tun “hard_timeout=0 idle_timeout=0 priority=1 table=21 dl_vlan=1 actions=strip_vlan,set_tunnel:0x1,output:2,output:3“ ovs-ofctl add-flow br-tun “hard_timeout=0 idle_timeout=0 priority=1 table=21 dl_vlan=2 actions=strip_vla

43、n,set_tunnel:0x2,output:2,output:3“,更加深入: br-int & br-tun,Flow Table可以debug ovs-appctl ofproto/trace helloworld in_port=1,dl_vlan=30,dl_src=10:00:00:00:00:01,dl_dst=20:00:00:00:00:01 -generate,更加深入:DHCP Server,ps aux | grep dns,nobody 6910 0.0 0.0 28204 1080 ? S Oct15 0:06 dnsmasq -no-hosts -no-reso

44、lv -strict-order -bind-interfaces -interface=tap7c15f5a3-61 -except-interface=lo -pid-file=/var/lib/neutron/dhcp/c27610cb-4a60-41ec-bd9d-3cd732f42cd6/pid -dhcp-hostsfile=/var/lib/neutron/dhcp/c27610cb-4a60-41ec-bd9d-3cd732f42cd6/host -addn-hosts=/var/lib/neutron/dhcp/c27610cb-4a60-41ec-bd9d-3cd732f4

45、2cd6/addn_hosts -dhcp-optsfile=/var/lib/neutron/dhcp/c27610cb-4a60-41ec-bd9d-3cd732f42cd6/opts -leasefile-ro -dhcp-range=set:tag0,10.10.10.0,static,86400s -dhcp-lease-max=256 -conf-file= -domain=openstacklocal,#cat /var/lib/neutron/dhcp/c27610cb-4a60-41ec-bd9d-3cd732f42cd6/host fa:16:3e:26:e5:e5,hos

46、t-10-10-10-1.openstacklocal,10.10.10.1 fa:16:3e:be:40:73,host-10-10-10-5.openstacklocal,10.10.10.5 fa:16:3e:3c:92:1e,host-10-10-10-8.openstacklocal,10.10.10.8,更加深入:Router,使用namespace中的routing tableFloating IP使用namespace中的iptables的nat,ip netns exec qrouter-5a74908c-712c-485c-aa9f-6c1e8b57e3e1 route -

47、n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 16.158.164.1 0.0.0.0 UG 0 0 0 qg-52de6441-db 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 qr-e0967604-78 16.158.164.0 0.0.0.0 255.255.252.0 U 0 0 0 qg-52de6441-db,ip netns exec qrouter-5a74908c-712c-485c-aa9f-6c1e8b57

48、e3e1 iptables -t nat -nvL,更加深入:br-ex,将namespace中的网络和namespace外的网络连接起来,虚拟机网络问题调试,1. Security Group全部打开,这是最基本的,但是很多人容易忘记,虚拟机网络问题调试,2. 通过界面查看虚拟机的log,也可以在compute节点上查看console.log文件,看看里面是否有DHCP获取IP成功的日志,/var/lib/nova/instances/6323a941-de10-4ed3-9e2f-1b2b25e79b66/console.log,如果没有日志,则说明image有问题 在grub里面 lin

49、ux /boot/vmlinuz-3.2.0-49-virtual root=UUID=6d2231e4-0975-4f35-a94f-56738c1a8150 ro console=ttyS0GRUB_CMDLINE_LINUX_DEFAULT=“console=ttyS0“update-grub,虚拟机网络问题调试,3. 如果虚拟机连不上DHCP Server,则需要准备一个不使用metadata server,而是用用户名密码可以登录的image,虚拟机网络问题调试,4. 通过VNC登录,虚拟机网络问题调试,5. 如果VNC登录不进去,方法一配置VNC,虚拟机网络问题调试,VNC Proxy的功能: 将公网(public network)和私网(private network)隔离 VNC client运行在公网上,VNCServer运行在私网上,VNC Proxy作为中间的桥梁将二者连接起来 VNC Proxy通过token对VNC Client进行验证 VNC Proxy不仅仅使得私网的访问更加安全,而且将具体的VNC Server的实现分离,可以支持不同Hypervisor的VNC Server但不影响用户体验,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报