kvm介紹與操作文檔

--

虛擬化

KVM  (kernel-based virtual machine)

xen   kvm    vmare esx          openVZ     Oracle VM VirtualBox   vsphere



企業級應用:非本地的    
分兩部分:一,host虛擬機
       二,management端



最早的虛擬化:  分時操作系統    單核CPU 同一時間點只能做一個任務   運行多個進程或線程就是一種虛擬化
  cpu運行一個進程,中斷,再運行另一個,因爲CPU運行速度快,所以用戶感覺不到這種切換,這種切換叫上下文切換


常見的虛擬化場景: 遊戲模擬器:如使用X86的CPU模擬PSP或街機的CPU,使用X86的硬件模擬PSP或街機的硬件




vmware workstation的虛擬結構圖:

OS1 OS2


  vmware workstation


OS(內核)

  硬件:CPU,mem,hd等


--上面的結構:OS1和OS2的操作,需要通過vmware來轉化爲進程對OS的請求,再由OS轉化爲對硬件的請求;
如果這裏OS裏跑的其它程序如果佔用和資源多,那麼必然會造成vmware的資源佔用少,性能就會不太好,因爲vmware的進程和其它進程是同級的


--如何把性能提高:跳過OS這一層
  或者虛擬化和os同級
  或者硬件本身支持虛擬化


所以就發展成下面這幾種虛擬情況:
半(準)虛擬化:
完全虛擬化:




半(準)虛擬化:
客戶機器操作系統必須是修改過的,才能使用半虛擬化。
硬件虛擬化技術。

典型代表: Xen


citrix: xen

xen半虛擬化結構圖:


domain0    domain1 domain2  ...

  xen

 硬件:CPU,MEM,HD等



--上面的結構: xend取代了OS,domain0是用來控制xen的一個控制器(跑hypervisor),domain1,domain2...就是虛擬的操作系統;這樣轉化的效率就會高很多
但要注意的是:上層的domain1,domain2等的內核接口必須要與xen對應纔可以;
 xen要使用支持xen的專有內核纔可以,原有的內核不行,原有的內核是直接與硬件進行通訊的;
開源的linux,freebsd都可以修改,但windows卻不行;
xen已經加入到linux內核裏去了,從2.6.18之後的內核就有xen
citrix把xen買下來了,所以redhat不再繼續開發xen,就買了另一家kvm;並且citrix是微軟的白金級合作伙伴,它可以要求MS去修改源代碼支持xen,所以只有citrix的xen支持windows



Hypervisor——一種運行在基礎物理服務器和操作系統之間的中間軟件層,可允許多個操作系統和應用共享硬件。也可叫做VMM( virtual machine monitor ),即虛擬機監視器。  
Hypervisors是一種在虛擬環境中的“元”操作系統。他們可以訪問服務器上包括磁盤和內存在內的所有物理設備。
Hypervisors不但協調着這些硬件資源的訪問,也同時在各個虛擬機之間施加防護。
當服務器啓動並執行Hypervisor時,它會加載所有虛擬機客戶端的操作系統同時會分配給每一臺虛擬機適量的內存,CPU,網絡和磁盤。




全虛擬化:
必須cpu支持硬件虛擬化。
客戶機器不需要修改內核,原則上可以安裝任何的操作系統。
Intel # cat /proc/cpuinfo | grep vmx
AMD :  svm

典型代表: kvm , VMware ESXi



KVM 完全虛擬化結構圖:


OS1 OS2

    KVM  os

硬件:CPU,MEM,HD等

要求操作系統廠商按照它的虛擬化標準和規則編寫



=============================================================



紅帽官檔下載路徑

docs.redhat.com
https://access.redhat.com/documentation/en-US/


KVM官方安裝文檔(english)

Red_Hat_Enterprise_Linux-6-Virtualization_Host_Configuration_and_Guest_Installation_Guide-en-US.pdf


在宿主機安裝kvm


1,配置好yum

# vim /etc/yum.repos.d/rhel-source.repo

[rhel-source]
name=rhel6.5
baseurl=file:///yum/
enabled=1
gpgcheck=0


# yum groupinstall "Virtualization"
# yum groupinstall "Virtualization Client"
# yum groupinstall "Virtualization Platform"
# yum groupinstall "Virtualization Tools"


# service libvirtd restart
# chkconfig libvirtd on


# cat /proc/cpuinfo |grep -E "vmx|svm" --查看CPU是否支持intel或AMD的虛擬技術

vmx ---intel
svm ---AMD

# modprobe kvm
# modprobe kvm_intel --如果不支持vmx指令,則加載不支持

# lsmod |grep kvm
kvm_intel              52570  0
kvm                   314739  1 kvm_intel




開始安裝kvm
1,圖形安裝

# virt-manager    --和xen一樣的命令,打開虛擬機管理器

安裝名:kvm1    --名字隨意
安裝方式:      --我這裏選擇第一個,使用iso直接安裝

安裝路徑:/share/soft/rhel-server-6.5-x86_64-dvd.iso --寫上iso的路徑
OS type:  linux
         red hat enterprise  linux  6


內存大小: 1024M -- 內存如果較小,安裝時無法使用圖形安裝方式,只能使用文本安裝方式
cpu個數:2     --不能大於宿主機器的cpu核數

硬盤大小: 12 G    --我這裏定義12G大小,不馬上分配;它的默認路徑會在/var/lib/libvirt/images/kvm1.img;也可以自定義路徑


第五步:網絡現在只能選擇default  --這是一個nat網絡(私有網絡),橋接網絡不能選,需要後面單獨配置後才能選擇




2,命令行交互式安裝
[root@li ~]# virt-install --prompt
What is the name of your virtual machine?
kvm2
How much RAM should be allocated (in megabytes)?
800
What would you like to use as the disk (file path)?
/var/lib/libvirt/images/kvm2.img
How large would you like the disk (/var/lib/libvirt/images/kvm2.img) to be (in gigabytes)?
12
What is the install CD-ROM/ISO or URL?
/share/soft/rhel-server-6.5-x86_64-dvd.iso




3,直接使用命令行來安裝
# virt-install --hvm -n "kvm3" -r 800 --vcpus 2 --os-type="linux" --os-variant="rhel6" --disk path=/var/lib/libvirt/images/kvm3.img,size=12 -l /share/soft/rhel-server-6.5-x86_64-dvd.iso --network bridge=virbr0




hvm是指全虛擬化
p是指半虛擬化


4,使用kc.cfg自動安裝

# virt-install --vnc --noautoconsole --arch=x86_64 --hvm -n "kvm3" -r 800 --vcpus 2 --os-type="linux" --os-variant="rhel6" --disk path=/var/lib/libvirt/images/kvm3.img,size=12 --location=
ftp://172.16.2.9/ --extra-args="ks=nfs:172.16.2.9:/ks/ks.cfg" --network bridge=virbr0


# virt-install --vnc --noautoconsole --arch=x86_64 --hvm -n "kvm3" -r 800 --vcpus 2 --os-type="linux" --os-variant="rhel6" --disk path=/var/lib/libvirt/images/kvm3.img,size=12 --location=
ftp://172.16.2.9/ --extra-args="ks=<a href="http://172.16.2.9/ks.cfg" "="">http://172.16.2.9/ks.cfg" --network bridge=virbr0

virt-install  --help
幫助手冊

[root@i ~]# virt-install --vnc --noautoconsole --arch=x86_64 --hvm -n "kvm4" -r 800 --vcpus 1 --os-type="linux" --os-variant="rhel6" --disk /var/lib/libvirt/images/kvm4.img,size=9 --location=
ftp://192.168.0.254/pub/rhel6/dvd --extra-args="ks=<a href="ftp://192.168.0.254/kvm.cfg" "="">ftp://192.168.0.254/kvm.cfg" --network bridge=virbr0

==========================================================


主要的管理命令:
virsh help  
virsh help domain
virsh help network
virsh help monitor   --因爲參數很多,可以用象domain,network,monitor這種關鍵字,只查看與關鍵字有關的參數幫助
......




# virsh  list
Id    Name                           State
----------------------------------------------------
1     kvm1                           running

# virsh list --all
Id    Name                           State
----------------------------------------------------
1     kvm1                           running
-     kvm2                           shut off



# virsh  start kvm1 --啓動一個虛擬機
# virsh  shutdown kvm1     --正常在一分鐘後關閉一個虛擬機(如果都沒有登錄進去,則會馬上關閉)
# virsh  reboot kvm1    --正常重啓一個虛擬機,一樣會在關閉時要一分鐘
# virsh  destroy kvm1    --強制關閉一個虛擬機,類似斷電,可以瞬間關閉虛擬機

# virsh save kvm1 /etc/libvirt/qemu/kvm1.save  --把kvm1關閉,並把當前狀態保存爲一個文件 <開啓狀態>
# virsh restore /etc/libvirt/qemu/kvm1.save --通過保存的文件,恢復當時save時的狀態 <關閉狀態>

# virsh suspend kvm1 --暫停kvm1的狀態
# virsh resume kvm1 --由暫停切換爲繼續的狀態

# virt-viewer  kvm1   --連接一個已經啓動的虛擬機,並使用圖形查看


# virsh console kvm1   --字符連接一個虛擬機,但是現在連接不了;因爲需要一個串口的授權纔可以;下面的例8會說明

--這裏要注意,console連接會卡死在那;只能殺進程退出;但其實是有快捷鍵的;是ctrl+ ] (也就是右中框號的這個鍵)來退出


虛擬機相關的文件:
以kvm1爲例:
配置文件在:/etc/libvirt/qemu/kvm1.xml
磁盤文件默認在:/var/lib/libvirt/images/kvm1.img




命令刪除一個虛擬機的做法(假設爲kvm3)

virsh destroy kvm3
virsh undefine kvm3
rm -rf /var/lib/libvirt/images/kvm3.img


=====================================================================

網絡管理
console連接
克隆
添加或刪除硬件
遠程虛擬機管理
遷移
快照

================================================================



kvm 網絡管理

# virsh  help network --只查看與網絡有關的幫助參數


# virsh net-list --all
Name                 State      Autostart
-----------------------------------------
default              active     yes --這是一個NAT網絡,私有網絡


# virsh net-info default
Name            default
UUID            704eb1b7-3feb-4a38-8642-9c3fe2f023bb
Active:         yes
Persistent:     yes
Autostart:      yes
Bridge:         virbr0


default網段的配置文件的路徑爲:
/etc/libvirt/qemu/networks/default.xml


virsh net-destroy default --停掉default網絡,由virsh net-list --all去查看,狀態變爲inactive
virsh net-start  default --啓動default網絡,狀態變爲active




-----------------------------------------------------



例一:圖形增加私有網絡

virt-manager打開圖形--》edit --》connections details --》 virtual networks--》點左下角的+號增加一個私有網絡(選擇名字,網絡分配地址範圍,dhcp的分配範圍)
--注意:這裏最後一步有三種網絡:
1,isolated 相當vmware的hostonly,沒有NAT,也沒有網關
2,NAT   有網關,有NAT,可以通過宿主上外網
3,routed 也是相當於hostonly,在isolated的基礎上就是加了一個網關

把上面的步驟做完後,直接在宿主機用ifconfig或virsh net-list --all,就可以看到新加的網絡了


例二:手動加一個私有網絡
1,# cp /etc/libvirt/qemu/networks/default1.xml /etc/libvirt/qemu/networks/default2.xml

# vim /etc/libvirt/qemu/networks/default2.xml
<network>
 <name>default2</name> --修改名字爲default2
 <uuid>243166ddb-e2fd-9983-1997-5e8efdc06c42</uuid>  --uuid隨便修改一下
 <bridge name='virbr2' stp='on' delay='0' /> --virbr1改成virbr2
 <mac address='52:54:00:AF:27:25'/> --MAC地址改一下,只改後面三位
 <ip address='192.168.101.1' netmask='255.255.255.0'> --IP改爲101
   <dhcp>
     <range start='192.168.101.128' end='192.168.101.254' /> --dhcp地址範圍也改成101的
   </dhcp>
 </ip>
</network>


2,# virsh net-define /etc/libvirt/qemu/networks/default2.xml --定義一下,然後你可以使用virsh net-list --all去查看,狀態爲inactive,autostart的狀態爲no
3,# virsh net-start default2 --啓動
4,# ifconfig virbr2 |head -2 --查看就有了
virbr2    Link encap:Ethernet  HWaddr 52:54:00:AF:27:25  
         inet addr:192.168.101.1  Bcast:192.168.101.255  Mask:255.255.255.0



# ls /etc/libvirt/qemu/networks/autostart/
default1.xml   default.xml

5,# virsh net-autostart default2  --讓他開機自動啓動

# ls /etc/libvirt/qemu/networks/autostart/ --這裏就會多了default2.xml了,其實都是網絡配置文件的軟鏈接
default1.xml  default2.xml   default.xml


剛加的網絡配置文件都在下面的目錄
# ls /etc/libvirt/qemu/networks
autostart  default1.xml  default2.xml  default.xml




例三:修改一個網絡
1,# vim /etc/libvirt/qemu/networks/default2.xml


<network>
 <name>default2</name>
 <uuid>243166ddb-e2fd-9982-1996-5e8efdc06c42</uuid>
 <forward dev='eth0' mode='route'>
   <interface dev='eth0'/>
 </forward>
 <bridge name='virbr2' stp='on' delay='0' />
 <mac address='52:54:00:AF:166:45'/>
 <ip address='192.168.102.1' netmask='255.255.255.0'> --我這裏把以前的192.168.101.0的IP範圍都改成了192.168.102.0
   <dhcp>
     <range start='192.168.102.128' end='192.168.102.254' />
   </dhcp>
 </ip>
</network>


保存後,使用ifconfig virbr1 查看,還是192.168.102.1,沒有改變
需要做下面三步:

2,# virsh net-define /etc/libvirt/qemu/networks/default2.xml  --定義一個網絡,使你的修改被他知道
Network default2 defined from /etc/libvirt/qemu/networks/default3.xml

3,# virsh net-destroy default2 --停一下這個網絡
Network default2 destroyed

4,# virsh net-start default2 --再啓這個網絡
Network default2 started


ifconfig virbr2查看,成功修改成192.168.102.1


上面的第一步和第二步可以統一成一步來做:
# virsh  net-edit default2   --使用這個命令打開,修改,然後就直接net-destroy和net-start,不需要去net-define



例四:
圖形刪除一個網絡
virt-manager打開圖形--》edit --》connections details --》 virtual networks--》選擇你要刪除的網絡,然後左下角,先停,再刪除就可以了


用命令刪除一個網絡

# virsh net-destroy default2 --停掉要刪除的網絡,用virsh net-list --all命令去查就變成了inactive狀態

# virsh net-undefine default2  --這下就刪除了這個網絡定義了,並且物理上的配置文件也沒了



例五:增加一個橋接網絡:
把物理網卡eth0橋接到br0(這個名字是自己定義的)

在rhel6裏有一個networkmanger這個服務,可以圖形管理所有的網絡鏈接。但這個服務不支持kvm的橋接,所以要關掉這個服務,或者在eth0的配置文件里加上NM_CONTROLLED="no",讓eth0不受networkmanger服務的控制




1,在宿主機上創建一個橋接網絡

# /etc/init.d/NetworkManager stop
# chkconfig NetworkManager off


# vim /etc/sysconfig/network-scripts/ifcfg-br0  --此文件不存在,br0這個名字是自定義的
DEVICE=br0 --名字對應好
TYPE=Bridge --這裏的Birdge,B要大寫,後面的irdge要小寫
BOOTPROTO=static
IPADDR=172.16.2.9
NETMASK=255.255.0.0
GATEWAY=172.16.1.1
ONBOOT=yes



2,把一個物理網卡加到一個橋接網絡裏,我這裏是把eth0加到br0
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BRIDGE=br0 --這句就是把eth0橋接到br0
NM_CONTROLLED="no" --這句就是讓eth0不受networkmanager的控制
ONBOOT="YES"




[root@li ~]# brctl show  --重啓網絡前的情況
bridge name bridge id STP enabled interfaces
virbr0 8000.5254004e4c3f yes virbr0-nic
virbr1 8000.5254004cf4e4 yes virbr1-nic



3,重啓網絡 /etc/init.d/network restart


# brctl show --重啓網絡後查看的情況
bridge name bridge id STP enabled interfaces
br0 8000.0030677653f7 no eth0
virbr0 8000.5254004e4c3f yes virbr0-nic
virbr1 8000.5254004cf4e4 yes virbr1-nic




有了上面這些網絡,如果你再建立虛擬機,就會有多種網絡可選


在宿主機上ifconfig 查看就會有br0這個網卡,有IP;而eth0網卡也有,但沒有IP;這是正常的



例六:圖形修改一個虛擬機網卡鏈接


virt-manager打開圖形,雙擊你要修改的虛擬機 --》點擊左上的一個!號按鈕show hardware detail-->>找個網卡,修改成你想要改的網絡(但這裏報需要重啓虛擬機才能生效)

# virsh shutdown kvm1
# virsh start kvm1 --重啓後,就改成了你想要的虛擬網絡了



--問題:可能有些人在圖形選擇時看不到br0,但是brctl show能查看到,那麼你在選擇時選擇specify shared device name,然後再下面手動在bridge name後寫br0





例七:文本修改一個虛擬機的網卡連接


1,# vim /etc/libvirt/qemu/kvm1.xml --直接打開修改
2,# virsh define /etc/libvirt/qemu/kvm1.xml --vim修改後要define一下



# virsh edit kvm1   --或者使用edit命令打開修改,就可以替代前面的1,2步
    40    
<interface type='bridge'> --接口類型把network改成bridge
    41       <mac address='52:54:00:5c:aa:2c'/>
    42      
<source bridge='br0'/> --把原來默認的network改成bridge,把原來的網絡default改成br0
    43       <model type='virtio'/>
    44       <address type='pci' domain='0x0000' bus='0x00' slot='0x03        ' function='0x0'/>



# virsh shutdown kvm1
# virsh start kvm1 --重啓後,虛擬機就是橋接網絡了



--KVM現在修改一個網卡的類型(比如NAT改橋接),需要重啓才能生效;但如果你是加網卡或者刪網卡,是不需要重啓生效的(rhel6.5環境下測試爲,圖形加或刪網卡不用重啓,但命令加或刪網卡要重啓)



======================================================================



例八:解決virsh console kvm1 連接不上去的錯誤

1,在kvm1虛擬機裏操作
vim /boot/grub/grub.conf

kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=UUID=f900cbb3-c0cf-440c-94f6-0c208f1da6e0 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet console=ttyS0,115200  --在內核參數這裏加上console=ttyS0,115200,表示這個串口以115200的波特率可以連接;注意ttyS0裏的S一定要大寫;


如果小寫會造成這個虛擬機啓動不了,解決方法:
1,挽救模式進去修改
2,用虛擬化的一個交互編輯工具
# yum install libguestfs-tools
# virt-edit -a /var/lib/libvirt/images/kvm1.img /boot/grub/grub.conf去修改;
同理這個工具也可以用於完全沒有圖形的宿主機上無法通過virt-viewer或者ssh(因爲找不到虛擬機的IP)或者virsh console來連接虛擬機的情況;
可以先用virt-edit來修改加上上面的console=ttyS0,115200;再用virsh console去連接

--如果上面的virt-edit打不開,可以使用# libguestfs-test-tool來調試錯誤(我這裏以前講庫的時候做了一個小實驗,把/lib64/libselinux.so.1改名成了/lib64/libselinux.so.1.bak,然後用軟鏈接鏈接回來。但在這裏就會造成錯誤。解決方法:mv /lib64/libselinux.so.1.bak /lib64/libselinux.so.1)



2,重啓kvm1
# virsh reboot kvm1   --直接destroy再start,可能無法生效,建議這樣重啓

3,再在宿主機上
# virsh console kvm1    --然後回車就可以直接連你本地的這個虛擬機了;虛擬機沒有IP一樣可以連


4,退出的方式
exit只是退出登錄的用戶而已
要完全退出這個console連接,需要使用的是ctrl+ ] (也就是右中框號的這個鍵)



========================================




kvm 的克隆

--注意:克隆都需要源虛擬機器是關閉或暫停狀態


例九:圖形克隆
1,先關閉kvm1或 virsh suspend kvm1暫停kvm1(使用virsh resume kvm1恢復)



2,virt-manager--》右鍵點kvm1--》選擇clone-->修改克隆後的名字或其它參數--》點clone



例十:文本克隆
1,拷貝配置文件和磁盤文件
# cp /etc/libvirt/qemu/kvm1.xml /etc/libvirt/qemu/kvm3.xml
# cp /var/lib/libvirt/images/kvm1.img /var/lib/libvirt/images/kvm3.img


2,修改拷貝的配置文件
# vim /etc/libvirt/qemu/kvm3.xml


<domain type='kvm'>
 <name>kvm3</name> --名字改成kvm3
 <uuid>811d69e8-b1d8-cfbf-684a-69f2e0af6b88</uuid> --uuid隨便改幾個數字
 <memory unit='KiB'>1048576</memory>
 <currentMemory unit='KiB'>1048576</currentMemory>
 <vcpu placement='static'>2</vcpu>
 <os>
   <type arch='x86_64' machine='rhel6.5.0'>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>
 <devices>
   <emulator>/usr/libexec/qemu-kvm</emulator>
   <disk type='file' device='disk'>
     <driver name='qemu' type='raw' cache='none'/>
     <source file='/var/lib/libvirt/images/kvm3.img'/>   --磁盤路徑改成kvm3.img的路徑
     <target dev='vda' bus='virtio'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
   </disk>
   <disk type='block' device='cdrom'>
     <driver name='qemu' type='raw'/>
     <target dev='hdc' bus='ide'/>
     <readonly/>
     <address type='drive' controller='0' bus='1' target='0' unit='0'/>
   </disk>
   <controller type='usb' index='0'>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
   </controller>
   <controller type='ide' index='0'>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
   </controller>
   <interface type='bridge'>
     <mac address='52:54:00:5c:3a:2d'/>   --網卡地址隨便改下,只改後三位
     <source bridge='br0'/>
     <model type='virtio'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
   </interface>

   <interface type='network'>
     <mac address='52:54:00:5a:c2:d3'/> --第二張網卡也隨便改下
     <source network='default'/>
     <model type='virtio'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
   </interface>

   <serial type='pty'>
     <target port='0'/>
   </serial>
   <console type='pty'>
     <target type='serial' port='0'/>
   </console>
   <input type='tablet' bus='usb'/>
   <input type='mouse' bus='ps2'/>
   <graphics type='vnc' port='-1' autoport='yes'/>
   <sound model='ich6'>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
   </sound>
   <video>
     <model type='cirrus' vram='9216' heads='1'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
   </video>
   <memballoon model='virtio'>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
   </memballoon>
 </devices>
</domain>



3,保存後,使用virsh list --all查看不到的,需要define一下
# virsh define /etc/libvirt/qemu/kvm3.xml

# virsh list --all --再查就可以查看到kvm3
Id    Name                           State
----------------------------------------------------
-     kvm1                           shut off
-     kvm1-clone                     shut off
-     kvm2                           shut off
-     kvm3                           shut off


# virsh start kvm3   --可以啓動克隆的機器了



例十一:命令克隆

# virt-clone -o kvm1 -n kvm4 -f /var/lib/libvirt/images/kvm4.img
Allocating kvm4.img  7% [-          ]  34 MB/s | 957 MB     05:29 ETA
--把kvm1克隆成kvm4,指定磁盤路徑爲/var/lib/libvirt/images/kvm4.img;如果kvm1有多個硬盤,那麼克隆時也要對應的克隆成多個路徑





========================================



例十二:添加網卡或硬盤


virt-manager--》 雙擊打開kvm1--》點左上角的!號show hardware details --》點左下角add devices 直接添加,並寫上相關參數就可以(注意參數,device type都選擇virtio,不需要重啓虛擬機,可以直接生效,並且磁盤名叫vda,vdb,vdc...;如果你第一次加硬盤選擇IDE disk,需要重啓,並且磁盤名叫sda,sdb,sdc...)


--注意:當虛擬機(非宿主機)爲文本模式的情況,在宿主機上用上面的圖形模式加的設備,在虛擬機的配置文件裏沒有加上,需要手動再加上,纔可以




例十三:直接用命令來添加一個硬盤設備
1,使用dd命令創建一個磁盤文件
# dd if=/dev/zero of=/var/lib/libvirt/images/kvm2-2.img bs=1M count=1 seek=4000000
--seek是指跳過多少個BS塊,這裏就是產生一個4T大小的文件(實際大小隻1M)



2,編輯虛擬機的配置文件
# virsh edit kvm2
<devices>與</devices>之間加上下面的一段,也可以把其它磁盤的配置定義拷貝一段進行修改


   <disk type='file' device='disk'>
     <driver name='qemu' type='raw' cache='none'/>
     <source file='/var/lib/libvirt/images/kvm2-2.img'/>  --名字改成kvm1-2.img
     <target dev='vdb' bus='virtio'/> --磁盤名,改成vdb;bus總線如果是ide,那麼磁盤名會叫sda(就算dev寫hda,在虛擬機裏fdisk也是看到sda);virtio這種總線會以vda,vdb...這種形式來命名
     <address type='pci' domain='0x0000' bus='0x00' slot='0x10' function='0x0'/> --slot也改一下,我這裏是把0x09改成0x10
   </disk>


3,重啓虛擬機
# virsh define /etc/libvirt/qemu/kvm2.xml
# virsh reboot kvm2

======================================================================


kvm 的遠程管理

例:在192.168.0.254上管理192.168.0.252

1,先在/etc/hosts裏綁定對方(被管理的宿主機器)的主機名


2,做ssh等效性
# ssh-keygen --直接三次回車

# ssh-add /root/.ssh/id_rsa --加入自己的私鑰
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)


# scp /root/.ssh/id_rsa.pub 172.16.1.65:/root/.ssh/authorized_keys
--把自己的公鑰scp傳給對方



3,所有的被管理客戶端宿主機,需要啓動libvirtd服務



4,virt-manager--》file--》add connection--》填上要遠程連接的主機IP(或主機名,但要求/etc/hosts綁定)



5,連接上去之後,就可以看到有遠程的虛擬客戶機,雙擊就可以遠程調取他們的圖形了



--或者用命令的方式去連接
# virt-viewer -c qemu+ssh://[email protected]/system kvm1
--表示使用root用戶(當然前面你做的ssh等效性需要是root用戶)去訪問192.168.0.1上叫kvm1的虛擬機



=================================================================




遷移:
冷遷移: 這個和克隆還是有區別的:克隆是把源虛擬機關閉,那麼內存的數據都沒了;而遷移是遷過去成功,然後打開後,還保持原來的內存數據
熱遷移:



冷遷移過程:
1,虛擬機kvm1是開啓狀態
2,保存當前的運行狀態
# virsh save kvm1 /etc/libvirt/qemu/kvm1.xml.save

Domain kvm1 saved to /etc/libvirt/qemu/kvm1.xml.save

3,scp或者rsync把相關的文件都拷貝到被遷移的宿主機
# scp /etc/libvirt/qemu/kvm1.xml.save 172.16.1.65:/etc/libvirt/qemu/
# scp /etc/libvirt/qemu/kvm1.xml 172.16.1.65:/etc/libvirt/qemu/
# scp /var/lib/libvirt/images/kvm1.img 172.16.1.65:/var/lib/libvirt/images/


4,到192.168.0.1(也就是遷移的目標宿主機)上操作

# virsh define /etc/libvirt/qemu/kvm1.xml  --define一下,然後就可以用virsh list --all查看到


5,# virsh restore /etc/libvirt/qemu/kvm1.xml.save






熱遷移過程:
1,做熱遷移需要使用共享存儲(也就是說這些虛擬機都安裝在宿主機的共享存儲設備上);我們這裏只能使用nfs來替代

      remote01  remote02
                   \ /
               \       /
            \     /
         storage(0.254)


2,在源宿主機器上把虛擬機的磁盤文件路徑用nfs導出
# vim /etc/exports
/var/lib/libvirt/images *(rw,no_root_squash,sync)

# /etc/init.d/nfs restart  --rhel6.x已經沒有portmap服務了(代替的是rpcbind服務),直接啓動nfs服務就可以


3,在目標宿主機器上把源共享的目錄掛載,保證路徑一致
# mount -t nfs -o vers=3 172.16.2.9:/var/lib/libvirt/images/ /var/lib/libvirt/images/



4,進行遷移,下面的操作是在源172.16.2.9上的操作(注意檢查一下防火牆和selinux要關閉)
命令遷
# virsh  migrate --live kvm1 qemu+ssh://172.16.1.65/system
--(可能會有很多問題:如kvm1有橋接網絡,但172.16.1.65那邊沒有,會報錯:或者kvm1內存較大,172.16.1.65那邊沒有足夠的內存分配,則也會報錯等等;還有可能是因爲網絡的問題,造成一次不成功;畢竟我們是實驗環境@_@多試幾次看看)

圖形遷
virt-manager --》右鍵點kvm1-->點遷移



--遷移過程中,源虛擬機還是可以繼續運行,幾乎感覺不到停;遷移完成後,則源會關閉(源已經沒有用了),而目標172.16.1.65,就已經無縫接管了源虛擬機的狀態了


熱遷移時,如果報下面的錯誤
libvirtError: internal error Attempt to migrate guest to the same host
解決方法:在目標端172.16.1.65上操作
# uuidgen --產生一個新的uuid
596b0eb8-3a15-48da-bbba-11e136b7c893
# vi /etc/libvirt/libvirtd.conf --此配置文件里加上下面一行,注意id一定要用雙引號引起來
host_uuid = "596b0eb8-3a15-48da-bbba-11e136b7c893"

# /etc/init.d/libvirtd restart   --重啓服務



=======================================================================




kvm快照

# virsh shutdown kvm1


# qemu-img info /var/lib/libvirt/images/kvm1.img
image: /var/lib/libvirt/images/kvm1.img
file format: raw
virtual size: 12G (12884901888 bytes)
disk size: 3.2G


# cd /var/lib/libvirt/images/
# qemu-img convert -f raw -O qcow2 kvm1.img kvm1.qcow2.img
--把磁盤格式由raw轉換爲qcow2



# ll -h kvm1* --qcow2格式佔用空間小
-rw------- 1 root root  12G Dec  7 17:11 kvm1.img
-rw-r--r-- 1 root root 3.1G Dec  7 17:21 kvm1.qcow2.img



# virsh edit kvm1 --編輯kvm1虛擬的主配置文件,把raw磁盤換成qcow2磁盤

   <disk type='file' device='disk'>
     <driver name='qemu' type='qcow2' cache='none'/> --把type裏的row改成qcow2
     <source file='/var/lib/libvirt/images/kvm1.qcow2.img'/> --把路徑也改成轉換爲qcow2格式的文件路徑
     <target dev='vda' bus='virtio'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
   </disk>



# virsh start kvm1 --再啓動,使他生效



# rm -rf /var/lib/libvirt/images/kvm1.img  --可以把原來的raw格式的磁盤文件給刪除掉



# virsh help snapshot --查看和快照操作有關的命令


# virsh snapshot-list kvm1 --列快照,默認沒有
Name                 Creation Time             State
------------------------------------------------------------



#  virsh snapshot-create-as --domain kvm1 snap1 --description "my first test snapshot" --對kvm1創建一個叫snap1的快照
Domain snapshot snap created


# ll -h kvm1.qcow2.img --在建快照的過程中看到此文件在增大
-rw-r--r-- 1 qemu qemu 3.6G Dec  7 17:48 kvm1.qcow2.img


# virsh snapshot-list kvm1
Name                 Creation Time             State
------------------------------------------------------------
snap1                2013-12-07 17:52:42 +0800 running


查看幫助
virsh help snapshot
查看快照配置
virsh snapshot-current kvm1
恢復快照
virsh snapshot-revert kvm1 snap1
刪除快照
virsh snapshot-delete kvm1 snap1


--恢復快照時報錯:error: revert requires force: Target controller type ide does not match source usb
表示kvm不能在線恢復,需要關閉虛擬機,再恢復快照。如果你要在線恢復快照,需要加一個--force的參數
寫法如:
virsh snapshot-revert kvm1 snap1 --force

恢復快照的時間較長,恢復完後,鍵盤操作會有些問題,可以把它重啓一下
virsh destroy kvm1
virsh start kvm1



===============================================================

練習,準備一個qcow2格式的新kvm虛擬機,並安裝好操作系統(並做基本優化,配yum,關閉iptables和selinux等),並做好快照。以後要用多臺的話,就按照這臺來克隆就可以






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章