KVM(名称来自英语: Kernel-basedVirtual Machine 的缩写, 即基于内核的虚拟机), 是一种用于 Linux 内核中的虚拟化基础设施, 可以将 Linux 内核转化为一个 hypervisor.
Qemu-kvm 创建和管理虚拟机
一. KVM 简介
KVM(名称来自英语: Kernel-basedVirtual Machine 的缩写, 即基于内核的虚拟机), 是一种用于 Linux 内核中的虚拟化基础设施, 可以将 Linux 内核转化为一个 hypervisor.KVM 在 2007 年 2 月被导入 Linux 2.6.20 核心中, 以可加载核心模块的方式被移植到 FreeBSD 及 illumos 上.
KVM 在具备 Intel VT 或 AMD-V 功能的 x86 平台上运行. 它也被移植到 S/390,PowerPC 与 IA-64 平台上. 在 Linux 内核 3.9 版中, 加入 ARM 架构的支持.
关于 KVM:
1).KVM 是开源软件, 全称是 kernel-based virtual machine(基于内核的虚拟机).
2). 是 x86 架构且硬件支持虚拟化技术 (如 intel VT 或 AMD-V) 的 Linux 全虚拟化解决方案.
3). 它包含一个为处理器提供底层虚拟化 可加载的核心模块 kvm.ko(kvm-intel.ko 或 kvm-AMD.ko).
4).KVM 还需要一个经过修改的 QEMU 软件(qemu-kvm), 作为虚拟机上层控制和界面.
5).KVM 能在不改变 Linux 或 Windows 镜像的情况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并为每一个虚拟机配置个性化硬件环境(网卡, 磁盘, 图形适配器......).
6). 在主流的 Linux 内核, 如 2.6.20 以上的内核均已包含了 KVM 核心.
KVM 与 vbox 的区别: vbox 是由 qemu 改写而成, 包含大量 qemu 代码.
1). 可以使用于 "不支持" 虚拟化技术的 CPU.
2). 值得说的一点: vbox 在图形方面比较好, 能进行 2D 3D 加速; 但 CPU 控制不理想(估计是因为图形支持的缘故); 操作上有独立的图形界面, 易于上手.
kvm 是 Linux 内核包含的东西, 使用 qemu 作为上层管理(命令行).
1). 要求 CPU 必须支持虚拟化.
2). 性能: 作为服务器很好, 可是图形能力十分的差. 即使放电影, 图像也是像刷油漆一样, 一层一层的.
3).CPU 使用率控制很好.
4). 控制上比较简洁, 功能比较丰富: 比如使用 "无敌功能" 所有更改指向内存, 你的镜像永远保持干净."母镜像" 功能让你拥有 n 个独立快照点. 还有很多参数. 另外, kvm 作为内核级的虚拟机, 刚开始发展关注的公司比较多 -- 但是还没有达到商业应用的水平.
总体而言: 在支持虚拟化的情况下, vbox 和 kvm 的性能差不多, 主要是面向对象不同: kvm 适用于服务器, vbox 适用于桌面应用.
qemu 全称 Quick Emulator. 是独立虚拟软件, 能独立运行虚拟机(根本不需要 kvm).kqemu 是该软件的加速软件. kvm 并不需要 qemu 进行虚拟处理, 只是需要它的上层管理界面进行虚拟机控制. 虚拟机依旧是由 kvm 驱动. 所以, 大家不要把概念弄错了, 盲目的安装 qemu 和 kqemu.qemu 使用模拟器
KVM 内存管理 KVM 继承了 Linux 系统管理内存的诸多特性, 比如, 分配给虚拟使用的内存可以被交换至交换空间, 能够使用大内存页以实现更好的性能, 以及对 NUMA 的支持能够让虚拟机高效访问更大的内存空间等. KVM 基于 Intel 的 EPT(ExtendedPage Table)或 AMD 的 RVI(Rapid Virtualization Indexing)技术可以支持更新的内存虚拟功能, 这可以降低 CPU 的占用率, 并提供较好的吞吐量. 此外, KVM 还借助于 KSM(Kernel Same-pageMerging)这个内核特性实现了内存页面共享. KSM 通过扫描每个虚拟机的内存查找各虚拟机间相同的内存页, 并将这些内存页合并为一个被各相关虚拟机共享的单独页面. 在某虚拟机试图修改此页面中的数据时, KSM 会重新为其提供一个新的页面副本. 实践中, 运行于同一台物理主机上的具有相同 GuestOS 的虚拟机之间出现相同内存页面的概率是很的, 比如共享库, 内核或其它内存对象等都有可能表现为相同的内存页, 因此, KSM 技术可以降低内存占用进而提高整体性能.
相关连接:
KVM 的官方地址: http://www.linux-kvm.org/page/Main_Page
KVM 的 Howto 文档: http://www.linux-kvm.org/page/HOWTO
Kqemu 源码地址: http://sourceforge.net/projects/kqemu/
Qemu 下载地址: http://wiki.qemu.org/Main_Page
二. KVM 虚拟化平台构建
1. 安装准备 查看你的硬件是否支持虚拟化. 命令:
#egrep '(vmx|svm)' /proc/cpuinfo
vmx.PNG
注意: 要有 vmx 或 svm 的标识才行. 总的说来, AMD 在虚拟化方面作得更好一些.
2. 安装 KVM 由于 Linux 内核已经将 KVM 收录了, 在安装系统时已经加入了 KVM, 我们只需要在命令行模式下启用 KVM 即可: 启用 KVM 模块
modprobe kvm
功能区分 intel/amd 的启用:
- modpobe kvm-intel
- lsmod |grep kvm
- kvm_intel 55496 0
- kvm 337772 1 kvm_intel
3.KVM 虚拟机创建和管理所依赖的组件介绍 KVM 虚拟机的创建依赖 qemu-kvm: 虽然 kvm 的技术已经相当成熟而且可以对很多东西进行隔离, 但是在某些方面还是无法虚拟出真实的机器. 比如对网卡的虚拟, 那这个时候就需要另外的技术来做补充, 而 qemu-kvm 则是这样一种技术. 它补充了 kvm 技术的不足, 而且在性能上对 kvm 进行了优化.
我们还可以使用 virt-manager,virt-viewer 来管理虚拟机;
我们在创建和管理 KVM 虚拟机时还需要 libvirt 这个重要的组件:
它是一系列提供出来的库函数, 用以其他技术调用, 来管理机器上的虚拟机. 包括各种虚拟机技术, kvm,xen 与 lxc 等, 都可以调用 libvirt 提供的 API 对虚拟机进行管理. 有这么多的虚拟机技术, 它为何能提供这么多的管理功能那. 是因为它的设计理念, 它是面向驱动的架构设计. 对任何一种虚拟机技术都开发设计相对于该技术的驱动. 这样不同虚拟机技术就可以使用不同驱动, 而且相互直接不会影响, 方便扩展. 而且 libvirt 提供了多种语言的编程接口, 可以直接通过编程, 调用 libvirt 提供的对外接口实现对虚拟机的操作. 如今流行的云计算中的 IaaS 是与该库联系相当密切的. 通过下图可以看出它的架构设计思想.
kvm.jpg
从该图可以看出, 在 libvirtapi 之上会有很多个 driver, 对于每一种虚拟机技术都会有一种 driver, 用来充当该虚拟机技术与 libvirt 之间的包装接口. 如此设计就可以避免 libvirt 需要设计各种针对不同虚拟机技术的接口, 它主要关注底层的实现, 提供对外接口调用, 而不同的虚拟机技术通过调用 libvirt 提供的接口来完成自己所需要的功能.
4. 安装 KVM 所需组件
yum 源提供了, 直接安装:
yum install -y qemu-kvm libvirt virt-manager
安装完成后启动 libvirtd 服务:
- [root@luckyall network-scripts]# service libvirtd start
- Starting libvirtd daemon: libvirtd: relocation error: libvirtd: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference
- [FAILED]
- [root@luckyall network-scripts]# Starting libvirtd daemon: libvirtd: relocation error: libvirtd: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference
既然有个报错. 百度下发现需要升级下组件
[root@luckyall network-scripts]# yum -y upgrade device-mapper-libs
然后重新启动 libvirtd 发现已经正常
ifconfig.PNG
使用网桥管理命令查看:
- [root@luckyall ~]# brctl show
- bridge name bridge id STP enabled interfaces
- virbr0 8000.5254008a9355 yes virbr0-nic
像 VMware Workstation 中我们需要创建物理桥接设备, 可以使用 virsh 创建桥设备关联网卡到桥接设备上: 需要将 NetworkManager 服务关闭, 开机启动也关闭:
- chkconfig NetworkManager off
- service NetworkManager stop
然后在创建桥接设备及关联网卡到桥接设备上:
virsh iface-bridge eth0 br0
br0.PNG
查看桥接设备:
brctrshow.PNG
至此, 我们的虚拟化平台就构建完毕, 下面就开始在 KVM 虚拟化平台上创建和管理虚拟机, 我们先使用 qemu-kvm 来创建和管理虚拟机.
三, 使用 qemu-kvm 管理 KVM 虚拟机
1.Qemu-kvm 介绍
Qemu 是一个广泛使用的开源计算机仿真器和虚拟机. 当作为仿真器时, 可以在一种架构 (如 PC 机) 下运行另一种架构 (如 ARM) 下的操作系统和程序. 而通过动态转化, 其可以获得很高的运行效率. 当作为一个虚拟机时, qemu 可以通过直接使用真机的系统资源, 让虚拟系统能够获得接近于物理机的性能表现. qemu 支持 xen 或者 kvm 模式下的虚拟化. 当用 kvm 时, qemu 可以虚拟 x86, 服务器和嵌入式 powerpc, 以及 s390 的系统.
QEMU 当运行与主机架构相同的目标架构时可以使用 KVM. 例如, 当在一个 x86 兼容处理器上运行 qemu-system-x86 时, 可以利用 KVM 加速 -- 为宿主机和客户机提供更好的性能.
Qemu 有如下几个部分组成:
处理器模拟器 (x86,PowerPC 和 Sparc); 仿真设备(显卡, 网卡, 硬盘, 鼠标等); 用于将仿真设备连接至主机设备(真实设备) 的通用设备; 模拟机的描述信息; 调试器; 与模拟器交互的用户接口;
基于 libvirt 的工具如 virt-manager 和 virt-install 提供了非常便捷的虚拟机管理接口, 但它们事实上上经二次开发后又封装了 qemu-kvm 的工具. 因此, 直接使用 qemu-kvm 命令也能够完成此前的任务.
2.Qemu-kvm 的使用帮助
在 RHEL6/CentOS6 上, qemu-kvm 位于 / usr/libexec 目录中. 由于此目录不属于 PATH 环境变量, 故无法直接使用, 这样也阻止了可以直接使用 qemu 作为创建并管理虚拟机. 如若想使用 qemu 虚拟机, 可以通过将 / usr/libexec/qemu-kvm 链接为 / usr/bin/qemu 实现.
ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu-kvm
qemu-kvm 命令使用格式为 "qemu-kvm [options] [disk_image]", 其选项非常多, 不过, 大致可分为如下几类.
标准选项; USB 选项; 显示选项; i386 平台专用选项; 网络选项; 字符设备选项; 蓝牙相关选项; Linux 系统引导专用选项; 调试 / 专家模式选项; PowerPC 专用选项; Sparc32 专用选项;
qemu-kvm 的标准选项 qemu-kvm 的标准选项主要涉及指定主机类型, CPU 模式, NUMA, 软驱设备, 光驱设备及硬件设备等.
-name name: 设定虚拟机名称;
-M machine: 指定要模拟的主机类型, 如 Standard PC,ISA-only PC 或 Intel-Mac 等, 可以使用 "qemu-kvm -M ?" 获取所支持的所有类型;
-m megs: 设定虚拟机的 RAM 大小;
-CPU model: 设定 CPU 模型, 如 coreduo,qemu64 等, 可以使用 "qemu-kvm -cpu ?" 获取所支持的所有模型;
-smp n[,cores=cores][,threads=threads][,sockets=sockets][,maxcpus=maxcpus]: 设定模拟的 SMP 架构中 CPU 的个数等, 每个 CPU 的核心数及 CPU 的 socket 数目等; PC 机上最多可以模拟 255 颗 CPU;maxcpus 用于指定热插入的 CPU 个数上限;
-numa opts: 指定模拟多节点的 numa 设备;
-fda file
-fdb file: 使用指定文件 (file) 作为软盘镜像, file 为 / dev/fd0 表示使用物理软驱;
- -hda file
- -hdb file
- -hdc file
-hdd file: 使用指定 file 作为硬盘镜像;
-cdrom file: 使用指定 file 作为 CD-ROM 镜像, 需要注意的是 - cdrom 和 - hdc 不能同时使用; 将 file 指定为 / dev/cdrom 可以直接使用物理光驱;
-drive option[,option[,option[,...]]]: 定义一个硬盘设备; 可用子选项有很多.
file=/path/to/somefile: 硬件映像文件路径;
if=interface: 指定硬盘设备所连接的接口类型, 即控制器类型, 如 ide,scsi,sd,mtd,floppy,pflash 及 virtio 等;
index=index: 设定同一种控制器类型中不同设备的索引号, 即标识号;
media=media: 定义介质类型为硬盘 (disk) 还是光盘(cdrom);
snapshot=snapshot: 指定当前硬盘设备是否支持快照功能: on 或 off;
cache=cache: 定义如何使用物理机缓存来访问块数据, 其可用值有 none,writeback,unsafe 和 writethrough 四个;
format=format: 指定映像文件的格式, 具体格式可参见 qemu-img 命令;
-boot [order=drives][,once=drives][,menu=on|off]: 定义启动设备的引导次序, 每种设备使用一个字符表示; 不同的架构所支持的设备及其表示字符不尽相同, 在 x86 PC 架构上, a,b 表示软驱, c 表示第一块硬盘, d 表示第一个光驱设备, n-p 表示网络适配器; 默认为硬盘设备;
-boot order=dc,once=d
qemu-kvm 的显示选项 显示选项用于定义虚拟机启动后的显示接口相关类型及属性等.
-nographic: 默认情况下, qemu 使用 SDL 来显示 VGA 输出; 而此选项用于禁止图形接口, 此时, qemu 类似一个简单的命令行程序, 其仿真串口设备将被重定向到控制台;
-curses: 禁止图形接口, 并使用 curses/ncurses 作为交互接口;
-alt-grab: 使用 Ctrl+Alt+Shift 组合键释放鼠标;
-ctrl-grab: 使用右 Ctrl 键释放鼠标;
-sdl: 启用 SDL;
-spice option[,option[,...]]: 启用 spice 远程桌面协议; 其有许多子选项, 具体请参照 qemu-kvm 的手册;
-vga type: 指定要仿真的 VGA 接口类型, 常见类型有:
cirrus:Cirrus Logic GD5446 显示卡;
std: 带有 Bochs VBI 扩展的标准 VGA 显示卡;
vmware:VMWare SVGA-II 兼容的显示适配器;
qxl:QXL 半虚拟化显示卡; 与 VGA 兼容; 在 Guest 中安装 qxl 驱动后能以很好的方式工作, 在使用 spice 协议时推荐使用此类型;
none: 禁用 VGA 卡;
-vnc display[,option[,option[,...]]]: 默认情况下, qemu 使用 SDL 显示 VGA 输出; 使用 - vnc 选项, 可以让 qemu 监听在 VNC 上, 并将 VGA 输出重定向至 VNC 会话; 使用此选项时, 必须使用 - k 选项指定键盘布局类型; 其有许多子选项, 具体请参照 qemu-kvm 的手册;
i386 平台专用选项
-no-acpi: 禁用 ACPI 功能, GuestOS 与 ACPI 出现兼容问题时使用此选项;
-balloon none: 禁用 balloon 设备;
-balloon virtio[,addr=addr]: 启用 virtio balloon 设备;
网络属性相关选项 网络属性相关选项用于定义网络设备接口类型及其相关的各属性等信息. 这里只介绍 nic,tap 和 user 三种类型网络接口的属性, 其它类型请参照 qemu-kvm 手册.
-net nic[,vlan=n][,macaddr=Mac][,model=type][,name=name][,addr=addr][,vectors=v]: 创建一个新的网卡设备并连接至 vlan n 中; PC 架构上默认的 NIC 为 e1000,macaddr 用于为其指定 Mac 地址, name 用于指定一个在监控时显示的网上设备名称; emu 可以模拟多个类型的网卡设备, 如 virtio,i82551,i82557b,i82559er,ne2k_isa,pcnet,rtl8139,e1000,smc91c111,lance 及 mcf_fec 等; 不过, 不同平台架构上, 其支持的类型可能只包含前述列表的一部分, 可以使用 "qemu-kvm -net nic,model=?" 来获取当前平台支持的类型;
-net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]: 通过物理机的 TAP 网络接口连接至 vlan n 中, 使用 script=file 指定的脚本 (默认为 / etc/qemu-ifup) 来配置当前网络接口, 并使用 downscript=file 指定的脚本 (默认为 / etc/qemu-ifdown) 来撤消接口配置; 使用 script=no 和 downscript=no 可分别用来禁止执行脚本;
-net user[,option][,option][,...]: 在用户模式配置网络栈, 其不依赖于管理权限; 有效选项有:
vlan=n: 连接至 vlan n, 默认 n=0;
name=name: 指定接口的显示名称, 常用于监控模式中;
net=addr[/mask]: 设定 GuestOS 可见的 IP 网络, 掩码可选, 默认为 10.0.2.0/8;
host=addr: 指定 GuestOS 中看到的物理机的 IP 地址, 默认为指定网络中的第二个, 即 x.x.x.2;
dhcpstart=addr: 指定 DHCP 服务地址池中 16 个地址的起始 IP, 默认为第 16 个至第 31 个, 即 x.x.x.16-x.x.x.31;
dns=addr: 指定 GuestOS 可见的 dns 服务器地址; 默认为 GuestOS 网络中的第三个地址, 即 x.x.x.3;
3. 使用 qemu-kvm 安装虚拟机 Guest OS
测试安装 Windows 2003 1)下载系统镜像文件, 我这里有个 Windows 2003 系统, 我们来试着安装. 创建虚拟机的磁盘文件存放目录:
- [root@luckyall ~]# mkdir /kvm/images -pv
- mkdir: created directory `/kvm'mkdir: created directory `/kvm/images'
创建虚拟磁盘文件:
- [root@luckyall images]# qemu-img create -o preallocation=metadata -f qcow2 /kvm/images/win2003.qcow2 10G
- Formatting '/kvm/images/win2003.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 preallocation='metadata'
- [root@luckyall images]# ll -h /kvm/images/
- total 1.8M
- -rw-r--r--. 1 root root 11G Dec 19 23:46 win2003.qcow2
2)在 kvm 平台安装 vnc-server 和 tigervnc 这个 vncviewer
此处不做介绍 参考我的博客: http://blog.sina.com.cn/s/blog_6e470cb00102wazp.html
- [root@luckyall ~]# qemu-kvm -CPU host -smp 1 -name win2003 -m 512 -drive file=/kvm/images/win2003.qcow2,if=ide,format=qcow2 -drive file=/root/Downloads/win2003.iso,media=cdrom -boot dc -usbdevice tablet
- VNC server running on `::1:5900'
我们到图形界面上进行连接: #vncviewer :5900
qemu-kvm.PNG
后续直至安装完成即可.
也可以使用 virt-manager 创建和管理虚拟机, 这个是图形管理工具, 再次就不再多介绍;
来源: http://virtual.51cto.com/art/202007/621688.htm