概述
为了搭建云IDS平台,需要选型合适的虚拟化方案,以及对相应部署做一定的优化。基本设计架构为,在以Centos操作系统安装的宿主机中再部署IDS虚拟机(基于Centos操作系统)。
本设计文档所述的设计方案,基于以下环境:
- Intel x86架构的cpu,支持intel VT和VT-d
- BIOS中enable VT和VT-d
- BIOS中建议开启Intel Hyper-Threading Tech
- 使用kvm虚拟化
- 宿主机和IDS虚拟机为Centos7.2操作系统
- 宿主机操作系统内核使用Linux内核3.18.24
设计方案
本次选择的技术和方案如下:
- 使用libvirt和virsh管理套件管理虚拟机
- 使用virtio半虚拟化方案提升性能
- 使用网卡透传方式提升流量接入性能
- 通过把虚拟机中指定的vcpu绑定到指定的物理cpu核上,提升cpu性能
内核模块配置
宿主机环境是Linux内核3.18.24,为了支持后续部署的IDS虚拟机所需的一些功能,需要修改内核中的配置选项,并重新编译内核。
主要内核的配置选项如下:
- 需要开启的VIRTIO相关模块
CONFIG_VIRTIO_BLK=m
CONFIG_SCSI_VIRTIO=m
CONFIG_VIRTIO_NET=m
CONFIG_VIRTIO=m
CONFIG_VIRTIO_PCI=m
CONFIG_VIRTIO_BALLOON=m
- 需要开启Intel_IOMMU
CONFIG_INTEL_IOMMU=y
- 开启vfio模块
CONFIG_VFIO_IOMMU_TYPE1=m
CONFIG_VFIO=m
CONFIG_VFIO_PCI=m
CONFIG_VFIO_PCI_VGA=y
CONFIG_KVM_VFIO=y
- 压缩内核
为了减小内核的大小,开启内核中对模块进行压缩的操作。
CONFIG_MODULE_COMPRESS=y
# CONFIG_MODULE_COMPRESS_GZIP is not set
CONFIG_MODULE_COMPRESS_XZ=y
以下就是对内核的编译和安装了。
虚拟化技术选型
透传网卡
为了让部署在宿主机中的IDS虚拟机可以更好的接入数据流量,需要把宿主机中一定数量的网卡透传给IDS虚拟机。
PCI网卡透传的条件
- 确认在BIOS中打开了硬件辅助虚拟化功能支持
在BIOS中查看VT(VT-X)及VT-d,设置为enable
- 确认内核集成vfio、DMAR、IOMMU模块
IOMMU模块会把设备的I/O地址重映射为内存物理地址,运行在CPU上的操作系统以互斥的方式管理MMU与IOMMU。
设置指定网卡透传给IDS
- IOMMU_group分组
IOMMU模块会把所有网卡分成不同的IOMMU_group管理,每个IOMMU_group下会有一个或者多个网卡设备。查看网卡设备属于哪个IOMMU_group,可以通过网卡的PCI地址,查看如下:
如上可以查看到网卡当前使用的驱动为igb,iommu_group为6。
- PCI网卡透传
网卡透传通过编辑创建IDS虚拟机的配置文件的方式,在使用virsh define创建虚拟机时实现。
在设置透传的网卡时,同一个IOMMU_group中的网卡不能有些透传,有些没有透传,透传后的网卡驱动会绑定为vfio-pci驱动如下:
- 网卡透传后
根据iommu_group选择需要透传的网卡。比如:如果透传iommu_group号为1和7的网卡,在透传完成后,会在系统的/dev/vfio中生成如下文件:
virtio半虚拟化
为了增加IDS虚拟机的运行性能,使用virtio虚拟化方案,主要使用以下相关功能:
- 使用virtio_balloon驱动,实现内存的高效利用
- 使用virtio-net,提升网络性能
- 使用vhost-net提升网络性能。
结束语
关于虚拟化的技术点有很多,本文只是一个简单的设计思路,以后还需要继续深入学习。