KVM的qemu-kvm使用


 
KVM:
kvm,x86支持硬件輔助虛擬化技術(hvm)
grep -E "(vmx|svm)" /proc/cpuinfo
[root@dmsag ~]# ll /dev/kvm
crw-rw-rw- 1 root kvm 10, 232 Dec  4 19:14 /dev/kvm
查看內核模塊信息
modinfo kvm
modinfo kvm-intel
裝載模塊並查看(裝載kvm模塊就會順帶裝載kvm-intel模塊)
[root@dmsag ~]# modprobe kvm
[root@dmsag ~]# lsmod |grep kvm
kvm_intel             174841  0
kvm                   578518  1 kvm_intel
irqbypass              13503  1 kvm
    管理工具棧:
        qemu-kvm (只能單機創建虛機不能跨主機創建)
        libvirt (通用工具)
    管理Kvm虛擬的方案:
        qemu::由於這個工具不是紅帽推薦使用的支持力度比較小,安裝了qemu-kvm后,它的默認路徑/usr/libexec/  (使用需要創建鏈接)
        libvirt::
            安裝工具
                virt-install (命令行安裝)
                virt-manager(圖形安裝)
            管理工具:
                virsh
                virt-manager
                virt-viewer 
 
使用qemu管理虛機 更接近底層管理。
 安裝qemu-kvm
yum install qemu-kvm qemu-img -y
創建鏈接指向到默認路徑
[root@dmsag ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin//usr/bin/qemu-kvm’ -> ‘/usr/libexec/qemu-kvm’
查看qemu的使用幫助
qemu-kvm -h
qemu-kvm :
qemu-kvm 【options】 【disk_image】
 
qemu-kvm使用文檔
 

1.使用qemu-kvm管理kvm虛擬機

qemu是一個廣泛使用的開源計算機仿真器和虛擬機,當作為仿真器時,可以再一種架構(如PC機)下運行另一種架構(如RAM)下的
操作系統和程序,而通過動態轉換,其可以獲得很高的運行效率,當作為一個虛擬機時,qemu可以通過直接使用真機的系統資源,
讓虛擬系統能夠獲得物理機的性能表現,qemu支持xen或者kvm模式下的虛擬化,當用kvm時,qemu可以虛擬x86,服務器和嵌入式
powerpc,以及s390的系統。
 
qemu當運行於主機架構相同的目標架構時可以使用kvm,例如,當在一個x86兼容處理器上運行qemu-system-x86時,
可以利用KVM加速為宿主機和客戶機提供更好的性能。
 

2.qemu有如下幾個部分組成

  • 處理器模擬器(x86,PowerPC和Sparac)
  • 仿真設備(顯卡,網卡,硬盤,鼠標等)
  • 用於將仿真設備連接至主機設備(真實設備)的通用設備
  • 模擬機的描述信息
  • 調試器
  • 與模擬器交互的用戶接口
 

3.使用qemu-kvm安裝guest

基於libvirt的工具如virt-manager和virt-install 提供了非常便捷的虛擬機管理接口,但他們事實上經二次開發后又封裝了qemu-kvm的工具,因此,直接使用qemu-kvm命令也能夠完成此前的任務。
 
Standard options: 標准選項(虛擬機自身,名字 cpu 內存)
  • -name 設定虛擬機的名稱
  • -M machine: 指定要模擬的主機類型,如standard PC,ISA-only,PC或Intel-Mac等  可以使用 qemu-kvm -M ? 查看支持的類型
  • -cpu  指定的不是cpu的顆數,而是指定cpu的類型,可以使用qemu-kvm -cpu ? 查看支持的cpu類型
    • -smp  設定模擬器的SMP架構中CPU的個數等,每個cou的核心數及cpu的socket數目等,pc機上最多可以模擬255顆cpu,maxcpus用於指定熱插入的cpu個數上限
  •  -numa opts: 指定模擬多結點的numa設備
  •  -fda file
  •  -fdb file  使用指定文件(file)作為軟盤鏡像,file為/dev/fd0 表示使用物理軟驅:
  •  -hda file
  •  -hdb file
  •  -hdc file
  •  -hdd file
  •  -cdrom file : 使用指定file作為CD-ROM鏡像,需要注意的是-cdrom和-hdc不能同時使用:將file指定為/dev/cdrom可以直接使用物理光驅
  •  -drive option[,option[,option[....]]]:定義一個硬盤設備:可用子選項有很多。
            file=/path/to/somefile :硬盤映像文件路徑
            if=interface: 指定硬盤設備所連接的接口類型,即控制器類型,如ide,scsi,sd,mtd,floppy,pflash及virtio等:
            index=index:設定同一種控制器類型中不通設備的索引號,即標識號:
            media=media:定義介質類型為硬盤(disk)還是光盤(cdrom)
            snapshot=snapshot:指定當前硬盤設備是否支持快照功能:on或off
            cache=cache:定義如何使用物理機緩存來訪問塊數據,其可用值有none,writeback,unsafe和writethrough(通寫)
            format=format:指定映像文件的格式,具體格式可參見qemu-img命令
  •  -boot [order=drivers][,once=drives][,menu=on|off] :定義設備的引導次序,每種設備使用一個字符表示,不通的架構所支持的設備及其表示字符不盡相同,在x86PC架構上,a、b表示軟驅,c表示第一塊硬盤,d表示第一個罐區設備,n-p表示網絡適配器,默認為硬盤設備。
 
Block device options: 塊設備選項  (磁盤)
USB options:  USB選項
Display options:  顯示選項  
  • -nographic:默認情況下,qemu使用SDL來顯示VGA輸出,而此選項用於禁止圖形接口,此時qemu類似一個簡單的命令行程序,其仿真串口設備將被重定向到控制台。
  • -curses:禁止圖形接口,並使用curses/ncurses作為交互接口
  • -alt-grab:使用ctrl+alt+shift組合鍵釋放鼠標鍵
  • -sdl: 啟用SDL  sdl:Simple DriectMeadia Layer: c語言開發,跨平台且開源多媒體程序庫文件:在qemu 中使用 -sdl 即可
  • -spice option[,option[...]]:啟用spice遠程桌面協議:其有許多子選項,具體請參照qemu-kvm手冊
  • -vga type:指定要仿真的VGA接口類型常見的類型有:
                cirrus: cirrus logic GD5446顯示卡
                    std: 帶有bochs VBI擴展的標准VGA顯示卡:
                vmware: VMware SVGA-II 兼容的顯示適配器:
                qxl:QXL半虛擬化顯示卡:與VGA兼容,在GUEST中安裝qxl驅動后能以很好的方式工作,在使用spice協議時推薦使用此類型
                none: 禁用VGA卡;
  • -vnc display[,option[,....]]:默認情況下,qemu使用SDL顯示VGA輸出:使用-vnc選線,可以讓qemu監聽在vnc上,並將VGA輸出重定向到VNC會話,使用此選項時,必須使用-k選項指定鍵盤布局類型,其有許多子選項,具體參考qemu-kvm的手冊
        display:
            1)host:N
                172.16.100.7:1,監聽於172.16.100.7主機的5900+N的端口上
            2)unix:/path/to/socket_file
            3)none
        options:
            password:連接時需要驗證密碼:設定密碼通過monitor接口使用change
            reverse:“反向”連接至某處於監聽狀態的vncview上:
        -monitor stdio:表示在表輸入輸出上顯示monitor界面
        -nographic
            ctrl-a,c:在console和monitor之間切換
            ctrl-a,h:顯示幫助信息
i386 target only:    x86平台上的專用選項
  • -no-acpi:禁用ACPI功能GuestOS與ACPI出現兼容問題時使用此選項
  • -balloon none:禁用balloon設備
  • -balloon virtio[,addr=addr]:啟用virtio balloon設備
Network options:    網絡選項
網絡屬性相關選項用於定義網絡設備接口類型及其相關的各屬性等信息,這里只介紹nic,tap和user三種類型網絡接口的屬性,其他類型參考kvm-qemu手冊
  • -net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]:
創建一個新的網卡設備並連接至vlan n中,pc架構上默認的NIC為e1000,macaddr用於為其制定MAC地址,name用於指定一個在監控時顯示的網上設備名稱:emu可以模擬多個類型的網卡設備,如virtio,i82551,i82557b,i82559er,ne2k_isa,pcnet,rtl18139,e1000,smc91c111,lance及macf_fec等:不過,不同平台架構上,其支持的類型可能只包含前述列表的一部分,可以使用“qemu-kvm -net nic,model=?”來獲取當前平台支持的類型:
  • -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]:通過物理機的TAP網絡接口連接至vlan n中,使用script=file指定的腳本(默認為/etc/qemu-ifup)來配置當前網絡接口,並使用downscript=file指定的腳本(默認為/etc/qemu-ifdown)來撤銷接口配置:使用script=no和downscript=no可分別用來禁止執行腳本:
  • -net user[,option][,option][,...]:在用戶模式配置網絡棧:其不依賴於管理權限:有效選項有:
            vlan=n:連接至vlan n,默認n=0
            name=name:指定接口的顯示名稱,常用語監控模式中:
            net=addr[/mask]:設定GusetOS可見的IP網絡,掩碼可選,默認為10.0.2.0/8;
            host=addr:指定GuestOS中看到的物理機的IP地址,默認為網絡中的第二個,即x.x.x.2
            dhcpstart=addr:指定DHCP服務地址池中16個地址的起始IP,默認為第16個第31個,即x.x.x.16-x.x.x.31
            dns=addr:指定GuestOS可見的dns服務器地址,默認為GuestOS網絡中的第三個地址,即x.x.x.3
            tftp=dir:激活內置的tftp服務器,並使用指定的dir作為tftp服務器的默認根目錄
            bootfile=file  BOOTP文件名稱,用於實現網絡引導GuestOS,如:qemu -hda linux.img -boot n -net user,tftp=/tftpserver/pub,bootfile=/pxelinux.0
#定義前半段后半段開啟一個虛機
qemu-kvm -m 128 -cpu host -smp 2 -name "test" -drive file=/images/kvm/cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,name=vif0.0,script=no
 
/etc/qemu-ifup
#!/bin/bash
bridge=br0
 
if [ -n "$1" ];then
    ip link set $1 up
    sleep 1
    brctl addif $bridge $1
if [ $? -eq 0 ] && exit 0 || exit 1
    else
    echo "Error: no interface specified"
exit 1
fi
qemu-kvm -m 128 -cpu host -smp 2 -name "test" -drive file=/images/kvm/cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,name=vif0.0,script=/etc/qemu-ifup
qemu-kvm -m 128 -cpu host -smp 2 -name "test1" -drive file=/images/kvm/cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,name=vif1.0,script=/etc/qemu-ifup
指定不同的網絡接口名稱
 
兩個虛機互ping不通,因為通過上面的命令創建的虛機mac地址是一樣的(不指定macaddr默認都是一樣的)
test1虛機指定一下macaddr 就可以互通了。
qemu-kvm -m 128 -cpu host -smp 2 -name "test1" -drive file=/images/kvm/cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,form
at=qcow2,cache=writeback -nographic -net nic,macaddr=52:54:00:12:34:57 -net tap,name=vif1.0,script=/etc/qemu-ifup
 
添加2個網卡設備 veth0 和veth1
ip link add veth1.0 type veth peer veth1.1
激活這兩個網卡設備
ip link set veth0 up
ip link set veth1.0 up
將veth1.0設備添加到橋設備上
brctl addif br0 veth1.0
將添加在宿主機上手動添加veth0的ip
ifconfig veth0 192.168.2.254/24
在兩個虛機分別手動添加1個地址
ifconfig eth0 192.168.2.1/24  #test虛機
ifconfig eth0 192.168.2.2/24  #test1虛機
驗證結果:在兩台虛機上都是可以ping通veth0 的地址
/etc/qemu-ifdown
#!/bin/bash
bridge=br0
 
if [ -n "$1" ];then
    brctl delif $bridge $1
    ip link set $1 down
    exit0
else
    echo "Error: no interface specified"
    exit 1
fi
 
nat模型網絡腳本實例:
/etc/qemu-natup
#!/bin/bash
bridge="isbr"
net="10.0.0.0/8"
ifaddr=10.0.10.1
 
checkbr(){
if brctl show |grep -i "$1";then
    return 0
else
    retun 1
fi
}
 
initbr(){
    brctl addr $bridge
    ip link set $bridge up
    ip addr add $ifaddr dev $bridge
}
 
enable_ip_forward(){
sysctl -w net.ipv4.ip_forward=1
}
 
setup_nat(){
    checkbr $bridge
    if [ $? -eq 1 ];then
    initbr
    enable_ip_forward
    iptables -t nat -A POSTROUTING -s $net ! -d $net -j MASQUERADE
    fi
}
 
if [ -n "$1" ];then
    setup_nat
    ip link set $1 up
    brctl addif $bridge $1
    exit 0
else
    echo "Error: no interface specified"
    exit 1
fi
 
/etc/qemu-natdown
#!/bin/bash
bridge="isbr"
remove_rule(){
    iptables -t nat -F
}
 
isalone_bridge(){
    if ! brctl show |awk "/^$bridge/{print \$4}" | grep "[^[:space:]]" &>/dev/null;then
        ip link set $bridge down
        brctl delbr $bridge
        remove_rule
    fi
}
 
if [ -n "$i"];then
    ip link set $i down
    brctl delif $bridge $i
    isalone_bridge
exit 0
else
    echo "Error: no interface specified."
    exit 1
fi

 

 
 

4.總結:

    kvm的網絡模型:
    1.隔離模型:在host創建一個vswitch(bridge device),每個虛擬機的tap設備直接添加至vswitch上; 
    2.路由模型:
    3.NAT模型
    4.橋接模型
 
Character device options: 字符設備選項(鼠標鍵盤)
Device URL Syntax:     基於iscsi的方式加載一個iscsi設備如何使用url指明
Bluetooth(R) options:    藍牙設備選項(桌面虛擬化可能用到,服務器虛擬化用不到)
Linux/Multiboot boot specific: linux多啟動特殊設備選項
Debug/Expert options:    專家模式專用選項
 

5.快捷鍵

ctrl-alt-f      toggle full screen   
ctrl-alt-n      switch to virtual console 'n'
ctrl-alt        toggle mouse and keyboard grab
 
cirros project:為cloud換將測試vm提供的微縮版Linux:
 啟動一個虛擬機:
qemu-kvm -m 128 -smp 2 -name test -hda /images/kvm/cirros-0.3.4-x86_64-disk.img
用-driver指定磁盤映像文件
qemu-kvm -m 128 -smp 2 -name "test" -drive file=cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback
通過cdrom啟動winxp的 安裝
qemu-kvm -name winxp -smp 4,sockets=1,croes=2,threads=2 -m 512 -drive file=/images/kvm/winxp.img,if=ide,media=disk,cache=writeback,format=qcow2 -drive file=/root/winxp_ghost.iso,media=cdrom
指定使用橋接網絡接口
qemu-kvm -m 128 -name test -smp 2 -drive file=/images/kvm/cirros-0.3.4-i386-disk.img,if=virtio,media=disk,cache=writeback,format=qcow2 -net nic -net tap,script=/etc/if-up,downscript=no -nographic
指定以網絡接口啟動vm
qemu-kvm -m 512 -smp 2 -name centos -drive file=/images/centos/centos6.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:55:32:19 -net tap,ifname=centos6.0,script=/etc/qemu-ifup -boot order=nc,once=n
創建磁盤格式
qemu-img create -o ? -f qcow2 /images/window/winxp.qcow2
qemu-img create -o size=20G,preallocation=metadata -f qcow2 /images/window/win10.qcow2
 
-daemonize 該選項可以將虛機放后台運行
 
選項說明:
    -smp 對稱多處理器
    if   塊設備的虛擬化方式,virtio 為半虛擬化
    media 介質設備類型
    cache 指定緩存類型
    format 磁盤映像的格式
    
查看鏡像信息
[root@dmsag kvm]# qemu-img info cirros-0.3.4-x86_64-disk.img
image: cirros-0.3.4-x86_64-disk.img
file format: qcow2
virtual size: 39M (41126400 bytes)
disk size: 13M
cluster_size: 65536
Format specific information:
    compat: 0.10
 
kvm創建虛機報錯
[root@dmsag kvm]# qemu-kvm -m 128 -smp 2 -name "test" -hda cirros-0.3.4-x86_64-disk.img
qemu: could not load PC BIOS 'bios-256k.bin'
解決方法:
[root@dmsag kvm]# cd /usr/share/seabios
[root@dmsag seabios]# ls
bios.bin
[root@dmsag seabios]# cp bios.bin bios-256k.bin
[root@dmsag seabios]# ls
bios-256k.bin  bios.bin
 
設置一下xshell的隧道轉發
再次創建
[root@dmsag kvm]# qemu-kvm -m 128 -smp 2 -name "test" -hda cirros-0.3.4-x86_64-disk.img
VNC server running on `::1:5900'
::1 表示只能監聽本機的連接
 
安裝vnc客戶端
[root@dmsag ~]# yum install tigervnc -y
切換到管理員用戶
查看虛機地址
 
ctl+alt+2 切換到監控視圖下 ctl+alt+1切換到命令行視圖
info命令
 
開啟一個虛擬機實際是在宿主機上創建了一個qemu-kvm進程 ,關閉虛機只需要殺死對應的進程
 
使用 -hda指定的磁盤太垃圾,所以出現 -driver file=磁盤鏡像  用逗號隔開可以指定一堆選項
 
 
使用示例
下面的命令創建了一個名為rhel5.8的虛擬機,其ram大小為512MB,有兩顆CPU的SMP架構,默認引導設備為硬盤,有一個硬盤
設備和一個光驅設備,網絡接口類型為virtio,VGA模式為cirrus,並啟動了balloon功能。
 
qemu-kvm -name "rehl5.8" -m 512 \
-smp 2 -boot d \
-drive file=/VM/images/rhel5.8/hda,if=virtio,index=0,media=disk,format=qcow2 \
-drive file=/isos/rhel-5.8.iso,index=1,meidia=cdrom \
-net nic,model=virtio,macaddr=52:54:00:A5:41:1E \
-vga cirrus
需要注意的是,上述命令中使用的硬盤映像文件/VM/images/rhel5.8/hda需要事先使用qemu-img命令創建
 
在虛機創建並安裝GuestOS完成之后,可以免去光驅設備直接啟動之,命令如下所示。
qemu-kvm -name "rehl5.8" -m 512 \
-smp 2 -boot d \
-drive file=/VM/images/rhel5.8/hda,if=virtio,index=0,media=disk,format=qcow2 \
-net nic,model=virtio,macaddr=52:54:00:A5:41:1E \
-vga cirrus -balloon virtio
 
pxe方式創建虛機
qemu-kvm -hda linux.img -boot n -net user,tftp=/path/to/tftp/files,bootfile=/pxelinux.0
 

6.virtio半虛擬化:

  • HVM:虛擬化CPU
  • I/O半虛擬化分為兩段:
            前端驅動(virtio前半段),virtio-blk,virtio-net,virtio-pci,virtio-balloon,virtio-console
            linux:centos 4.8+,5.3+,6.0+,7.0+
            windows:
            virtio:虛擬隊列,virt-ring
            transports
            后端處理程序(virt backend drivers)在QEMU中實現:
  • virtio-balloon:
            ballooning:讓VM中運行的GuestOS中運行調整其內存大小
            # qemu-kvm -balloon virtio
            手動查看GuestOS的內存用量:
            info balloon
            balloon N
  • virtio-net:
            其依賴於GuestOS中的驅動,及Qemu中的后端驅動
            GuestOS:virtio_net.ko
            Qemu:  qemu-kvm -net nic,model=?
            qemu-kvm -net nic,model=virtio
  • Host中的GSO,T5O
                關掉可能會提升性能:
                ethtool -K $IF gso off
                ethtool -K $IF gso off
                ethtool -K $IF
  • vhost-net: 用於取代工作於用戶空間的qemu中為virtio-net實現的后端驅動以實現性能提升的驅動
                -net tap[,vnet_hdr=on][off][,vhost=on|off]
                qemu-kvm -net tap,vnet_hdr=on,vhost=on
 
  • virtio-blk:
                其依賴於GuestOS中的驅動,及Qemu中的后端驅動
                -drive file=/path/to/some_image_file,if=virtio
 
  • kvm_clock:半虛擬化的時鍾
            # grep -i "paravirt" /boot/config-3.10.0-862.el7.x86_64
            CONFIG_PARAVIRT_SPINLOCKS=y
            CONFIG_PARAVIRT_TIME_ACCOUNTING=y
            CONFIG_PARAVIRT_CLOCK=y
    
  • VM Migration
             static migration
            live migration
                    整體遷移時間
                    服務器停機時間
                    對服務的性能的影響
 
        在待遷入主機使用
            # qemu-kvm -vnc :N -incoming tcp:0:7777
            # vncviewer :590N
 
        在源主機使用:
            monitor接口:
                migrate tcp: DEST_IP:DEST:PORT
 
  • libvirt工具棧:
            支持的虛擬化技術:KVM,XEN,LXC,VMWare,Qemu,OpenVZ
            
            libvirt中的術語:
                node: 指物理節點
                hypervisor:
                domain:vm instances
            
    
    
 
 
 


免責聲明!

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



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