1、搭建kvm虚拟环境
•KVM是一个混合类型的VMM,它能够以模拟方式支持硬件的完全虚拟
化,也能够在GuestOS中安装驱动程序进而支持部分硬件的半虚拟化
•对网络设备和块设备来讲,半虚拟化方式能够极大地提升设备性能
•Red Hat联手IBM同Linux社区开发出了一种独立于VMM的半虚拟化驱动
程序标准VirtIO,根据这种标准开发的半虚拟化设备驱动程序可兼容地
运行于多种不同的VMM上,从而提高了相关VMM之间的互操作性
•VritIO驱动已经包含于2.6.25及以后版本的Linux内核中,RHEL系列的
操作系统4.8+、5.3+及6.0+的内核业已支持此驱动,而且,Red Hat专门
为GuestOS模式的Windows提供的VirtIO驱动程序也通过了微软的
WHQL认证
基于libvirt API管理工具主要有VMM和virsh。
• “VMM(Virtual Machine Manager)”程序提供了virt-manager、virtinst和virt
viewer三个工具,均可以通过官方站点http://www.virt-manager.org获取
• virt-manager:通过libvirt管理虚拟机的图形化工具,并可用于启动、关闭、新建或删除虚拟
设备,连接至图形或串行控制台,以及查看资源占用率类的统计数据等;
• virtinst:构建及安装虚拟的工具组件,包括virt-install(创建及安装虚拟机)、virt-clone(虚
拟机克隆)、virt-convert(虚拟机格式转换)和virt-image(基于xml格式的镜像描述文件创
建虚拟机)等;
• virt-viewer:连接虚拟机的图形化客户端;
• virsh:管理虚拟机的交互式shell,可用于创建、暂停、停止域等,也可实现虚拟
设备的管理,是用于管理VKM虚拟机的最常用工具之一
桥接网络,将物理机中的网卡,变为交换机,配置虚拟交换机,连接本机其他虚拟机,将虚拟交换机配置ip地址,取消网卡ip地址,使其变为交换机,当外部来的报文进入物理网卡(相当于虚拟交换机)发送给宿主机网卡(其实是虚拟的网卡)或者其他虚拟机(在同一个万网段),会使其所有虚拟机暴露在网络中
nat网络在宿主机中配置一块虚拟网络空间(路由器)。连接所有虚拟机。将虚拟机所有虚拟机网关指向虚拟路由器。在通过内核驱动虚拟路由器将报文转至物理网卡。通过物理网卡出去
仅主机模式:只能与宿主机通信
安装kvm步骤
安装使用KVM:
判断CPU是否支持硬件虚拟化:
grep -i -E '(vmx|svm|lm)' /proc/cpuinfo
vmx:Intel VT-x
svm:AMD AMD-v
1,在vm虚拟机中安装kvm虚拟机,需要开启cpu虚拟化选项
modeprobe kvm #加载kvm模块至内核中
快速使用kvm技术:
# yum install libvirt-daemon-kvm qemu-kvm virt-manager
# modprobe kvm
# systemctl start libvirtd.service
# virsh iface-bridge INTERFACE BRIDGE_NAME
# virt-manager
默认libvirtd安装虚拟机只有nat模式网络,如果需要桥接模式则需设置将物理网卡转换为交换机,创建虚拟桥设置为网卡。
vim /etc/sysconfig/network-scripts/ifcfg-ens33 修改网卡配置文件增加一项 BRIDGE=br0 设置为网桥
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
BRIDGE=br0
vim /etc/sysconfig/network-scripts/ifcfg-br0 修改网桥设备,增加ip地址
BROWSER_ONLY="no"
BOOTPROTO="none"
NAME="br0"
DEVICE="br0"
ONBOOT="yes"
IPADDR="192.168.101.195"
NETMASK=255.255.255.0
GATEWAY="192.168.101.1"
virt-manager #启动图形界面虚拟机
使用virsh命令管理kvm虚拟机
virsh list 查看虚拟机列表 --all 显示所有虚拟机包括未启动虚拟机
virsh dumpxml generic # 查看创建虚拟机时记录的选项模板文件,之后可使用virsh结合此模板文件创建虚拟机,创建虚拟机后此文件会自动存放至 /etc/libvirt/qemu/目录中
virsh dumpxml generic > /etc/libvirt/qemu/c2.xml # 导出虚拟机xml文件
vim /etc/libvrt/qemu/c1.xml 修改配置文件,名称,内存,及mac信息等等
<domain type='kvm' id='1'>
<name>c1</name> #名称
<memory unit='KiB'>1047552</memory># 内存
<currentMemory unit='KiB'>1047552</currentMemory>
<vcpu placement='static'>1</vcpu> #占用cpu数
</controller>
<interface type='bridge'>
<mac address='52:54:00:00:74:2a'/> #修改mac
<source bridge='br0'/>
<target dev='vnet0'/>
<model type='rtl8139'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
保存模板,之后使用virsh create 创建虚拟机
virsh define /etc/libvirt/qemu/c2.xml #创建虚拟机不启动
[root@centos7 ~]# virsh start c1 # 启动虚拟机
Domain c1 started
[root@centos7 ~]# virsh domifaddr c1 #查看虚拟机网络信息
Name MAC address Protocol Address
[root@centos7 ~]# virsh console generic #本地连接控制台
Connected to domain generic
Escape character is ^]
virsh save c1 保存虚拟机
virsh restore c1 running 继续运行
virsh shutdown c1 关机
virsh destroy c1 删除虚拟机
[root@centos7 ~]# virsh domiflist c1 #查看虚拟机的网络状态,虚拟机网卡为成对出现,另一半则在宿主机上表现为vnet1
Interface Type Source Model MAC
-------------------------------------------------------
vnet1 bridge br0 rtl8139 52:54:00:00:74:2a
[root@centos7 ~]# virsh domblklist c1 #查看虚拟机对应宿主机文件映像文件
Target Source
------------------------------------------------
hda /var/lib/libvirt/images/generic.qcow2
使用qemu-img 配置磁盘
qemu-img create -f qcow2 -o preallocation=metadata,size=10G /data/vms/mydis.img #创建磁
盘映像文件
virsh attach-disk generic /data/vms/mydis.img vdb 向虚拟机generic添加刚创建的磁盘
[root@centos7 ~]# virsh detach-disk generic vdb #拆除虚拟硬盘设备
Disk detached successfully
[root@centos7 ~]# virsh net-dumpxml default # 查看默认虚拟网络xml文件
<network>
<name>default</name>
<uuid>2f80309c-c18b-4fd0-ab50-1c44a01adb13</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:77:e9:31'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
定义隔离网络
[root@centos7 networks]# vim /etc/libvirt/qemu/net/virnet0.xml 在此目录中创建xml文件定义隔离网络
<network>
<name>geli</name>
<bridge name='virbr1' stp='on' delay='0'/>
<mac address='52:54:00:70:e9:31'/>
</network>
virsh net-create virnet0.xml #从virnet0.xml 中创建一个隔离网络
[root@centos7 networks]# virsh net-create virnet0.xml
Network geli created from virnet0.xml
之后新创建虚拟机则可加入此隔离网络
2、使用qemu-kvm创建和管理虚拟机
qemu-kvm命令默认存放在 /usr/libvert/cmd/目录中,如果不想使用绝对路径执行qemu-kvm命令
则可使用 ln -s /usr/libexec/qemu-kvm /usr/sbin 软连接至path目录中
Qemu:
处理器模拟器
仿真各种IO设备
将仿真设备连接至主机的物理设备
提供用户接口
qemu-kvm命令语法:
qemu-kvm [options] [disk_image]
选项有很多类别:
标准选项、块设备相关选项、显示选项、网络选项、...
标准选项:
-machine [type=]name:-machine help来获取列表,用于指定模拟的主机类型;
-cpu cpu:-cpu help来获取列表;用于指定要模拟的CPU型号;
-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]:指明虚拟机上vcpu的数量及拓扑;
-boot [order=drives][,once=drives][,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]
order:各设备的引导次序:c表示第一块硬盘,d表示第一个光驱设备;-boot order=dc,once=d
-m megs:虚拟机的内存大小;
-name NAME:当前虚拟机的名称,要惟一;
块设备相关的选项:
-hda/-hdb file:指明IDE总线类型的磁盘映射文件路径;第0和第1个;
-hdc/-hdd file:第2和第3个;
-cdrom file:指定要使用光盘映像文件;
-drive [file=file][,if=type][,media=d][,index=i] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]:
file=/PATH/TO/SOME_IMAGE_FILE:映像文件路径;
if=TYPE:块设备总线类型,ide, scsi, sd, floppy, virtio,...
media=TYPE:介质类型,cdrom和disk;
index=i:设定同一类型设备多个设备的编号;
cache=writethrough|writeback|none|directsync|unsafe:缓存方式;
format=f:磁盘映像文件的格式;
显示选项:
-display type:显示的类型,sdl, curses, none和vnc;
-nographic:不使用图形接口;
-vga [std|cirrus|vmware|qxl|xenfb|none]:模拟出的显卡的型号;
-vnc display[,option[,option[,...]]]]:启动一个vnc server来显示虚拟机接口; 让qemu进程监听一个vnc接口;
display:
(1) HOST:N
在HOST主机的第N个桌面号输出vnc;
5900+N
(2) unix:/PATH/TO/SOCK_FILE
(3) none
options:
password:连接此服务所需要的密码;
-monitor stdio:在标准输出上显示monitor界面;
Ctrl-a, c:在console和monitor之间切换;
Ctrl-a, h
网络选项:
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
为虚拟机创建一个网络接口,并将其添加至指定的VLAN;
model=type:指明模拟出的网卡的型号,ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio;
-net nic,model=?
macaddr=mac:指明mac地址;52:54:00:
-net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]:
通过物理的TAP网络接口连接至vlan n;
script=file:启动虚拟机时要执行的脚本,默认为/etc/qemu-ifup
downscript=dfile:关闭虚拟机时要执行的脚本,/etc/qemu-ifdown
ifname=NAME:自定义接口名称;
/etc/qemu-ifup
#!/bin/bash
#
bridge=br0
if [ -n "$1" ];then
ip link set $1 up
sleep 1
brctl addif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no interface specified."
exit 1
fi
其它选项:
-daemonize:以守护进程运行;
示例1:
~]# qemu-kvm -name c2 -smp 2,maxcpus=4,sockets=2,cores=2 -m 128 -drive file=/images/kvm/cos-i386.qcow2,if=virtio -vnc :1 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup
示例2:
~]# qemu-kvm -name winxp -smp 1,maxcpus=2,sockets=1,cores=2 -m 1024 -drive file=/data/vms/winxp.qcow2,media=disk,cache=writeback,format=qcow2 file=/tmp/winxp.iso,media=cdrom -boot order=dc,once=d -vnc :1 -net nic,model=rtl8139,macaddr=52:54:00:00:aa:11 -net tap,ifname=tap1,script=/etc/qemu-ifup -daemonize
半虚拟化:virtio
建议:Network IO, Disk IO使用virtio,性能会有显著提升;
dnsmasq:
listen-address=192.168.1.132,127.0.0.1
dhcp-range=192.168.1.50,192.168.1.150,48h
dhcp-option=3,192.168.0.1
qemu-kvm -cpu host -m 512 -name cn4 -boot order=dc -drive file=/data/vm1.img,media=disk,if=virtio,cache=writeback,format=qcow2 -vnc :5 -net nic,macaddr=52:54:00:00:00:04,model=virtio -net tap,script=/etc/qemu-ifup -daemonize
http://download.cirros-cloud.net/0.4.0/ 可在此地址下载img镜像系统
创建虚拟机
安装tigervnc
[root@centos7 data]# vncviewer
配置仅主机网络,给虚拟机加入的宿主机网桥配置ip地址即可通信
构建路由模式
宿主机打开核心转发,虚拟机网关指向网桥的ip地址 192.168.30.1
配置虚拟机网关指向宿主机虚拟的网桥地址
打开宿主机核心转发
在宿主机打开sant规则
iptables -t nat -A POSTROUTING -s 192.168.30.0/24 -d 192.168.30.0/24 -j MASQUERADE
3、利用virt-install创建虚拟机并安装guestOS7.x
使用qemu-img 创建磁盘文件
qemu-img create -f qcow2 /var/lib/libvirt/images/centos.qcow2 10G
virt-install --name centos7 --ram 1024 --vcpus=2 --location=/data/centos.iso --disk path=/var/lib/libvirt/images/cenot.qcow2,size=10,format=qcow2 --network bridge=br0 --os-type=linux --os-variant=rhel6 --extra-args='console=ttyS0' --force
name centos7 表示 guest 名称;ram 1024 表示给 guest 分配的内存大小,单位为M; vcpus=2 表示给 guest 分配的虚拟CPU数量; location=/data/CentOS-7iso 指定客户机安装镜像文件; disk path=/opt/centos-6.7-4.qcow2,size=10,format=qcow2 客户端磁盘的位置及格式;network bridge=br0 客户端网卡配置,使用桥接方式 br0 ;os-type=linux 表示系统为linux;os-variant=rhel6 表示系统类型为 rhel6; extra-args=’console=ttyS0’ 表示使用 console ttyS0 进行管理 guest –force