基於KVM創建虛擬機的步驟及總結說明

一、前言

        目前正在涉足雲計算IaaS工做,虛擬化是IaaS的重要部分,所以這段時間對各個虛擬機化技術和工具進行研究,研究的目的不只僅是爲了會使用這個工具,而是經過研究瞭解技術的實現機制和原理,即知其然也要知其因此然,本文主要算是本人進入這個技術領域的入門的開始,在記錄本身的進展的同時,但願對有相似追求的同仁有所幫助。爲了更明晰各個步驟,安裝步驟不採用圖形方式。linux

         KVM(不是鍵盤、顯示器、鼠標)是一個基於Linux內核的虛擬化工具,具體的原理正在研究。ubuntu

         閒話少說,言歸正傳:windows

二、試驗環境

硬件:Dell PowerEdge 2CPU 8G MEMcentos

操做系統:Centos 5.5api

hypervisor:kvm(Kenerl-based virtulization machine)服務器

三、安裝步驟

3.1 操做系統安裝

這個步驟就很少說了,須要注意的是在安裝過程當中,選擇定製功能,在Virtualization下選擇kvm,由於在centos5.5下,虛擬化默認支持xen,安裝完成後,創建虛擬化所須要的包如kvm、kvm-qemu、libvirt、Python等,會自動安裝。網絡

安裝完成後,可使用virsh命令檢查一下虛擬化環境是否正常,具體命令以下:dom

virsh -c qemu:///system listide

若是顯示一個空列表,說明運行正常。函數

注:virsh命令是libvirt庫提供的一個命令行工具,能夠用來管理虛擬機。libvirt是什麼?呵呵,這個但是個重要的東東,我將專門用一篇文章進行說明。

3.2 網絡配置

操做系統安裝完成支持虛擬化相關包後,會自動創建一個名稱爲virbr0的虛擬網橋,在多網卡狀況下,此網橋默認與eth1網卡綁定。爲了向虛擬機提供聯網功能,KVM使用virbr0做爲默認網絡設備,所以在實際應用中,須要將virbr0與鏈接到實際網絡的網卡綁定,例如個人是eth0。

具體方法是修改/etc/sysconfig/network-scripts目錄下的網卡配置文件,如綁定etho,則修改ifcfg-eth0 和ifcfg-virbr0

   修改後的配置文件內容以下:

   1)ifcfg-eth0

      DEVICE=eth0
      ONBOOT=yes
      BRIDGE=virbr0
      BOOTPROTO=dhcp
      TYPE=Ethernet

   2)ifcfg-virbr0
      
      DEVICE=virbr0
      TYPE=Bridge 
      ONBOOT=yes
      DELAY=0
      BOOTPROTO=none
      IPADDR=10.100.0.3
      NETMASK=255.255.255.0
      GATEWAY=10.100.0.254     

    修改完成後,從新啓動網絡服務:service network restart
   默認的virbr0設置保存在/etc/libvirt/qemu/networks目錄下,裏面有一個default.xml文件,裏面是virbr0的默認配置。

注:虛擬網橋由bridge-utils包中的brctl工具創建,這個包在安裝虛擬化相關的包後自動安裝, 使用brctl addbr 網橋名稱能夠增長網橋,使用brctl show顯示已有網橋

3.3 創建虛擬機使用的文件

服務器上創建虛擬機的機制與在PC機上使用VMware Workstation、VirtualBox創建虛擬機相似,每一個虛擬機均使用一個物理文件保存其安裝的系統,模擬成磁盤,用來安裝guest 操做系統,此文件能夠先建好並格式化爲一個專門的虛擬化文件格式(如qcow2),也能夠在創建虛擬機的過程當中指定,由虛擬機構建程序自動生成。

虛擬機使用的文件能夠先以qemu-img命令先建好,也能夠在經過使用virt-manager 、 virt-install創建虛擬機時創建,下面是使用qemu-img的語法:

   qemu-img create -f qcow2 win7.img 20G     <---創建一個格式爲qcow二、大小爲20G的文件 
   
   創建完成後,顯示:Formatting 'win7.img', fmt=qcow2, size=20971520 kB

   可使用下面的命令檢查文件格式:
   
A、file win7.img
Win7.img: x86 boot sector; partition 1: ID=0x7, active, starthead 32, startsector 2048, 204800 sectors; partition 2: ID=0x7, starthead 223, startsector 206848, 40751104 sectors
B、qemu-img info win7.img
      image: VM-Win7-1.img
      file format: raw
      virtual size: 20G (20971520000 bytes)
      disk size: 20G
備註:虛擬文件的格式有許多種,將在獨立的文章中說明和分析。

3.4 創建虛擬機

完成上述的準備後,能夠創建虛擬機了,這裏使用virt-install命令完成本項工做。命令以下:

virt-install --name VM-Win7-2 \ 
                --hvm      \
                --ram 512  \ 
                --vcpus 2        \
                --disk path=/opt/images/win7.img,size=20 \
                --network network:default --accelerate \
                --vnc --vncport=5911 \
                --os-variant rhel5.4 \
                --cdrom /opt/ISO/windows7.iso -d
    
各個參數的意義以下 :
     
    --name   虛擬機名稱
    --hvm     使用全虛擬化(與para-irtualization向對),若是在一個主機上para和full virtulization都可用,鏈接到沒有硬件虛擬化支持的機器的xen hypervisor,這個                            參數無效,這個參數意味着鏈接到基於qemu的hypervisor
    --ram      虛擬機內存大小
    --vcpus   虛擬機虛擬CPU個數
    --disk      虛擬機使用的磁盤(文件)的路徑,本例中使用第3步中創建的文件,文件放置在/opt/images目錄下
    --network 網絡設置,使用默認設置便可,默認設置爲使用第1步中說明的virbr0網橋
    --vnc     設置鏈接桌面環境的vnc端口,本例是5911
    --os-variant  指示爲一個特定的操做系統變體(或版本)進一步優化客戶機(guest)配置
    --cdrom   設置光驅獲取虛擬光驅文件的路徑 -d 指示從光驅啓動( -c 指示從硬盤啓動)

上面命令執行後,顯示一連串提示,主要是創建虛擬機的進度和根據命令參數造成的虛擬機配置,虛擬機配置文件用xml文件存儲,經過查看這個過程,可以對創建虛擬機過程有個比較直觀的瞭解,下面是上述命令的的輸出:

Thu, 17 Nov 2011 18:19:49 DEBUG    Requesting libvirt URI default              說明:請求鏈接默認URI,基於kvm hypervisor URI爲 qemu:///system
Thu, 17 Nov 2011 18:19:49 DEBUG    Received libvirt URI 'qemu:///system'
Thu, 17 Nov 2011 18:19:49 DEBUG    Requesting virt method 'hvm'              說明:使用full虛擬化
Thu, 17 Nov 2011 18:19:49 DEBUG    Received virt method 'hvm'
Thu, 17 Nov 2011 18:19:49 DEBUG    Hypervisor name is 'kvm'
Thu, 17 Nov 2011 18:19:49 DEBUG    parse_disk: returning ('/opt/images/win7.img', None, None, 'disk', None, False, False, 20.0, True, None)
Thu, 17 Nov 2011 18:19:49 DEBUG    Setting os type to 'linux' for variant 'rhel5.4'    說明:設置基於rhel linux變體進行優化
Thu, 17 Nov 2011 18:19:49 DEBUG    DistroInstaller location is a local file/path: /opt/ISO/windows7.iso
Thu, 17 Nov 2011 18:19:49 DEBUG    Setting size for existing storage to '2.38835525513'
Thu, 17 Nov 2011 18:19:49 DEBUG    Detected storage as type 'file'      
      
Starting install...
Thu, 17 Nov 2011 18:19:49 DEBUG    Setting size for existing storage to '2.38835525513'
Thu, 17 Nov 2011 18:19:49 DEBUG    Detected storage as type 'file'
Creating storage file...                                                                                                                        |  20 GB     00:00     
    Thu, 17 Nov 2011 18:19:49 DEBUG    Creating guest from:
   
      <domain type='kvm'>                --說明:如下是虛擬機的配置文件,術語「domain」指虛擬機
        <name>VM-Win7-2</name>
        <currentMemory>524288</currentMemory>
        <memory>524288</memory>
        <uuid>8da64796-97aa-a6ae-5ecb-30a312139c19</uuid>
        <os>
          <type arch='x86_64'>hvm</type>
          <boot dev='cdrom'/>
        </os>
        <features>
          <acpi/><apic/><pae/>
        </features>
        <clock offset="utc"/>
        <on_poweroff>destroy</on_poweroff>
        <on_reboot>destroy</on_reboot>
        <on_crash>destroy</on_crash>
        <vcpu>2</vcpu>
        <devices>
          <emulator>/usr/libexec/qemu-kvm</emulator>
          <console type='pty'/>
          <disk type='file' device='disk'>
            <driver name='qemu' cache='none'/>
            <source file='/opt/images/win7.img'/>
            <target dev='vda' bus='virtio'/>
          </disk>
          <disk type='file' device='cdrom'>
            <source file='/opt/ISO/windows7.iso'/>
            <target dev='hdc' bus='ide'/>
            <readonly/>
          </disk>
          <interface type='network'>
            <source network='default'/>
            <mac address='54:52:00:1b:bc:d0'/>
            <model type='virtio'/>
          </interface>
          <input type='mouse' bus='ps2'/>
          <graphics type='vnc' port='5911' keymap='en-us'/>
        </devices>
      </domain>
      
      Creating domain...                                                                                                                              |    0 B     00:01     
      Thu, 17 Nov 2011 18:19:50 DEBUG    Created guest, looking to see if it is running  說明:創建完成guest,查看其是否正在運行
      Thu, 17 Nov 2011 18:19:50 DEBUG    Launching console callback
      Thu, 17 Nov 2011 18:19:50 DEBUG    Saving XML boot config:
      <domain type='kvm'>
        <name>VM-Win7-2</name>
        <currentMemory>524288</currentMemory>
        <memory>524288</memory>
        <uuid>8da64796-97aa-a6ae-5ecb-30a312139c19</uuid>
        <os>
          <type arch='x86_64'>hvm</type>
          <boot dev='hd'/>
        </os>
        <features>
          <acpi/><apic/><pae/>
        </features>
        <clock offset="utc"/>
        <on_poweroff>destroy</on_poweroff>
        <on_reboot>restart</on_reboot>
        <on_crash>restart</on_crash>
        <vcpu>2</vcpu>
        <devices>
          <emulator>/usr/libexec/qemu-kvm</emulator>
          <console type='pty'/>
          <disk type='file' device='disk'>
            <driver name='qemu' cache='none'/>
            <source file='/opt/images/win7.img'/>
            <target dev='vda' bus='virtio'/>
          </disk>
          <disk type='file' device='cdrom'>
            <target dev='hdc' bus='ide'/>
            <readonly/>
          </disk>
          <interface type='network'>
            <source network='default'/>
            <mac address='54:52:00:1b:bc:d0'/>
            <model type='virtio'/>
          </interface>
          <input type='mouse' bus='ps2'/>
          <graphics type='vnc' port='5911' keymap='en-us'/>
        </devices>
      </domain>
      
      
      (virt-viewer:10164): Gtk-WARNING **: cannot open display:  
      Thu, 17 Nov 2011 18:19:53 DEBUG    Domain state after install: 1
      Domain installation still in progress. You can reconnect to 
      the console to complete the installation process.       

       後面的錯誤指示virt-viewer 不能經過 5911鏈接vnc,這與vnc的設置有關,可是這不影響虛擬機繼續安裝操做系統和運行,經過這個錯誤能夠看到virt-install在生產虛擬機的最後調用virt-viewer打開虛擬機圖形界面,進行操做系統的安裝,能夠經過vnc或者virt-manager打開虛擬機圖形界面,繼續完成guest操做系統的安裝便可,vnc能夠安裝realVNC。

       經過vnc客戶端或者virt-manager鏈接到新創建的虛擬機,繼續進行虛擬機內操做系統的安裝,安裝過程與在物理機上安裝相同,不在贅述。安裝完操做系統後,就像擁有了另外一臺機器同樣,經過VNC遠程鏈接(若是裝的是Windows操做系統,也可使用RDP進行鏈接,就windows那個遠程桌面鏈接)能夠進行相關操做了。

四、總結

       在配置虛擬機的過程當中

     1)上述工做,在virt-manager中能夠經過圖形嚮導界面也能夠完成,virt-manager能夠經過在終端中輸入virt-manager或者從菜單應用程序->系統工具中打開

     2)使用qemu-kvm 命令也能夠創建虛擬機【libvirt api中應該也提供了相似的函數,openstack、eucalyptus之類的虛擬機管理(也稱爲雲計算管理)工具調用這個函數創建虛擬機】

        命令以下:
        qemu-kvm -m 1024 -localtime -M pc -smp 1 -drive file=/opt/images/Win7.img,cache=writeback,boot=on -net nic,macaddr=52:54:00:12:34:80 -net tap -cdrom /opt/ISO/Windows7.iso -boot d -name win7,process=kvm-win7 -vnc :2 -usb -usbdevice tablet

        參數說明以下:
              -m 1024  設置虛擬系統內存1024MB
              -localtime  使虛擬系統與宿主系統時間一致
              -M pc  虛擬系統類型爲pc
              -smp 1  1個CPU
              -drive file=Windows7_x86.img,cache=writeback,boot=on
                     硬盤選項,虛擬磁盤是Windows7_x86.img,cache方式爲writeback,可引導型磁盤。
              -net nic,macaddr=52:54:00:12:34:80  網卡選項,手工指定mac地址。
              -net tap  tap類型網絡,至關於「橋模式」
              -cdrom Windows7.iso  光驅
              -boot d  啓動順序。d表明光驅。
              -name kvm-win7,process=kvm-win7  爲虛擬機取名,便於識別
              -vnc :2  這裏是經過vnc鏈接控制窗口,這裏是在5902端口。
              -usb -usbdevice tablet  啓用usb設備中的tablet功能。開啓該功能可以使虛擬機內外的鼠標同步

        參數與virt-install基本相同。
 
        在安裝了磁盤和網卡的半虛擬化驅動後,能夠在-drive中加入if=virtio使用磁盤半虛擬化,在-net nic中加入model=virtio使用網卡半虛擬化驅動。virio在kenerl 2.6.24以上版本才能更好的發揮效用。

    3)其實不管用哪一種方法創建的基於kvm的虛擬機,都由qemu-kvm進行啓動和管理,下面是查看liunx進程顯示的一個虛擬機進程:

         qemu-kvm -S -M rhel5.4.0 -m 1024 -smp 2 -name VM-win7 -uuid 71c4020b-ca54-20f2-780c-ec9fa070aa84 -no-kvm-pit-reinjection -monitor pty -pidfile /var/run/libvirt/qemu//VM-ubuntu-1104.pid -boot c -drive file=/opt/images/ubuntu-11.04-desktp.img,if=virtio,index=0,boot=on,cache=none -drive file=,if=ide,media=cdrom,index=2 -net nic,macaddr=54:52:00:0a:55:05,vlan=0,model=virtio -net tap,fd=17,script=,vlan=0,ifname=vnet0 -serial pty -parallel none -usb -vnc 0.0.0.0:11 -k en-us

         一個虛擬機佔用一個進程,能夠經過進程管理和控制虛擬機。

     4)虛擬機個相關配置保存在一個配置文件中,所以能夠手工能夠編寫一個配置文件,而後經過virsh命令行構建虛擬機,已建好的虛擬機,配置文件更改後,須要用virsh define從新定義後才能生效。

     5)基於KVM創建的虛擬機相關文件默認存放位置
         kvm虛擬機配置文件位置/etc/libvirt/qemu/      <---都是xml文件
         kvm虛擬機文件位置:var/lib/libvirt/images/   <---能夠在創建虛擬機時指定    

     6)創建的虛擬機在運行時相關文件及存放位置
        在虛擬機運行時,會在/var/run/libvirt/qemu目錄下存放虛擬機的pid文件和配置文件,配置文件與/etc/libvirt/qemu目錄下對應的虛擬機文件相同,pid文件保存有此虛擬機進程號。虛擬機的日誌文件存放在/var/log/libvirt/qemu目錄下,每一個虛擬機一個,文件名稱爲:虛擬機名稱(或UUID)+「.log」

     7)qemu不使用linux下的vncserver提供vnc服務,所以在此服務沒有啓動的狀況下,也能經過vnc客戶端鏈接到虛擬機。

 

       經過上面的配置驗證,說明在服務器上的虛擬化與桌面上的虛擬化在原來上基本相同,都是經過相關配置構建一個虛擬機,這個虛擬機的各種外設如磁盤、內存、CPU、網卡等經過都是對物理資源虛擬而得到,造成一個邏輯上的計算機,並經過一個文件進行保存。區別是桌面上的虛擬化採用的是軟件模擬,服務器上則實現機制不少,由不依賴與操做系統(bare metal)的VMware ESX、Microsoft Hyper-V,也有與操做系統集成的kvm,還有同時提供bare metal機制,又須要一個操做系統對虛擬機進行管理的xen等,這些東西都稱之爲hypervisor。其實對於用戶來講都是透明的,他們不須要知道其使用的虛擬機是採用何種方式實現的。

http://blog.csdn.net/starshine/article/details/6990599

相關文章
相關標籤/搜索