KVM及其常用命令

KVM及其常用命令

1、验证CPU是否支持硬件虚拟化

egrep "svm|vmx" /proc/cpuinfo

2、Ubuntu 下安装KVM

sudo apt-get install qemu-kvm qemu virt-manager virt-viewer libvirt-bin bridge-utils

输入:kvm-ok 检验是否安装成功

3、启动KVM虚拟机管理界面

sudo virt-manager

4、virt-manager安装虚拟机无法使用键盘解决

     KVM及其常用命令_第1张图片

5、常用命令

virsh list --all                #查看虚拟机状态
virsh edit kvm01                #编辑配置文件
virsh autostart kvm01           #设置物理机开机自动启动虚拟机
virsh dumpxml kvm01 > kvm01.xml #导出虚拟机配置文件
/etc/libvirt/qemu/              #虚拟机配置文件默认目录
/var/lib/libvirt/images/        #默认镜像文件位置 
virsh start kvm01               #开机
virsh shutdown kvm01            #关机(虚拟机需开启acpid服务)
virsh destroy kvm01             #强制开机(断电)
virsh suspend kvm01             #挂起虚拟机
virsh resume kvm01              #恢复挂起的虚拟机
virsh snapshot-create kvm01     #建虚拟机快照(建快照镜像格式要为qcow2格式)
virsh snapshot-list kvm01       #查看虚拟机快照
virsh undefine kvm01            #删除一个虚拟机(会一起删除配置文件,镜像不删除)
virsh define /etc/libvirt/qemu/kvm01.xml                               #重新定义一个虚拟机
virt-clone -o kvm01 -n kvm02 -f  /var/lib/libvirt/images/kvm02.img     #克隆虚拟机
qemu-img info kvm01             #查看虚拟机镜像格式
qemu-img convert -f raw -O qcow2 kvm01.img kvm01.qcow2                 #转换虚拟机镜像格式
qemu-img create -f qcow2  /var/lib/libvirt/images/kvm01-1.img 20G      #新建虚拟机镜像磁盘
virsh attach-disk kvm01 /var/lib/libvirt/images/kvm01-1.img vdb --cache=none --subdriver=qcow2  #在线添加虚拟机镜像硬盘
6、命令行打开虚拟机图形界面(VNC)

sudo virsh vncdisplay cmdtest
sudo vncviewer 127.0.0.1:0


qcow2 、raw、vmdk镜像格式的基本转换

1)vmdk转qcow2

qemu-img convert -f vmdk -O qcow2 SLES11SP1-single.vmdk SLES11SP1-single.img

2)qcow2转raw

qemu-img convert -O qcow2 image-raw.raw image-raw-converted.qcow

3)raw转qcow2

qemu-img convert -f raw centos.img -O qcow2 centos.qcow2

4)转换完成后

转换完成后修改xml文件中的镜像的type

7、通过命令行创建虚拟机

sudo virt-install --connect=qemu:///system --name cmdtest --ram 2048 --vcpus=1 --os-type=linux --accelerate --hvm 
--disk path=/home/mine612/qiuyangjun/ubuntu-16.04/cmd/cmdtest.img,size=8,bus=virtio 
--cdrom /home/mine612/qiuyangjun/ubuntu-16.04/cmd/ubuntu-16.04-desktop-amd64.iso  
--network bridge=ovs,model=virtio --graphics vnc
这里解释一下主要的几个参数含义:
--name            给虚拟机起个名字
--ram             分配给虚拟机的内存,单位MB
--vcpus           分配给虚拟机的cpu个数
--cdrom           指定安装文件的全路径
--disk            指定虚拟机img文件路径,如果虚拟机使用lvm分区,这里就指向到lvm的分区就行
  size            虚拟机文件大小,单位GB
  bus             虚拟机磁盘使用的总线类型,为了使虚拟机达到好的性能,这里使用virtio
  cache           虚拟机磁盘的cache类型
--network bridge  指定桥接网卡
   model          网卡模式,这里也是使用性能更好的virtio
--graphics        图形参数

8、虚拟机的冷迁移

① 导出虚拟机xml文件(配置文件)
   # virsh dumpxml  vm-name > dump.xml  
   vm-name 为你的虚拟机名称
② 拷贝虚拟机磁盘和xml文件(从hostA -> hostB)
   # scp /path-to-image/vm-image  hostB:/root
   # scp dump.xml hostB:/root
   vm-image的默认路径为 /var/lib/libvirt/images/ (libvirt管理的虚拟机)
③ 登录hostB, 修改dump.xml
   根据B的硬件环境,修改dump.xml的文件内容。
   比如中bridge名称,的路径。
④ 加载虚拟机
   # virsh define dump.xml 
   切记不能用virsh create。否则虚拟机关闭后,该虚拟机从虚拟机列表删除。
   如果你要再次使用该虚拟机的话:则必须重新进行create/define操作。

9、KVM与OVS的连接

1)创建OVS网桥

ovs-vsctl add-br ovsbr0

2)编辑xml文件了,输入下面指令

sudo virsh edit ubuntu // 这里的ubuntu就是VM的name
修改内容,如下:
 
     
     
     
     
    
至此便可启动虚拟机
如果不在命令行指定 bridge 为 openvswitch 类型 , libvirt 会尝试 linux 默认的bridge,而virt-install又不支持openvswitch

参考网址:http://www.jianshu.com/p/d26737e40b58

                    http://sdnhub.cn/index.php/libvirt-openvswitch/

10、错误解决

Error : Unable to add bridge br0 port vnet0: Operation not supported
出现这种错误,可能是你安装的libvirt版本太低,不支持openvswitch。建议安装高版本的libvirt,本人测试libvirt-1.1.0不会出现这种错误。
会用到的命令

libvirtd -d         #启动libvirt,开机后必须执行这个命令启动
virsh –version  #查看virsh的版本信息
ovs-vsctl –V     #查看OVS的版本信息

11、OVS的流表操作(ovs-ofctl)

1)显示bridge的信息,连接到bridge上的interface,tap和端口号(port)

ovs-ofctl show switch-name

2)显示flow entries
ovs-ofctl dump-flows switch-name
3)添加flow

ovs-ofctl add-flow ovs-br4 in_port=1,dl_type=0x0800,nw_src=10.108.170.175,nw_dst=10.103.239.97,actions=drop
ovs-ofctl add-flow ovs-br4 idle_timeout=0,priority=0,in_port=1,actions=output:2

in_port:         #switch的端口
dl_src:          #源mac地址
dl_dst:          #目的mac地址
dl_type:         #以太网协议类型 0x0806是arp packet 0x0800是ip packet
nw_src:          #源IP
nw_dst:          #目的ip
nw_proto:        #协议类型 ,注意和dl_type区分,同时也需要和dl_type一起使用,比如dl_type是ip(0x0800),那么nw_proto=1就表示icmp packet
tp_src:          #tcp udp源端口
tp_dst:          #tcp udp目的端口

ip     Same as dl_type=0x0800.
icmp   Same as dl_type=0x0800,nw_proto=1.
tcp    Same as dl_type=0x0800,nw_proto=6.
udp    Same as dl_type=0x0800,nw_proto=17.
arp    Same as dl_type=0x0806.
rarp   Same as dl_type=0x8035.

12、其他(Mininet创建网络及连接控制器)

from mininet.topo import Topo

class MyTopo( Topo ):
    def __init__( self ):
        # initilaize topology   
        Topo.__init__( self )
        # add hosts and switches
        host1 = self.addHost( 'h1' )
        host2 = self.addHost( 'h2' )
        switch1 = self.addSwitch( 's1' )
        switch2 = self.addSwitch( 's2' )
        # add links
	switch3 = self.addSwitch( 's3' )
	switch4 = self.addSwitch( 's4' )
        self.addLink(host1,switch1,1,1)
        self.addLink(switch1,switch2,2,1)
	self.addLink(switch2,switch3,2,1)
	self.addLink(switch2,switch4,3,1)
	self.addLink(switch2,switch4,4,2)
	self.addLink(switch3,host2,3,1)
topos = { 'mytopo': ( lambda: MyTopo() ) }

Mininet连接SDN控制器命令如下:

sudo mn --custom ./mytopo.py --topo mytopo --controller=remote,ip=192.168.32.128,port=6633 --mac



你可能感兴趣的:(SDN)