KVM之初體驗——手動及自動化安裝KVM腳本

一,什麼是KVMpython

      KVM包括不少部件:首先,它是一個Linux內核模塊(如今包括在主線中)用於轉換處理器到一種新的用戶 (guset) 模式。用戶模式有本身的ring狀態集合,可是特權ring0的指令會陷入到管理器(hypervisor)的代碼。因爲這是一個新的處理器執行模型,代 碼不須要任何的改動。   除了處理器狀態轉換,這個內核模塊一樣處理很小一部分低層次的模擬,好比MMU註冊(用於管理VM)和一部分PCI模擬的硬件。 在可預見的將來,Qemu團隊專一於硬件模擬和可移植性,同時KVM團隊專一於內核模塊(若是某些部分確實有性能提高的話,KVM會將一小部分模擬代碼移 進來)和與剩下的用戶空間代碼的交互。 kvm-qemu可執行程序像普通Qemu同樣:分配RAM,加載代碼,不一樣於從新編譯或者調用calling KQemu,它建立了一個線程(這個很重要);這個線程調用KVM內核模塊去切換到用戶模式,而且去執行VM代碼。當遇到一個特權指令,它重新切換會 KVM內核模塊,該內核模塊在須要的時候,像Qemu線程發信號去處理大部分的硬件仿真。 這個體系結構一個比較巧妙的一個地方就是客戶代碼被模擬在一個posix線程,這容許你使用一般Linux工具管理。若是你須要一個有2或者4核的虛擬 機,kvm-qemu建立2或者4個線程,每一個線程調用KVM內核模塊並開始執行。併發性(若果你有足夠多的真實核)或者調度(若是你無論)是被通用的 Linux調度器,這個使得KVM代碼量十分的小 當一塊兒工做的時候,KVM管理CPU和MEM的訪問,QEMU仿真硬件資源(硬盤,聲卡,USB,等等)當QEMU單獨運行時,QEMU同時模擬CPU和 硬件。linux

2、KVM架構ubuntu

kvm基本結構有2個部分構成:vim

    kvm 驅動,如今已是linux kernel的一個模塊了。其主要負責虛擬機的建立,虛擬內存的分配,VCPU寄存器的讀寫以及VCPU的運行。安全

    另個組成是Qemu,用於模擬虛擬機的用戶空間組件,提供I/O設備模型,訪問外設的途徑。bash

wKiom1anbZXQ-MYYAADARdvbDoU668.png


3、KVM 工做原理網絡

kvm基本工做原理概述:架構

    用戶模式的qemu利用libkvm經過ioctl進入內核模式,kvm模塊未虛擬機建立虛擬內存,虛擬CPU後執行VMLAUCH指令進入客戶模 式。加載Guest OS並執行。若是Guest OS 發生外部中斷或者影子頁表缺頁之類的狀況,會暫停Guest OS的執行,退出客戶模式出行異常處理,以後從新進入客戶模式,執行客戶代碼。若是發生I/O事件或者信號隊列中有信號到達,就會進入用戶模式處理。(如 下圖)併發


wKioL1anbITBOK8RAAFSyoiGZ9k918.png


4、手動安裝配置KVMide

1.安裝前的準備
    1.CPU支持虛擬化(Inter-VT、AMD-V)
    [root@localhost ~]# grep --color 'svm|vmx|lm'  /proc/cpuinfo

    相關CPU功能標誌包括:   
    svm=安全虛擬機(AMD-V)
    vmx=虛擬機x86(Inter-VT)
    lm=長模式(64位支持)	
    
    2. BIOS開啓CPU虛擬化支持
    1)重啓
    2)按delete鍵
    3) 進入BIOS開啓
    
2.安裝虛擬化(yum配置完畢)
# yum -y install kvm python-virtinst libvirt bridge-utils 
virt-manager qemu-kvm-tools virt-viewer virt-v2v qemu-kvm tunctl
[root@localhost ~]#vim /etc/sysconfig/selinux //關閉selinux
SELINUX=disabled

3.啓動libvirtd
[root@localhost ~]# /etc/init.d/libvirtd start  //啓動
[root@localhost ~]# ps -e|grep libvirtd   //查看是否啓動
[root@localhost ~]#chkconfig libvirtd on
註釋:永久開啓!否則系統重啓後不會自動啓動這個服務的喲~
# virsh  iface-bridge eth0 br0
註釋:建立網絡橋!
驗證:
ifconfig   br0
註釋:觀察IP地址是否跑到了br0網卡上!

4.配置網絡橋接
root@localhost network-script]# vi ifcfg-eth0 
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
BRIDGE=br0

[root@localhost network-scripts]# vi ifcfg-br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.100
GATEWAY=192.168.0.1
NETMASK=255.255.255.0
DNS1=192.168.0.1
DELAY=0

5.重啓網絡
[root@localhost]# service NetworkManager stop  //這個關閉掉就行
中止 NetworkManager 守護進程:                             [肯定]
註釋:爲何關閉它呢~由於它和KVM橋接網卡衝突!
#chkconfig NetworkManager off 
註釋:永久關閉該服務!!!否則系統重啓後還會本身再把這個服務開啓的喲~
[root@localhost rules.d]# service network restart

6.用virt-install生成.img文件(參數含義在上一篇KVM初體驗已有註釋)
# virt-install --name=ubuntu1 
--ram 1024 --vcpus=1 
--disk path=/root/ubuntu1.img,size=10 
 --accelerate --cdrom /root/redhat6.4.iso 
--graphics vnc,port=5920 --network bridge=br0
[root@localhost ~]# vi /etc/libvirt/qemu.conf 
vnc_listen = "0.0.0.0"
user = "root"               //去掉註釋
group = "root"              //去掉註釋
dynamic_ownership = 0       //去掉註釋,把1改成0

7.啓動虛擬機
虛擬機使用方法:
virsh  destroy       虛擬機名        #關閉虛擬機
virsh  undefine      虛擬機名        #刪除虛擬機
virsh  start         虛擬機名        #開啓虛擬機
virsh   list   --all 顯示全部虛擬機
virsh   console      虛擬機名        #鏈接虛擬機

手動安裝完畢,如今就能夠在命令行裏秀操做了。


5、自動化腳本安裝KVM

#!/bin/bash
echo "[1] 配置YUM"
echo "[2] 安裝KVM工具"
echo "[3] 設置橋接"
echo "[4] 手動安裝虛擬機"
echo "[5] 查看虛擬機"
echo "[6] 開啓虛擬機"
echo "[7] 關閉虛擬機"
echo "[8] 鏈接虛擬機"
echo "[9] 自動安裝虛擬機"
echo "[0] 退出"
read -p "type:"  NUM
if [ $NUM = 0 ];then
exit;
elif [ $NUM = 1 ];then
#配置YUM
    rm -rf /etc/yum.repos.d/*;
cat > /etc/yum.repos.d/yum.repo << EOF
[yum]
name=yum
enabled=1
gpgcheck=0
baseurl=ftp://192.168.0.200/rhel6.4
EOF
elif [ $NUM = 2 ];then
#安裝KVM工具
     LANG=en yum groupinstall "Virtualization*" -y;
elif [ $NUM = 3 ];then
#設置橋接
    chkconfig NetworkManager off;
    chkconfig network on;
    service NetworkManager stop;
    service network start;
    yum install  "bridge-utils" -y;
    service libvirtd restart;
    chkconfig libvirtd on;
    virsh iface-bridge eth0 br0;
elif [ $NUM = 4 ];then
#安裝虛擬機
    read -p "輸入虛擬機的名字:"  NAME
    read -p "輸入虛擬及硬盤大小(G): "  SIZE
    read -p "輸入虛擬機內存大小(M): "  MEM
    ping -c 1 192.168.0.200 > /dev/null
    if [ $? -ne 0 ];then
    echo "沒法接連192.168.0.200,請檢查網絡!";
    exit;
    fi
    virt-install --nographics -n $NAME --os-type=linux --os-variant=rhel6 -r $MEM --arch=x86_64 --vcpus=1 --disk path=/var/lib/libvirt/p_w_picpaths/$NAME,size=$SIZE,format=qcow2 -w bridge=br0 -l ftp://172.16.8.100/rhel6.4 -x " console=ttyS0";
elif [ $NUM = 5 ];then
#查看虛擬機
virsh list --all
elif [ $NUM = 6 ];then
#開機
read -p "虛擬機名稱: " XNAME
virsh start $XNAME;
elif [ $NUM = 7 ];then
#關閉
read -p "虛擬機名稱: " XNAME  &> /dev/null
virsh destroy $XNAME;
elif [ $NUM = 8 ];then
#鏈接虛擬機
read -p "虛擬機名稱: " XNAME
virsh console $XNAME;
elif [ $NUM = 9 ];then
#自動安裝虛擬機
read -p "輸入虛擬機的名字:"  NAME
        read -p "輸入虛擬及硬盤大小(G): "  SIZE
        read -p "輸入虛擬機內存大小(M): "  MEM
        ping -c 1 192.168.0.200 > /dev/null
        if [ $? -ne 0 ];then
        echo "沒法接連192.168.0.200,請檢查網絡!";
        exit;
        fi
        virt-install --nographics -n $NAME --os-type=linux --os-variant=rhel6 -r $MEM --arch=x86_64 --vcpus=1 --disk path=/var/lib/libvirt/p_w_picpaths/$NAME,size=$SIZE,format=qcow2 -w bridge=br0 -l ftp://192.168.0.200/rhel6.4 -x "ks=ftp://192.168.0.200/rhel6.4.ks console=ttyS0";


else
echo "請輸入:0~9數字!";
fi

注:此腳本已基本實現KVM自動化安裝的基本功能。

總結:

    其實KVM的安裝和使用都很方便簡單的,你們要理解KVM各個參數的含義。最關鍵的就是KVM的網絡橋接的設置,可是如今KVM在某些方面仍是有必定的缺陷(好比建立光驅要關機等),但願會在後續版本中有所改進,在這裏你們要多看官方軟件自身的文檔,會有很大的幫助。

相關文章
相關標籤/搜索