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


1、前言

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

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

         閑話少說,言歸正傳:

2、試驗環境

硬件:Dell PowerEdge 2CPU 8G MEM

操作系統:Centos 5.5

hypervisor:kvm(Kenerl-based virtulization machine)

3、安裝步驟

3.1 操作系統安裝

這個步驟就不多說了,需要注意的是在安裝過程中,選擇定制功能,在Virtualization下選擇kvm,因為在centos5.5下,虛擬化默認支持xen,安裝完成后,建立虛擬化所需要的包如kvm、kvm-qemu、libvirt、Python等,會自動安裝。

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

virsh -c qemu:///system list

如果顯示一個空列表,說明運行正常。

注: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     <---建立一個格式為qcow2、大小為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那個遠程桌面連接)可以進行相關操作了。

4、總結

       在配置虛擬機的過程中

     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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM