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