qemu-kvm 应用

kvm虚拟化

Kernel-based Virtual Machine

KVM是基于虚拟化扩展 ( Intel VT或者AMD-V ) 的X86硬件,是Linux完全原生的全虚拟化解决方案。部分的准虚拟化支持,主要是通过准虚拟化网络驱动程序的形式用于Linux和Windows客户机系统 ,KVM目前设计为通过可加载的内核模块,支持广泛的客户机操作系统,比如Linux,BSD,Solaris,Windows,Haiku,ReactOS。
在KVM架构中,虚拟机实现为常规的Linux进程,由标准Linux调度程序进行调度。事实上,每个虚拟的CPU显示为一个常规的Linux进程。使这些KVM可以享受Linux内核的所有功能。
KVM本身不执行任何模拟,需要用户空间程序通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的I/O,并将它的视频显示映射回宿主机的显示屏,这个应用程序就是QEMU。

KVM 架构
这里写图片描述

接下来我们就通过qemu-kvm来创建管理虚拟机

首先,我们先确定一下cpu是否支持HVM

grep -E --color=auto "(vmx|svm)" /proc/cpuinfo

如果出现如下信息则表明支持

[root@node2 ~]# grep -E --color=auto "(svm|vmx)" /proc/cpuinfo
flags       : fpu vme de .... vmx(Intel的虚拟化技术) ssse3 fma cx16 ...
flags       : fpu vme de .... vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch epb tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap xsaveopt dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch epb tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap xsaveopt dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch epb tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap xsaveopt dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp
由于是四核cpu 所以显示四行。

接下来,我们装载kvm模块

modprobe kvm
modprobe kvm-intel
然后验证是否装载成功
ls /dev/kvm
安装管理工具栈
yum groupinstall virtualization
yum install qemu-kvm

在安装了kvm-qemu后,qemu-kvm并没有吃现在PATH环境中,那是由于红帽将qemu-kvm的程序文件放在了/usr/libexec/目录下,我们需要创建一个链接,链接至/usr/bin/目录

ln -sv /usr/libexec/qemu-kvm  /usr/bin/qemu-kvm
qemu-kvm的命令选项有如下
标准选项:
    qemu-kvm的标准选项主要涉及主机类型,cpu模式,NUMA,软驱设备,光驱设备等
    -name:设定虚拟机的名字
         Standard PC,ISA-only PC,Intel-Mac等,
         可以使用qemu-kvm -M ? 获得需要类型
    -cpu model:指定cpu类型
    -smp n:指定cpu个数
    -m megs:指定虚拟机内存大小       
    -numa opts:指定模拟多节点的numa设备
    -fd[a|b] file:使用指定文件(file)作为软盘镜像,file为/dev/fd0表示使用物理软驱
        -hd[a|b|c|d] file:指定file为硬盘镜像
        -cdrom file:使用指定file作为CD-ROM镜像,需要注意的是-cdrom和-hdc不能同时使用;将file指定为/dev/cdrom可以直接使用物理光驱
    ◇ -drive:option[,option,option...]指定一个硬盘设备;
        file=/PATH/TO/SOMEFILE:硬件映像文件路径
        if=interface:指定硬盘设备所连接的接口类型,即控制器类型一般有:
            ide、scsi、mtd、floppy、pflash以及virtio
        index=index:设定同一种控制器类型中不同设备的索引号,即标识号
        media=media:定义介质类型为硬盘(disk)还是光盘(cdrom)
        snapshot=snapshot:指定当前硬盘设备是否支持快照功能:on或off
        cache=cache:定义如何使用物理机缓存来访问块数据:
            可用值有none、writeback、unsafe和writethrough四个
        format=format:指定映像文件的格式:
            vvfat vpc vmdk vhdx vdi ssh qcow2 rbd raw host_cdrom...
    ◇ -boot [order=drives][,once=drives][,menu=on|off]
        定义启动设备的引导次序,每种设备使用一个字符表示,在X86架构上:
            a、b表示软盘,c表示第一块硬盘,d表示第一个光驱设备,n-p表示网络适配器
            -boot order=dc,once=d 硬盘引导启动,只有第一次为光驱引导

显示选项:
    显示选项用于定义虚拟机启动后的显示接口相关类型及属性等。
        Ctrl-a, c: 在console和monitor之间切换
        Ctrl-a, h: 显示帮助信息
    -curses:禁止图形接口,并使用curses/ncurses作为交互接口;
    -alt-grab:使用Ctrl+Alt+Shift组合键释放鼠标;
    -ctrl-grab:使用右Ctrl键释放鼠标;
    -sdl:启用SDL
    -vga type:指定要仿真的VGA接口类型,常见类型有:
        cirrus:Cirrus Logic GD5446显示卡
        std:带有Bochs VBI扩展的标准VGA显示卡
        vmware:VMWare SVGA-II兼容的显示适配器
        qxl:QXL半虚拟化显示卡;与VGA兼容;
    -vnc display[,option[,option[,...]]]:
    -monitor stdio:表示在标准输入输出上显示monitor界面

i386平台专用选项:
    -no-acpi:禁用ACPI功能,GuestOSACPI出现兼容问题时使用此选项;
    -balloon none:禁用balloon设备;

网络属性相关选项:
    网络属性相关选项用于定义网络设备接口类型及其相关的各属性等信息
    我只介绍nic、tap、user三中类型网络接口属性
    -net nic[,options]
        vlan=n:连接至vlan n,默认n=0
            macaddr=52:54:00:xx:xx:xx后面6为自己设定,
            新建的虚拟机默认52:54:00:12:34:56 所以我们在创建多个虚拟机时应该自行指定mac地址。
            name=xxx:用于指定一个在监控时显示的网上设备名称:
            i82551、i82557b、i82559er、ne2k_isa、pcnet、rtl8139、e1000、smc91c111、lance及mcf_fec等;
            可以使用“qemu-kvm -net nic,model=?”来获取当前平台支持的类型
        addr=xxx
        vectors=v   
    -net tap[,options]
        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服务器地址
        tftp=dir:激活内置的tftp服务器,并使用指定的dir作为tftp服务器的默认根目录
        bootfile=file:BOOTP文件名称,
            如:qemu -hda linux.img -boot n -net user,tftp=/tftpserver/pub,bootfile=/pxelinux.0
实验环境
windows主机ip: 192.168.1.105/24
Vmware  CentOS 7 主机
开启了cpu虚拟化
ip: 192.168.1.101/24
下载cirros-disk-镜像作为虚拟机镜像
wget  http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img
下载好qemu-kvm
我们启动第一个实例虚拟机
qemu-kvm -name cirros0 -m 256 -smp 2 -drive file=/root/cirros-0.3.4-x86_64-disk.img,if=virtio,cache=writeback -nographic

在启动需要用到网络的虚拟机时,需要用到如下的脚本

创建 /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

创建 /etc/qemu-ifdown 脚本,并给其执行权限
#!/bin/bash
#
bridge=br0
if [ -n "$1" ];then
    brctl delif $bridge $1
    ip link set $1 down
    exit 0
else
    echo "Error: no interface specified."
    exit 1
fi

下面的命令创建了一个名为rhel5.8的虚拟机,其RAM大小为512MB,有两颗CPU的SMP架构,默认引导设备为硬盘,有一个硬盘设备和一个光驱设备,网络接口类型为virtio,VGA模式为cirrus,并启用了balloon功能。
balloon简单来说就是自动扩展或者收缩虚拟机的内存
qemu-kvm -name “rhel5.8” -m 512 \
-smp 2 -boot d \
-drive file=/VM/images/rhel5.8/hda,if=virtio,index=0,media=disk,format=qcow2 \
-drive file=/isos/rhel-5.8.iso,index=1,media=cdrom \
-net nic,model=virtio,macaddr=52:54:00:A5:41:1E \
-vga cirrus -balloon virtio

使用qemu-img管理磁盘映像

        qemu-img是qemu用来实现磁盘映像管理的工具组件,其有许多子命令,分别用于实现不同的管理功能,而每一个子命令也都有一系列不同的选项。其使用语法格式为“qemu-img  subcommand  [options]”,支持的子命令如下。

        ◇   create:创建一个新的磁盘映像文件;
        ◇   check:检查磁盘映像文件中的错误;
        ◇   convert:转换磁盘映像的格式;
        ◇   info:显示指定磁盘映像的信息;
        ◇   snapshot:管理磁盘映像的快照;
        ◇   commit:提交磁盘映像的所有改变;
        ◇   rbase:基于某磁盘映像创建新的映像文件;
        ◇   resize:增大或缩减磁盘映像文件的大小;

使用create子命令创建磁盘映像的命令格式为“create [-f fmt] [-o options] filename [size]”,例如下面的命令创建了一个格式为qcow2的120G的稀疏磁盘映像文件。

        # qemu-img create -f qcow2  /VM/images/rhel5.8/hda 120G
        Formatting '/VM/images/rhel5.8/hda', fmt=qcow2 size=128849018880 encryption=off cluster_size=65536
QEMU-KVM的网络功能
基于网桥的虚拟网卡;-net tap
基于NAT的虚拟网络;
Qemu内置的用户网络模式;-net user
直接分配网络设备(VT-d, SR-IOV)

-net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]
ifname=
script=/path/to/some_script:虚拟机启动时,tap为其创建的Nic的后半段会保留在host上,在host之上通常需要将其添加至某桥上,实现虚拟网络功能;
downscript=/path/to/some_script: 虚拟机关闭时,如果处理此前的启动脚本为其设置网络;

比如说我们要实现一个隔离模型的虚拟机

brctl addbr br0
qemu-kvm -name node1 -m 256 -smp 2 -drive file=/cirros-0.3.4-i386-disk.img,if=virtio,cache=writeback,media=disk,format=qcow2 -net nic,macaddr=52:54:00:11:22:33 -net tap,ifname=virint0,script=/etc/qemu-ifup,downscript=no -nographic
-net tap的ifname制定一个定义在物理机上网络接口,
用它来连接至br0桥,从而使连接在br0桥上的并处于同一网段的主机互通。
进入node1
ifconfig eth0 192.168.2.1/24

qemu-kvm -name node2 -m 256 -smp 2 -drive file=/cirros-0.3.4-i386-disk.img,if=virtio,cache=writeback,media=disk,format=qcow2 -net nic,macaddr=52:54:00:22:33:44 -net tap,ifname=virint1,script=/etc/qemu-ifup,downscript=no -nographic
创建node2虚拟机
进入node2
ifconfig eth0 192.168.2.2/24

这时 node1 ping node2 可以ping通

如果想让虚拟机访问外部网络,我们可以使用NAT 的方法

首先我们先给br0配一个与虚拟机同网段的地址
ifconfig br0 192.168.2.254
然后开启主机核心转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
将虚拟机的默认网关指向br0的地址
设定iptables SNAT规则
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 ! -d 192.168.2.0/24 -j SNAT --to-source 192.168.1.101
这时 虚拟机ping Linux主机或者Windows主机均可达
桥接实现
拆除Linux主机网卡地址
ifconfig ens33 0
创建网桥
brctl addbr br0
将enss33添加至br0上
brctl addif br0 ens33
将原本属于ens33的地址配给br0
ifconfig br0 192.168.1.101
将qemu-kvm创建的虚拟机地址指向与br0相同的网段中
即可完成桥接模式
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值