虚拟化实践从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虚机迁移等,都是比较有意思的,可以深入研究。