前言
结合自己最近的学习和实践,总结了一下libvirt和qemu-kvm的理解和使用,其中包括工具链的安装以及部分操作命令。
QEMU简单入门
qemu是什么,简单来说它是一个虚拟机的管理器,类似Virtualbox之类的。为了使虚机达到接近主机的性能,一般会结合kvm(或者Xen)对硬件虚拟化。kvm负责cpu+mem虚拟化,但kvm不能模拟其他设备;qemu负责模拟IO设备(网卡,usb等),两者结合能实现真正意义上的全系统仿真。kvm与qemu的结构如图所示:
安装qemu
qemu的安装,ubuntu/Debian系列的发行版使用下面的命令安装:
sudo apt-get install qemu |
redhat/centos系列的发行版使用如下命令安装:
sudo yum install qemu -y |
当然,也可以通过编译源码来安装。#qemu官网
检查kvm模块
kvm作为Linux的内核模块,其运行需要硬件对虚拟化的支持,通过如下命令查看是否支持虚拟化:
grep -E 'vmx|svm' /proc/cpuinfo |
有输出则说明支持虚拟化。检查kvm模块(intel处理器)是否加载:
liushy@ubuntu:/usr/bin$ lsmod | grep kvm |
若未加载,使用modprobe kvm-intel
(amd处理器:kvm-amd)加载模块。
qemu-kwm起虚机
基本的几条命令如下,第一步,创建一个虚拟机硬盘:
qemu-img create -f qcow2 disk.img 10G |
硬盘大小设置为10G,存放操作系统的。-f qcow2指定了硬盘格式,qcow2支持硬盘数据大小动态的增加。
第二步,安装操作系统:
qemu-system-x86_64 -enable-kvm -m 512 -smp 2 -boot order=dc -hda /home/liushy/disk.img -cdrom /home/liushy/CentOS-6.4-x86_64-minimal.iso -vnc 127.0.0.1:30 |
-enable-kvm
启动kwm模块,开启硬件加速;-m 512
设置内存为512m;-smp 2
分配2个cpu;-boot order=dc
指定系统启动顺序orber=dc
为光驱(d:CD-ROM)、硬盘(c:hard Disk);-hda和-cdrom
分别指定硬盘和光驱(系统的安装镜像);-vnc
设置访问虚机的vnc端口。
安装完成后重起虚拟机便会从硬盘启动,之后再启动虚拟机只需要执行:
qemu-system-x86_64 disk.img -m 512 -enable-kvm |
qemu起虚机的相关命令还有很多,比如指定网络设备,创建快照等,根据实际需求进行配置。
Libvirt基本玩法
libvirt是一整套对kvm虚机进行管理的工具和应用程序接口,它包括一个API库,一个守护程序(libvirtd)和一个命令行工具(virsh)。libvirtd通过调用qemu-kvm操作虚拟机,libvirt与qemu的架构关系,图像更直观:
penstack的虚机管理默认基于qemu-kvm,但是它不直接调用qemu-kvm,而是调用libvirt的库去操作qemu-kvm。libvirt提供的库除了能够操作qemu-kvm,还提供了对vmware, virtualbox,xen的支持。
安装libvirt
从libvirt官网下载libvirt源,我用的libvirt-1.3.5.tar.gz,解压,配置,编译,安装,启动(root权限):
tar -zxvf libvirt-1.3.5.tar.gz |
如果在./configure这一步报error,可能是缺少相关依赖:libyajl-dev ,libxml2-dev ,libdevmapper1.0.2.1 ,ibdevmapper-dev ,libpciaccess-dev ,libnl-dev。根据实际情况安装。
virsh管理虚机
virsh是libvirt的命令行工具,可直接输入virsh进入一个特殊的shell。接下来简单几个步骤,利用virsh创建虚机:
第一步,创建虚机硬盘,如上节qemu的步骤一;
第二步,创建一个xml文件,配置虚机的内存,cpu,硬盘,光驱,vnc等信息,如下kali.xml:
<domain type="kvm"> |
第三步,virsh create kali.xml启动虚机,等同于执行:
- virsh define kali.xml———注入xml文件的配置
- virsh start kali———启动kali虚机
启动虚机后,可通过virsh list查看当前运行的虚机。xml文件可以复用,创建其他虚机,但注意修改其中的uuid,name,pci设备等唯一配置信息。
绑定pci设备
如果要为虚机的接口绑定物理主机的网卡(pci passthrough,pci直通),则可以通过下面的操作完成:
第一步,lspci查看pci设备的信息:
lspci |
比如得到第一张网卡的编号04:00.0,然后通过以下指令找到对应的nodedev:
virsh nodedev-list --tree |
04:00.0对应的nodedev是pci_0000_04_00_0
第二步,得到对应网卡的xml配置:
virsh nodedev-dumpxml pci_0000_04_00_0 |
第三步,将网卡pci设备信息写入到虚机的xml文件中:
<hostdev mode='subsystem' type='pci' managed='yes'> |
其中的domain,bus,slot,function信息都是从网卡的xml配置中获取的。修改完虚机配置文件,重启虚机,就可以独占物理主机的网卡了。
virsh命令及调试
virsh的一些常用命令:
virsh list————#查询本地active的虚拟机 |
总结
本文简单介绍了虚拟化技术qemu-kvm和libvirt相关工具链的安装和基本使用,并未深入讨论一些技术细节。文末附上一些参考资料,可以加深理解,部分技术关键词比如virtio,sr-iov,pci passthrough,virsh配置网络,以及virsh虚机迁移等,都是比较有意思的,可以深入研究。
参考资料
https://huangwei.me/wiki/tech_cloud_kvm_qemu_libvirt_openstack.html
http://blog.csdn.net/panfengyun12345/article/details/16878873
https://www.chenyudong.com/category/virtualization
http://blog.chinaunix.net/uid-29312110-id-5763571.html
个人分析,欢迎指正,若转载请注明出处!