虚拟化实践从qemu-kvm到libvirt

By Liushy Apr 29 2017 Updated:Apr 30 2017 前言 结合自己最近的学习和实践,总结了一下libvirt和qemu-kvm的理解和使用,其中包括工具链的安装以及部分操作命令。 QEMU简单入门 qemu是什么,简单来说它是一个虚拟机的管理器,类似Virtualbox之类的。为了使虚机达到接近主机的性能,一般会结合kvm(或者Xen)对硬件虚拟化。kvm负责cpu+mem虚拟化,但kvm不能模拟其他设备;qemu负责模拟IO设备(网卡,usb等),两者结合能实现真正意义上的全系统仿真。kvm与qemu的结构如图所示: #安装qemu: qemu的安装,ubuntu/Debian系列的发行版使用下面的命令安装: 1 sudo apt-get install qemu redhat/centos系列的发行版使用如下命令安装: 1 sudo yum install qemu -y 当然,也可以通过编译源码来安装。

#qemu官网
#检查kvm模块:

kvm作为Linux的内核模块,其运行需要硬件对虚拟化的支持,通过如下命令查看是否支持虚拟化: 1 grep -E ‘vmx|svm’ /proc/cpuinfo 有输出则说明支持虚拟化。检查kvm模块(intel处理器)是否加载: 1 2 3 liushy@ubuntu:/usr/bin$ lsmod | grep kvm kvm_intel 143590 0 kvm 452043 1 kvm_intel 若未加载,使用 modprobe kvm-intel (amd处理器:kvm-amd)加载模块。 #qemu-kwm起虚机: 基本的几条命令如下,第一步,创建一个虚拟机硬盘: 1 qemu-img create -f qcow2 disk.img 10 G 硬盘大小设置为10G,存放操作系统的。 -f qcow2 指定了硬盘格式,qcow2支持硬盘数据大小动态的增加。 第二步,安装操作系统: 1 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端口。 安装完成后重起虚拟机便会从硬盘启动,之后再启动虚拟机只需要执行: 1 qemu-system-x86_64 disk.img -m 512 -enable-kvm qemu起虚机的相关命令还有很多,比如指定网络设备,创建快照等,根据实际需求进行配置。 Libvirt基本玩法 libvirt是一整套对kvm虚机进行管理的工具和应用程序接口,它包括一个API库,一个守护程序(libvirtd)和一个命令行工具(virsh)。libvirtd通过调用qemu-kvm操作虚拟机,libvirt与qemu的架构关系,图像更直观: openstack的虚机管理默认基于qemu-kvm,但是它不直接调用qemu-kvm,而是调用libvirt的库去操作qemu-kvm。libvirt提供的库除了能够操作qemu-kvm,还提供了对vmware, virtualbox,xen的支持。 #安装libvirt: 从 libvirt官网 下载libvirt源,我用的libvirt-1.3.5.tar.gz,解压,配置,编译,安装,启动(root权限): 1 2 3 4 5 6 tar -zxvf libvirt- 1.3 . 5 .tar.gz cd libvirt- 1.3 . 5

./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc
#--prefix指定安装的目的路径,默认安装到/usr/local/bin

make make install libvirtd -d #启动libvirtd 如果在./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: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 < domain type

“kvm”

< name

kali < / name

< !—虚拟机名称—> < memory unit

“MiB”

1024 < / memory

< !—最大内存,单位k—> < currentMemory unit

“MiB”

1024 < / currentMemory

< !—可用内存,单位k—> < vcpu

2 < / vcpu

< !—虚拟cpu个数—> < os

< type arch

”x86_64” machine

“pc”

hvm < / type

< !—半虚拟化—> < boot dev

”hd” /> < !—硬盘启动 —> < boot dev

“cdrom” /> < !—光盘启动—> < / os

< features

< acpi /> < apic /> < pae /> < / features

< clock offset

“localtime” /> < on_poweroff

destroy < / on_poweroff

< on_reboot

restart < / on_reboot

< on_crash

destroy < / on_crash

< devices

< emulator

/usr/bin/qemu < / emulator

< !—ubuntu和centos路径不同。可能会报错找不到,可以删掉这个标签规避—> < !—镜像配置—> < disk type

”file” device

“disk”

< driver name

”qemu” type

”qcow2” /> < source file

”/home/liushy/disk.img” /> < !—硬盘镜像路径—> < target dev

”hda” bus

“ide” /> < / disk

< disk type

”file” device

“cdrom”

< source file

”/media/liushy/CE270A25D4A27269/kali-linux-2.0-i386.iso” /> < !—光盘镜像路径 —> < target dev

”hdb” bus

“ide” /> < / disk

< !—接口配置—> < interface type

‘network’

< !—连接到虚拟网络,连接方式还有bridge,ethernet,hostdev等—> < mac address

’52:54:00:4f:1b:07’ /> < source network

’default’ /> < !—指定default网络,需要先virsh net-define创建—> < model type

’virtio’ /> < !—virtio模式,网卡工作速率为1000M—> < address type

’pci’ domain

’0x0000’ bus

’0x00’ slot

’0x03’ function

‘0x0’ /> < / interface

< input type

”mouse” bus

”ps2” /> < !—鼠标—> < !—vnc端口号自动分配,自动加1—> < graphics type

”vnc” port

”-1” autoport

”yes” listen

”0.0.0.0” keymap

“en-us” /> < / devices

< / domain

第三步,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设备的信息: 1 2 3 lspci 04 : 00.0 Ethernet controller: Intel Corporation 82571 EB Gigabit Ethernet Controller (rev 06 ) 04 : 00.1 Ethernet controller: Intel Corporation 82571 EB Gigabit Ethernet Controller (rev 06 ) 比如得到第一张网卡的编号04:00.0,然后通过以下指令找到对应的nodedev: 1 2 3 4 5 6 7 8 9 10 virsh nodedev-list —tree +- pci_0000_00_07_0 | | | +- pci_0000_04_00_0 | | | | | +- net_p1p1_00_1b_21_88_69_dc | | | +- pci_0000_04_00_1 | | | +- net_p1p2_00_1b_21_88_69_dd 04:00.0对应的nodedev是pci_0000_04_00_0 第二步,得到对应网卡的xml配置: 1 2 virsh nodedev-dumpxml pci_0000_04_00_0 … 第三步,将网卡pci设备信息写入到虚机的xml文件中: 1 2 3 4 5 < hostdev mode= ‘subsystem’ type

‘pci’ managed= ‘yes’

< source

< address domain= ‘0x0000’ bus= ‘0x04’ slot= ‘0x00’ function= ‘0x0’ /> < / source

< /hostdev> 其中的domain,bus,slot,function信息都是从网卡的xml配置中获取的。修改完虚机配置文件,重启虚机,就可以独占物理主机的网卡了。 #virsh命令及调试: virsh的一些常用命令: virsh list————#查询本地active的虚拟机 virsh list –all———-#查询本地所有的虚拟机(active+inactive) virsh define kali.xml———-#定义kali虚机的xml(虚拟机是inactive) virsh undefine kali———-#移除虚机 virsh start kali———-#启动名字为kali的非活动虚拟机 virsh create kali.xml———-#创建虚拟机(虚拟机立即执行) virsh edit kali———-#编辑配置文件 virsh domstate kali———-#显示虚拟机的当前状态 virsh dumpxml kali———-#显示虚拟机的当前配置文件 virsh suspend kali———-#挂起虚拟机 virsh resume kali———-#启动挂起的虚拟机 virsh shutdown kali———-#关闭虚拟机 virsh destroy kali———-#强制关闭虚拟机 virsh dominfo kali———-#显示虚拟机的基本信息 virsh domname 2 ———-#显示id号为2的虚拟机名 virsh domid kali———-#显示虚拟机id号 virsh domuuid kali————#显示虚拟机的uuid virsh setvcpus kali 4———-#给不活动虚拟机设置cpu个数 virsh vncdisplay kali———-#查看虚机的vnc端口 virsh nodedev-list —tree————#查看pci设备信息 virsh nodedev-dumpxml pci_000_05_00_0———-#查看pci_000_05_00_0的xml配置 virsh net-dumpxml default———-#得到defaul网络的xml配置 virsh net-define default.xml————#配置default网络的xml virsh net-start defalt ———-#运行defaukt网络 virsh net-destroy default ———-#移除default网络 libvirtd -l:libvirtd运行状态 libvirt-sock找不到该文件的情况,用find搜索,并ln -s软连接 总结 本文简单介绍了虚拟化技术qemu-kvm和libvirt相关工具链的安装和基本使用,并未深入讨论一些技术细节。文末附上一些参考资料,可以加深理解,部分技术关键词比如virtio,sr-iov,pci passthrough,virsh配置网络,以及virsh虚机迁移等,都是比较有意思的,可以深入研究。

#kvm #vmware #网络排查