虚拟机创建流程中neutron代码分析(三)


前言:

当neutron-server创建了port信息,将port信息写入数据库中。流程返回到nova服务端,接着nova创建的流程继续走。在计算节点中neutron-agent同样要完成很多的工作来支持主机的通信。

简要流程:

详细代码分析:

spawn()作用:

  1. 准备磁盘信息
  2. 获取镜像的获取路径
  3. 准备启动xml文件
  4. 创建主机和网络,调用create_domain_and_network()函数获取网络信息。

准备启动xml文件的过程稍后有详细分析。

create_domin_and_network()

作用:

创建虚拟机过程中neutron工作主要体现的地方,详细的说明在下面的截图中。主要的工作是创建调用底层驱动libvirt创建虚拟机。

 -------------------------------------------------------------------------------------------------nova创建xml文件-------------------------------------------------------------------------

xml文件如下所示,其中定义了主机必要信息如mac地址,内核,磁盘,分区信息,网卡等。

  1 'qemu' id='3'>  
  2       instance-00000002  
  3       8d812f63-573c-4f2c-a991-dfa68b844d20  
  4         
  5         "http://openstack.org/xmlns/libvirt/nova/1.0">  
  6           "13.1.0-1.el7"/>  
  7           myInstanceWithVolume  
  8           2016-08-19 03:17:58  
  9           "m1.small">  
 10             2048  
 11             20  
 12             0  
 13             0  
 14             1  
 15             
 16             
 17             "6383b14b190d422ab3079e4e63c62e16">demo  
 18             "478a18506673406db8abc360cdc2f202">demo  
 19             
 20           "image" uuid="9bf97139-7760-4ace-b3d1-5bcd0ff30f55"/>  
 21           
 22         
 23       'KiB'>2097152  
 24       'KiB'>2097152  
 25       'static'>1  
 26         
 27         1024  
 28         
 29         
 30         /machine  
 31         
 32       'smbios'>  
 33           
 34           'manufacturer'>Fedora Project  
 35           'product'>OpenStack Nova  
 36           'version'>13.1.0-1.el7  
 37           'serial'>acb2b380-0bb5-7101-f93d-107563ca227e  
 38           'uuid'>8d812f63-573c-4f2c-a991-dfa68b844d20  
 39           'family'>Virtual Machine  
 40           
 41         
 42         
 43         'x86_64' machine='pc-i440fx-rhel7.0.0'>hvm  
 44         'hd'/>  
 45         'sysinfo'/>  
 46         
 47         
 48           
 49           
 50         
 51       'host-model'>  
 52         'allow'/>  
 53         '1' cores='1' threads='1'/>  
 54         
 55       'utc'/>  
 56       destroy  
 57       restart  
 58       destroy  
 59         
 60         /usr/libexec/qemu-kvm  
 61         'file' device='disk'>  
 62           'qemu' type='qcow2' cache='none'/>  
 63           '/var/lib/nova/instances/8d812f63-573c-4f2c-a991-dfa68b844d20/disk'/>  
 64           'file' index='1'>  
 65             'raw'/>  
 66             '/var/lib/nova/instances/_base/86f82a7c75893f6ce52678cc7f7991aecc4aa9aa'/>  
 67               
 68             
 69           'vda' bus='virtio'/>  
 70           'virtio-disk0'/>  
 71           
'pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> 72 73 'block' device='disk'> 74 'qemu' type='raw' cache='none' io='native'/> 75 '/dev/disk/by-path/ip-192.168.8.8:3260-iscsi-iqn.2010-10.org.openstack:volume-13db53ea-475b-471d-bbb1-a0daffbf25ef-lun-0'/> 76 77 'vdb' bus='virtio'/> 78 13db53ea-475b-471d-bbb1-a0daffbf25ef 79 'virtio-disk1'/> 80
'pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> 81 82 'usb' index='0'> 83 'usb'/> 84
'pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> 85 86 'pci' index='0' model='pci-root'> 87 'pci.0'/> 88 89 'file'> 90 '/var/lib/nova/instances/8d812f63-573c-4f2c-a991-dfa68b844d20/console.log'/> 91 '0'/> 92 'serial0'/> 93 94 'pty'> 95 '/dev/pts/3'/> 96 '1'/> 97 'serial1'/> 98 99 'file'> 100 '/var/lib/nova/instances/8d812f63-573c-4f2c-a991-dfa68b844d20/console.log'/> 101 'serial' port='0'/> 102 'serial0'/> 103 104 'tablet' bus='usb'> 105 'input0'/> 106 107 'mouse' bus='ps2'/> 108 'keyboard' bus='ps2'/> 109 'vnc' port='5901' autoport='yes' listen='0.0.0.0' keymap='en-us'> 110 'address' address='0.0.0.0'/> 111 112

spawn()

作用:

调用get_guest_xml()函数创建生成虚拟机的xml文件。

get_guest_xml()

作用:

  1. 获取xml文件需要的信息,有网络信息,磁盘信息,镜像元数据等。
  2. 调用get_guest_config()函数进一步生成xml

get_guest_config()

作用:

  1. 调用libvirt驱动层函数生成一个guest变量,或者说是对象。
  2. 向guest对象中填充各种信息
  3. 调用driver.get_config()函数生成tap设备

get_config()

作用:

生成tap设备。

 tap设备解释(经典):

tap是linux虚拟出来的设备,表现为一个字符设备,用户可以通过对该设备读写,实现数据交互。

tun/tap 驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装。

利用tun/tap 驱动,可以将tcp/ip协议栈处理好的网络分包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到物理链路中。做为虚拟

网卡驱动,Tun/Tap驱动程序的数据接收和发送并不直接和真实网卡打交道,他在Linux内核中添加了一个TUN/TAP虚拟网络设备的驱动程序和

一个与之相关连的字符设备 /dev/net/tun,字符设备tun作为用户空间和内核空间交换数据的接口。当内核将数据包发送到虚拟网络设备时,数据

包被保存在设备相关的一个队列中,直到用户空间程序通过打开的字符设备tun的描述符读取时,它才会被拷贝到用户空间的缓冲区中,其效果

就相当于,数据包直接发送到了用户空间。通过系统调用write发送数据包时其原理与此类似。

在linux下,要实现内核空间和用户空间数据的交互,有多种方式:
1 可以通用socket创建特殊套接字,利用套接字实现数据交互;
2 通过proc文件系统创建文件来进行数据交互;
3 还可以使用设备文件的方式。访问设备文件会调用设备驱动相应的例程,设备驱动本身就是内核空间和用户空间的一个接口,
Tun/tap驱动就是利用设备文件实现用户空间和内核空间的数据交互。

get_config_bridge()

作用:

生成网桥设备