又是一篇和Xen相关的教程,主要介绍如何在Xen里面启动一个网卡的driver domain
(也被称为stub domain
),也就是说,该虚拟机专门用来为其它虚拟机提供网络服务(而不是把所有这些服务都交给Domain 0
来做)。
说句题外话,为什么最近这么多教程类型的博客,原因在于我发现每次我把这些东西记在博客里面的话,自己都会记得很深,但是记在Evernote里面经常就会忘记掉,况且记在博客里面还有可能为别人提供帮助,所以何乐而不为呢?
好了,废话说到这,开始进入正题。
driver domain
可以参看Xen的wiki。
主要有四点原因:
domain 0
里面剥离出来,也就是说就算客户虚拟机控制了driver domain
,也不能拿domain 0
如何;driver domain
的资源不受domain 0
的限制,所有和设备相关的资源都和该driver domain
相关;driver domain
里面的进程不会和domain 0
里面的进程产生竞争关系,不管从安全性还是性能方面都能提供比较好的隔离性;domain 0
里面运行driver的进程,那么会产生double scheduling
的问题,即driver要工作,必须首先等domain 0
被调度,然后等domain 0
中和driver相关的进程被调度;但是如果用了driver domain
的话就没有这个问题了,只要等driver domain
被调度就可以了(因为在driver domain
里面只有一个进程)。使用driver domain
可以提供多大的性能提升呢?可以参看这个slide。
driver domain
好,下面开始进入教程。
首先我们来一张使用网卡driver domain
的架构图吧:
其实主要就是如何进行网卡的passthrough,以及如何让客户虚拟机和driver domain
进行匹配。
至于相关的参考资料嘛,可以参考这里。
这个就不说了,参照上篇博客
参考资料来自这里。
首先提一下IOMMU和PCI passthrough的关系:
在正常情况下,一个设备可被配置成DMA到任意的宿主机的物理内存,但是这样会有两个问题:
那么如何让客户虚拟机的driver来操作真实硬件呢?这就引入了IOMMU,这套机制运行Xen来配置一个设备可以访问哪些内存,以及将这些内存也让客户虚拟机看到。
所以说,在有IOMMU支持的硬件上,设备可以被passthrough给HVM和PV虚拟机,而在没有IOMMU支持的设备上,如果设备被passthrough给PV虚拟机,虽然可以正常运行,但是会有安全问题,另外,设备不能被passthrough给HVM虚拟机,因为HVM虚拟机看不到设备访问的那块内存。
接下来我们就来看如何passthrough。
简单来说,我们需要先把网卡和domain 0
的连接先给取消掉,然后再把它分配给driver domain
。
首先我们得先知道我们的网卡设备是哪一个,以及它所对应的BDF_Notation),这个可以通过:
$ lspci
查看,得到它的BDF是00:19.0
:
之后,就可以利用xl
这套xen-tool里面提供的命令来将其从domain 0
里面移除,并且加进Xen的assignable
的设备集合里面:
$ sudo xl pci-assignable-add 00:19.0
这个时候运行sudo xl pci-assignable-list
就可以看到:
这之后,就可以启动我们的driver domain
了。配置启动文件:
1 2 3 4 5 6 7 |
|
注意,这里主要就是增加了一行:
1
|
|
然后启动虚拟机:
$ sudo xl create driver-domain.cfg
这个时候如果进到虚拟机里面看,会发现它多了一个PCI设备,且可以联网:
而此时,宿主机已经连不上网了!
这里需要注意的是我们需要在这个driver domain
里面安装xen-tools,以及配置桥接网络,取名为xenbr0
,供之后的客户虚拟机使用。
这些配置和domain 0
里面的差不多,具体的可以参照我的上一篇博客。
然后我们就可以配置客户虚拟机了,这一步非常简单,只需要在vif
这个配置选项上的backend
填上driver-domain
(也就是driver domain
的name),将bridge
填上xenbr0
(也就是driver domain的桥的名字)就可以了:
1 2 3 4 5 6 7 |
|
然后启动虚拟机:
$ sudo xl create guest-vm.cfg
进入虚拟机之后试一下,发现它果然可以上网啦!
到这里,这一篇博客的内容就结束啦。