1. 程式人生 > >KVM及其常用命令

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安裝虛擬機器無法使用鍵盤解決

    

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<driver name='qemu' type='raw'/>

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的檔案內容。
   比如<interface>中bridge名稱,<disk>中<source file>的路徑。
④ 載入虛擬機器
   # 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
修改內容,如下:
<interface type='bridge'> 
    <mac address='52:54:00:fc:4e:b6'/> 
    <source bridge='ovsbr1'/> 
    <virtualport type='openvswitch'/> 
    <model type='virtio'/> 
    <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</interface>
至此便可啟動虛擬機器
如果不在命令列指定 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