跳转到: 导航, 搜索

已废弃:Neutron/FakeVM

(重定向自 Neutron/FakeVM)

概述

FakeVM 为 Neutron 提供测试环境,无需 Nova(nova libvirt vif 驱动除外)。
通过此方法,我们可以模拟创建/删除/迁移 VM 端口,并对网络设备执行 ping 操作等。
除此之外,FakeVM 可以在单个主机上模拟多计算节点。
(但是,由于接口名称冲突,无法模拟迁移)


设置

像往常一样设置 Neutron(及其代理)。并运行 neutron-fakevm-agent。


命令

neutron-fakevm <命令> [选项] [参数]

选项

--host <主机名>:要操作的主机名

命令

create-port <网络 ID> <实例 ID>
创建 Neutron 端口并在指定主机上连接 vif

delete-port <vif-uuid>
断开 vif 连接并删除 Neutron 端口

migrate <目标主机> <vif-uuid>
将 vif 从通过 --host 选项指定的主机迁移到目标主机

plug <vif-uuid>
在指定主机上连接 vif

unplug <vif-uuid>
在指定主机上断开 vif 连接

unplug-all-host <vif-uuid>
断开所有主机上的 vif 连接

exec <vif-uuid> 命令
为 <vif-uuid> 执行命令

配置

neutron-fakevm-agent 有一些配置参数。
这些参数属于 [fakevm] 组。

通用参数

host = <主机名>
运行代理的主机名称。

fakevm_agent_plugin = <插件模块>
与 Neutron 插件对应的 FakeVM Agent Plugin 类。
有三个插件。

linuxbridge 插件:neutron.debug.fakevm.plugins.linuxbridge.NeutronFakeVMAgentLB

Open vSwitch 插件:neutron.debug.fakevm.plugins.openvswitch.NeutronFakeVMAgentOVS

Ryu 插件:neutron.debug.fakevm.plugins.ryu.NeutronFakeVMAgentRyu

vif_wrapper = <路径>
FakeVM VIF Wrapper 的路径。
例如,对于 devstack 环境,'/opt/stack/neutron/neutron/debug/fakevm/vif.py'。

nova_conf = <路径>
nova.conf 的路径。FakeVM 的 vif wrapper 使用它。
默认值为 /etc/nova/nova.conf。

以下参数将被使用。
libvirt_vif_driver = <vif 驱动程序>
libvirt_type = <kvm|qemu>
libvirt_use_virtio_for_bridges = <True|False>
firewall_driver = <防火墙驱动程序>

enable_multi_node_emulate = <True|False>
启用多节点模拟。默认值为 False。

对于 OVS 和 Ryu 插件

vir_bridge = <名称>
用于多节点模拟 VLAN 模式的桥接器名称。

use_tunnel = <True|False>
是否使用隧道。当 Neutron OVS 插件的隧道功能启用时,设置为 True。默认值为 False。

仅 OVS 插件

tunnel_interface = <名称>
启用 use_tunnel 时使用的隧道接口。


限制

模拟实时迁移

为了模拟实时迁移,需要两个主机。这是由于网络接口名称冲突造成的。在 Linux 上,网络接口名称限制为 14 个字节左右。

模拟多计算节点

  • linuxbridge

目前,FakeVM linuxbridge 插件不支持多节点模拟。这是由于桥接器名称冲突造成的。桥接器名称由前缀“brq”和网络 ID 组成。前缀是静态定义的,网络 ID 是唯一的。因此,我们无法避免冲突。

  • Open vSwitch 和 Ryu

目前,需要修改 Open vSwitch 才能使用多节点模拟的隧道模式。
有关详细信息,请参阅以下 URL
http://openvswitch.org/pipermail/dev/2013-June/028943.html


结构

在 FakeVM 代理中,有两个函数。一个是创建探测接口,另一个是模拟主机上的多个计算节点环境。每个 FakeVM 代理插件的实现方式不同。

探测接口

  • Open vSwitch/Ryu

nova vif 驱动程序为端口创建一个 veth 和 linux 桥接器。veth 的一个接口连接到 br-int,另一个接口连接到 linux 桥接器。FakeVM 代理插件创建一个额外的 veth,并将一个接口连接到桥接器,另一个接口用作探测接口。代理插件还为探测接口创建一个命名空间,以分隔每个探测。

   +----------+
   |          |
   |  br-int  |
   |          |
   +---[qvo]--+
         |               .... ns = fakevm-<HOST>-<PORT-ID> ...
         |               :
 +-----[qvb]------+      :
 |                |      :
 |  qbr<PORT-ID> [qfb]-----[qfv]
 |                |      :
 +----------------+      :
                         :
  • linuxbridge

Neutron linuxbridge 插件代理处理名称以“tap”开头的接口。因此,探测接口的名称必须以“tap”开头。FakeVM 代理插件创建一个以“tap”开头的接口的 veth。该接口连接到 Neutron 网络的桥接器。另一个用作探测接口。

                           .... ns = fakevm-<HOST>-<PORT-ID> ...
 +-------------------+     :
 |                   |     :
 |  brq<NETWORK-ID> [tap]-----[qfv]
 |                   |     :
 +-------------------+     :

多节点模拟

  • Open vSwitch

有两种模式:VLAN 和隧道。在 VLAN 模式下,每个主机的 OVS 桥接器通过桥接器连接。当使用提供商网络时,为每个物理网络创建一个 Linux 桥接器。

 +-------------------+  +-------------------+
 |                   |  |                   |
 |      br-int1      |  |      br-int2      |
 |                   |  |                   |
 +--[int-<PHY-BR1>]--+  +--[int-<PHY-BR2>]--+
           |                      |
           |                      |
 +--[phy-<PHY-BR1>]--+  +--[phy-<PHY-BR2>]--+
 |                   |  |                   |
 |      PHY-BR1      |  |      PHY-BR2      |
 |                   |  |                   |
 +--[qfo<PHY-BR1>]---+  +---[qfo<PHY-BR2>]--+
            |                    |
            |                    |
    +--[qfb<PHY-BR1>]----[qfb<PHY-BR2>]--+
    |                                    |
    |           bfv-<PHY-NET1>           |
    |                                    |
    +------------------------------------+

br-int1 用于主机 1,br-int2 用于主机 2。
在 host1 上,bridge_mappings 配置为 <PHY-NET1>:<PHY-BR1>。
在 host2 上,bridge_mappings 配置为 <PHY-NET1>:<PHY-BR2>。

在隧道模式下,为每个主机创建虚拟接口,并将隧道 IP 地址分配给该接口。

注意:要使用隧道模式,需要修改 Open vSwitch。请参阅上面的“限制”部分。

  • linuxbridge

FakeVM 代理 linuxbridge 插件现在不支持多节点模拟。因为 Neutron linuxbridge 插件创建的桥接器名称冲突。桥接器名称由前缀“brq”和网络 ID 组成。前缀是静态定义的,网络 ID 是唯一的。因此,我们无法避免冲突。

  • Ryu

模式与 OVS 类似。VLAN 模式比 OVS 简单,因为 Neutron Ryu 插件尚不支持提供商网络。它只是通过桥接器连接每个 OVS 桥接器。

 +-------------------+  +-------------------+
 |                   |  |                   |
 |      br-int1      |  |      br-int2      |
 |                   |  |                   |
 +----[qfo<HOST1>]---+  +---[qfo<HOST2>]----+
           |                      |
           |                      |
    +--[qfb<HOST1>]--------[qfb<HOST2>]--+
    |                                    |
    |             br-fakevm              |
    |                                    |
    +------------------------------------+

隧道模式与 OVS 相同。


示例

单节点,创建端口并从探测接口 ping

使用 devstack 设置。

localrc

   # only runs keystone and neutron. other components are not necessary
   ENABLED_SERVICES=""  # disable all of default enabled services
   enable_service rabbit
   enable_service key
   enable_service mysql
   enable_service neutron
   enable_service q-agt
   enable_service q-l3
   enable_service q-dhcp
   enable_service q-svc
   # q-meta makes sense only with nova
   # plus your neutron plugin settings...
   
   Q_PLUGIN=openvswitch
   ENABLE_TENANT_TUNNELS=False
   ENABLE_TENANT_VLANS=True
   PHYSICAL_NETWORK=phy1
   TENANT_VLAN_RANGE=200:300
   OVS_PHYSICAL_BRIDGE=br-eth1
   
   # And necessary parameters...

运行 devstack,然后启动 fakevm 代理。

fakevm.ini

   [default]
   debug = True
   verbose = True
   
   [fakevm]
   host = guest1
   vif_wrapper = /opt/stack/neutron/neutron/debug/fakevm/vif.py
   nova_conf = /etc/nova/nova.conf
   fakevm_agent_plugin = neutron.debug.fakevm.fakevm_agent_ovs.NeutronFakeVMAgentOVS
   enable_multi_node_emulate = False
 $ neutron-fakevm-agent --config-file /etc/neutron/neutron.conf \
 --config-file /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini \
 --config-file ./fakevm.ini

然后创建端口。

 $ . ./openrc admin demo
 $ neutron net-list
 +--------------------------------------+---------+-------------------------------------------------------+
 | id                                   | name    | subnets                                               |
 +--------------------------------------+---------+-------------------------------------------------------+
 | 18f725c7-dd56-42ba-975d-e444152a0377 | public  | 76d5e916-2353-4025-a61a-2e5ca8a15708 192.168.100.0/24 |
 | 5379c0d2-9a0d-4bc5-a028-a0c0c7df336d | private | ee138a17-cdf4-436f-b651-0245201ea71e 10.0.0.0/24      |
 +--------------------------------------+---------+-------------------------------------------------------+
 $ 
 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 create-port --host guest1 5379c0d2-9a0d-4bc5-a028-a0c0c7df336d i-xxxx
 :::
 VM port created on guest1: vif_uuid: d7e577a9-a9cd-46a4-870c-2754641e6b87 mac: fa:16:3e:87:e6:4f tenant_id: 43dd8e1496104939bca6256edf874661
 fixed_ips: [{u'subnet_id': u'ee138a17-cdf4-436f-b651-0245201ea71e', u'ip_address': u'10.0.0.3'}]
 netowrk: {u'status': u'ACTIVE', u'subnets': [u'ee138a17-cdf4-436f-b651-0245201ea71e'], u'name': u'private', u'provider:physical_network': u'phy1', u'admin_state_up': True, u'tenant_id': u'43dd8e1496104939bca6256edf874661', u'provider:network_type': u'vlan', u'router:external': False, u'shared': False, u'id': u'5379c0d2-9a0d-4bc5-a028-a0c0c7df336d', u'provider:segmentation_id': 200}
 $ 
 $ neutron port-list
 +--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
 | id                                   | name | mac_address       | fixed_ips                                                                            |
 +--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
 | 4c12d56c-83fd-4b8e-8ad9-7b5823259e7d |      | fa:16:3e:07:5e:3e | {"subnet_id": "ee138a17-cdf4-436f-b651-0245201ea71e", "ip_address": "10.0.0.2"}      |
 | 9ffdbffd-e8eb-4ae2-ad86-d0ca50303251 |      | fa:16:3e:34:55:5e | {"subnet_id": "76d5e916-2353-4025-a61a-2e5ca8a15708", "ip_address": "192.168.100.2"} |
 | b167fd32-3d4d-4a21-911e-230aa245bf32 |      | fa:16:3e:bb:91:68 | {"subnet_id": "ee138a17-cdf4-436f-b651-0245201ea71e", "ip_address": "10.0.0.1"}      |
 | d7e577a9-a9cd-46a4-870c-2754641e6b87 |      | fa:16:3e:87:e6:4f | {"subnet_id": "ee138a17-cdf4-436f-b651-0245201ea71e", "ip_address": "10.0.0.3"}      |
 +--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
 $ 

使用 dhclient 为探测接口分配 IP 地址。

 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 exec --host guest1 d7e577a9-a9cd-46a4-870c-2754641e6b87 "ip link"
 :::
 VM port executeon guest1: d7e577a9-a9cd-46a4-870c-2754641e6b87 ip link
 19: qfvd7e577a9-a: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
     link/ether fa:16:3e:87:e6:4f brd ff:ff:ff:ff:ff:ff
 21: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 
 $ 
 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 exec --host guest1 d7e577a9-a9cd-46a4-870c-2754641e6b87 "dhclient -4 -v qfvd7e577a9-a"
 :::
 VM port executeon guest1: d7e577a9-a9cd-46a4-870c-2754641e6b87 dhclient -4 -v qfvd7e577a9-a
 
 $ 
 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 exec --host guest1 d7e577a9-a9cd-46a4-870c-2754641e6b87 "ifconfig"
 :::
 VM port executeon guest1: d7e577a9-a9cd-46a4-870c-2754641e6b87 ifconfig
 lo        Link encap:Local Loopback  
           inet addr:127.0.0.1  Mask:255.0.0.0
           inet6 addr: ::1/128 Scope:Host
           UP LOOPBACK RUNNING  MTU:16436  Metric:1
           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0 
           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
 
 qfvd7e577a9-a Link encap:Ethernet  HWaddr fa:16:3e:87:e6:4f  
           inet addr:10.0.0.3  Bcast:10.0.0.255  Mask:255.255.255.0
           inet6 addr: fe80::f816:3eff:fe87:e64f/64 Scope:Link
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:20 errors:0 dropped:0 overruns:0 frame:0
           TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:1000 
           RX bytes:2304 (2.3 KB)  TX bytes:1528 (1.5 KB)

从探测接口 ping Neutron 网络上的 DHCP 端口。

 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 exec --host guest1 d7e577a9-a9cd-46a4-870c-2754641e6b87 "ping -c1 10.0.0.2"
 :::
 VM port executeon guest1: d7e577a9-a9cd-46a4-870c-2754641e6b87 ping -c1 10.0.0.2
 
 PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
 64 bytes from 10.0.0.2: icmp_req=1 ttl=64 time=44.1 ms
 
 --- 10.0.0.2 ping statistics ---
 1 packets transmitted, 1 received, 0% packet loss, time 0ms
 rtt min/avg/max/mdev = 44.159/44.159/44.159/0.000 ms
 
 $ 

多节点并模拟实时迁移

在另一个物理主机上,运行 FakeVM 代理和 Neutron 插件代理。

fakevm.ini

   [default]
   debug = True
   verbose = True
   
   [fakevm]
   host = guest2
   vif_wrapper = /opt/stack/neutron/neutron/debug/fakevm/vif.py
   nova_conf = /etc/nova/nova.conf
   fakevm_agent_plugin = neutron.debug.fakevm.fakevm_agent_ovs.NeutronFakeVMAgentOVS
   enable_multi_node_emulate = False
 $ neutron-fakevm-agent --config-file /etc/neutron/neutron.conf \
 --config-file /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini \
 --config-file ./fakevm.ini
 $ sudo ovs-vsctl add-br br-int
 $ sudo ovs-vsctl add-br br-eth1
 $ sudo ovs-vsctl add-port br-eth1 eth1
 $ neutron-openvswitch-agent --debug --verbose \
 --config-file /etc/neutron/neutron.conf \
 --config-file /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini

然后在原始节点上操作。

 $ sudo ovs-vsctl add-port br-eth1 eth1
 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 create-port --host guest2 5379c0d2-9a0d-4bc5-a028-a0c0c7df336d i-yyyy
 :::
 VM port created on guest2: vif_uuid: 418874ff-571b-46e2-a28a-75fe8afcb9e1 mac: fa:16:3e:c8:c0:34 tenant_id: 43dd8e1496104939bca6256edf874661
 fixed_ips: [{u'subnet_id': u'ee138a17-cdf4-436f-b651-0245201ea71e', u'ip_address': u'10.0.0.4'}]
 netowrk: {u'status': u'ACTIVE', u'subnets': [u'ee138a17-cdf4-436f-b651-0245201ea71e'], u'name': u'private', u'provider:physical_network': u'phy1', u'admin_state_up': True, u'tenant_id': u'43dd8e1496104939bca6256edf874661', u'provider:network_type': u'vlan', u'router:external': False, u'shared': False, u'id': u'5379c0d2-9a0d-4bc5-a028-a0c0c7df336d', u'provider:segmentation_id': 200}
 $ 
 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 exec --host guest2 418874ff-571b-46e2-a28a-75fe8afcb9e1 "ip link"
 :::
 VM port executeon guest2: 418874ff-571b-46e2-a28a-75fe8afcb9e1 ip link
 17: qfv418874ff-5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
     link/ether fa:16:3e:c8:c0:34 brd ff:ff:ff:ff:ff:ff
 19: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 
 $ 
 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 exec --host guest2 418874ff-571b-46e2-a28a-75fe8afcb9e1 "dhclient -4 -v qfv418874ff-5"
 :::
 VM port executeon guest2: 418874ff-571b-46e2-a28a-75fe8afcb9e1 dhclient -4 -v qfv418874ff-5
 
 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 exec --host guest2 418874ff-571b-46e2-a28a-75fe8afcb9e1 "ifconfig"
 :::
 VM port executeon guest2: 418874ff-571b-46e2-a28a-75fe8afcb9e1 ifconfig
 lo        Link encap:Local Loopback  
           inet addr:127.0.0.1  Mask:255.0.0.0
           inet6 addr: ::1/128 Scope:Host
           UP LOOPBACK RUNNING  MTU:16436  Metric:1
           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0 
           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
 
 qfv418874ff-5 Link encap:Ethernet  HWaddr fa:16:3e:c8:c0:34  
           inet addr:10.0.0.4  Bcast:10.0.0.255  Mask:255.255.255.0
           inet6 addr: fe80::f816:3eff:fec8:c034/64 Scope:Link
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:22 errors:0 dropped:0 overruns:0 frame:0
           TX packets:15 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:1000 
           RX bytes:2130 (2.1 KB)  TX bytes:2734 (2.7 KB)
 
 
 $ 

从另一个节点 ping 到原始节点。

 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 exec --host guest2 418874ff-571b-46e2-a28a-75fe8afcb9e1 "ping -c1 10.0.0.3"
 :::
 VM port executeon guest2: 418874ff-571b-46e2-a28a-75fe8afcb9e1 ping -c1 10.0.0.3
 
 PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
 64 bytes from 10.0.0.3: icmp_req=1 ttl=64 time=10.9 ms
 
 --- 10.0.0.3 ping statistics ---
 1 packets transmitted, 1 received, 0% packet loss, time 0ms
 rtt min/avg/max/mdev = 10.921/10.921/10.921/0.000 ms
 
 $ 

然后尝试模拟实时迁移

 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 exec --host guest2 418874ff-571b-46e2-a28a-75fe8afcb9e1 "dhclient -4 -r qfv418874ff-5"
 :::
 VM port executeon guest2: 418874ff-571b-46e2-a28a-75fe8afcb9e1 dhclient -4 -r qfv418874ff-5
 
 $ 
 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 migrate --host guest2 guest1 418874ff-571b-46e2-a28a-75fe8afcb9e1
 :::
 VM migrate : 418874ff-571b-46e2-a28a-75fe8afcb9e1 guest2 -> guest1
 $ 
 $ ip link|grep qvo
 17: qvod7e577a9-a9: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
 32: qvo418874ff-57: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
 $ 

多节点模拟

在原始主机上,修改配置以启用多节点模式并重新启动 FakeVM 代理。

fakevm.ini

   [default]
   debug = True
   verbose = True
   
   [fakevm]
   host = guest1
   vif_wrapper = /opt/stack/neutron/neutron/debug/fakevm/vif.py
   nova_conf = /etc/nova/nova.conf
   fakevm_agent_plugin = neutron.debug.fakevm.fakevm_agent_ovs.NeutronFakeVMAgentOVS
   enable_multi_node_emulate = True
   use_tunnel = False
   vir_bridge = br-fakevm
 $ neutron-fakevm-agent --config-file /etc/neutron/neutron.conf \
 --config-file /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini \
 --config-file ./fakevm.ini

在同一台机器上使用不同的配置运行 Neutron 插件代理和 FakeVM 代理。

guest3.ini

   [ovs]
   integration_bridge = br-int2
   bridge_mappings = phy1:br-eth2
   
   [fakevm]
   host = guest3
 $ neutron-fakevm-agent --config-file /etc/neutron/neutron.conf \
 --config-file /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini \
 --config-file ./fakevm.ini --config-file ./guest3.ini
 $ neutron-openvswitch-agent --debug --verbose \
 --config-file /etc/neutron/neutron.conf \
 --config-file /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini \
 --config-file ./guest3.ini

然后在模拟节点上创建一个端口。

 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 create-port --host guest3 5379c0d2-9a0d-4bc5-a028-a0c0c7df336d i-zzzz
 :::
 VM port created on guest3: vif_uuid: c29cfc8c-c978-4025-8fa9-0a6c791bb31b mac: fa:16:3e:fc:f8:3e tenant_id: 43dd8e1496104939bca6256edf874661
 fixed_ips: [{u'subnet_id': u'ee138a17-cdf4-436f-b651-0245201ea71e', u'ip_address': u'10.0.0.5'}]
 netowrk: {u'status': u'ACTIVE', u'subnets': [u'ee138a17-cdf4-436f-b651-0245201ea71e'], u'name': u'private', u'provider:physical_network': u'phy1', u'admin_state_up': True, u'tenant_id': u'43dd8e1496104939bca6256edf874661', u'provider:network_type': u'vlan', u'router:external': False, u'shared': False, u'id': u'5379c0d2-9a0d-4bc5-a028-a0c0c7df336d', u'provider:segmentation_id': 200}
 $ 
 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 exec --host guest3 c29cfc8c-c978-4025-8fa9-0a6c791bb31b "ip link"
 :::
 VM port executeon guest3: c29cfc8c-c978-4025-8fa9-0a6c791bb31b ip link
 49: qfvc29cfc8c-c: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
     link/ether fa:16:3e:fc:f8:3e brd ff:ff:ff:ff:ff:ff
 51: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 
 $ 
 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 exec --host guest3 c29cfc8c-c978-4025-8fa9-0a6c791bb31b "dhclient -4 -v qfvc29cfc8c-c"
 :::
 VM port executeon guest3: c29cfc8c-c978-4025-8fa9-0a6c791bb31b dhclient -4 -v qfvc29cfc8c-c
 
 $ 
 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 exec --host guest3 c29cfc8c-c978-4025-8fa9-0a6c791bb31b "ifconfig"
 :::
 VM port executeon guest3: c29cfc8c-c978-4025-8fa9-0a6c791bb31b ifconfig
 lo        Link encap:Local Loopback  
           inet addr:127.0.0.1  Mask:255.0.0.0
           inet6 addr: ::1/128 Scope:Host
           UP LOOPBACK RUNNING  MTU:16436  Metric:1
           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0 
           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
 
 qfvc29cfc8c-c Link encap:Ethernet  HWaddr fa:16:3e:fc:f8:3e  
           inet addr:10.0.0.5  Bcast:10.0.0.255  Mask:255.255.255.0
           inet6 addr: fe80::f816:3eff:fefc:f83e/64 Scope:Link
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:21 errors:0 dropped:0 overruns:0 frame:0
           TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:1000 
           RX bytes:2076 (2.0 KB)  TX bytes:1272 (1.2 KB)
 
 
 $ 

从模拟节点 ping 到原始节点。

 $ neutron-fakevm --config-file /etc/neutron/neutron.conf \
 exec --host guest3 c29cfc8c-c978-4025-8fa9-0a6c791bb31b "ping -c1 10.0.0.3"
 :::
 VM port executeon guest3: c29cfc8c-c978-4025-8fa9-0a6c791bb31b ping -c1 10.0.0.3
 
 PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
 64 bytes from 10.0.0.3: icmp_req=1 ttl=64 time=11.8 ms
 
 --- 10.0.0.3 ping statistics ---
 1 packets transmitted, 1 received, 0% packet loss, time 0ms
 rtt min/avg/max/mdev = 11.899/11.899/11.899/0.000 ms
 
 $