虛擬化——KVM

27.1 虛擬化介紹

虛擬化簡單來講,就是把一個物理計算機虛擬成多臺邏輯計算機,每個邏輯計算機裏面可以運行不同的操作系統,相互之間不受影響,這樣就可以充分利用物理計算機的硬件資源,從而提高計算機的工作效率。

虛擬化使用軟件的方法重新定義劃分IT資源,可以實現IT資源的動態分配、靈活調度、跨域共享,提高IT資源利用率,使IT資源能夠真正成爲社會基礎設施,服務於各行各業中靈活多變的應用需求。

Hypervisor

講到虛擬化,就離不開Hypervisor,可它究竟是什麼呢?有什麼作用?

Hypervisor一種運行在基礎物理服務器和操作系統之間的中間軟件層,可允許多個操作系統和應用共享硬件。也可叫做VMM( virtual machine monitor ),即虛擬機監視器。

Hypervisor是一種在虛擬環境中的“元”操作系統。他們可以訪問服務器上包括磁盤和內存在內的所有物理設備。Hypervisor不但協調着這些硬件資源的訪問,也同時在各個虛擬機之間施加防護。當服務器啓動並執行Hypervisor時,它會加載所有虛擬機客戶端的操作系統同時會分配給每一臺虛擬機適量的內存,CPU,網絡和磁盤。

虛擬化分類

虛擬化技術可以分爲全虛擬化和半虛擬化。

早期CPU硬件不支持虛擬化,當虛擬機上的操作系統(Guest OS)要使用CPU資源時,需要通過VMM來翻譯指令,這個過程比較耗費資源,而這種虛擬化技術叫做全虛擬化,我們用的VMware Workstation 和 KVM 就是全虛擬化。

半虛擬化技術通過修改Guest OS內核,讓Guest OS可以直接使用CPU資源,這樣就不需要翻譯指令了,從而節省了資源,但修改內核比較雞肋,可以虛擬化linux,但無法虛擬化Windows,因爲Windows並不是開源的。相對來說有利有弊,我們熟悉的XEN就是半虛擬化。

隨着CPU的發展,現在的CPU都可以直接支持虛擬化,不需要VMM翻譯指令了,這樣也就無所謂全虛擬化和半虛擬化了。

常用虛擬化軟件

  • VMware系列:

VMware Workstation,適用於單臺機器虛擬化,我們日常學習使用的也是這一款;

VMware vsphere(VMware esxi),適用於多臺機器的虛擬化解決方案,圖形化操作;

VMware Fusion(Mac),適用於蘋果系統。

  • XEN:

開源,半虛擬化,Redhat和CentOS的版本5和版本6可以直接使用xen;

XenServer,商業版本,廠商Ctirx,基於xen。

  • KVM:

開源,基於linux內核模塊,不修改linux內核。

  • Hyper-V:

微軟開發出來的虛擬化軟件,商業版本。

  • Openvz:

開源,基於linux,輕量的虛擬化軟件,虛擬機和宿主機需要公用一個內核,這樣相同性能的物理機能虛擬出更多的虛擬機,穩定性稍差。

  • Oracle VirtualBox:

開源,Sun公司開發,和VMware Workstation類似,後被Oracle公司收購。

虛擬化架構

雲計算離不開底層的虛擬化技術支持。維基百科列舉的虛擬化技術有超過60種,基於X86(CISC- Complex Instruction Set Computer)體系的超過50種,也有基於RISC(Reduced Instruction Set Computer)體系的,其中有4種虛擬化技術是當前最爲成熟而且應用最爲廣泛的,分別是:VMWARE的ESX、微軟的Hyper-V、開源的XEN和KVM。

從虛擬化的實現方式來看,虛擬化架構主要有兩種形式:宿主架構和裸金屬架構。

在這裏插入圖片描述

I型:虛擬機直接運行在系統硬件上,創建硬件全仿真實例,被稱爲“裸機”,也稱爲裸金屬架構。  
II型:虛擬機運行在傳統操作系統上,同樣創建的是硬件全仿真實例,被稱爲“託管”hypervisor。也稱爲宿主架構。    
還有一種容器虛擬化:虛擬機運行在傳統操作系統上,創建一個獨立的虛擬化實例,指向底層託管操作系統,被稱爲“操作系統虛擬化。  

I型獨立型:VMware vsphere(ESXI)  
I型混合型:XenServer(Xen)、Hyper-V 、Oracle VirtualBox  

I型混合架構包括一個軟件模型,一個“瘦”hypervisor聯合一個父分區提供硬件虛擬化,它提供了虛擬機監視功能。父分區也叫做Dom0(FC文檔描述:一個修改過的Linux kernel,是唯一運行在Xen Hypervisor之上的虛擬機。它擁有訪問物理I/O資源的權限,同時和系統上運行的其他虛擬機進行交互。Dom0需要在其他Domain啓動之前啓動)。  

I型組合型:基於Linux的內核虛擬機(KVM)。
基於Linux的內核虛擬機(KVM)hypervisor模型提供了一個獨一無二的I型架構,它不是在裸機上執行hypervisor,KVM利用開源Linux(包括RHEL,SUSE,Ubuntu等)作爲基礎操作系統,提供一個集成到內核的模塊(叫做KVM)實現硬件虛擬化,KVM模塊在用戶模式下執行(與獨立型和混合型hypervisor不一樣,它們都運行在內核/根模式下),但可以讓虛擬機在內核級權限使用一個新的指令執行上下文,叫做客戶機模式。  

27.2 KVM介紹

KVM是以色列公司Qumranet開發,後來被Redhat公司收購。KVM是開源的,Redhat基於KVM的虛擬化解決方案叫做RHEV。

KVM是linux內核的一個模塊,它把linux內核變成了一個Hypervisor。KVM在linux系統裏面以進程的形式出現,由標準的linux調度程序進行調度,這使得KVM能夠使用linux內核的已有功能,比如說內存管理、CPU調度等。

但是,只有一個KVM內核模塊還不能實現虛擬化的全部功能,就像操作系統只有內核還不能成爲一個完整的操作系統一樣。

QEMU是一個開源的虛擬化軟件,可以虛擬化所有的硬件,但性能不強。KVM基於QEMU開發了一個能夠運行在用戶空間的工具QEMU-KVM。這樣一來,磁盤、網絡設備等都是可以通過QEMU-KVM模擬出來,KVM和QEMU-KVM通信是通過/dev/kvm實現的。另外,libvirt是用來管理KVM虛擬機的接口(API),其命令爲virsh。

安裝KVM

準備一個虛擬機,內存4G,2核CPU(打開虛擬化引擎),2塊硬盤(分別20G即可,一塊硬盤給虛擬機上的虛擬機使用)這裏我的虛擬機系統是CentOS 7 ,我們要做的是在虛擬機系統之上再虛擬出虛擬機。

  • 關閉防火牆和selinux:
[root@lzx ~]# systemctl stop firewalld
[root@lzx ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@lzx ~]# getenforce 
Enforcing
[root@lzx ~]# setenforce 0
[root@lzx ~]# vim /etc/selinux/config
SELINUX=enforcing    改爲   SELINUX=disabled
  • 檢查CPU是否支持虛擬化:
[root@lzx ~]# grep -Ei 'vmx|svm' /proc/cpuinfo
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase tsc_adjust smep invpcid mpx rdseed smap clflushopt xsaveopt xsavec arat
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase tsc_adjust smep invpcid mpx rdseed smap clflushopt xsaveopt xsavec arat      //有vmx或svm的關鍵字就說明支持虛擬化
  • 格式化分區並掛載新增的磁盤:
[root@lzx ~]# fdisk -l     //顯示所有分區

磁盤 /dev/sda:21.5 GB, 21474836480 字節,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節
磁盤標籤類型:dos
磁盤標識符:0x000b0925

   設備 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      411647      204800   83  Linux
/dev/sda2          411648     4605951     2097152   82  Linux swap / Solaris
/dev/sda3         4605952    41943039    18668544   83  Linux

磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區       //新掛載磁盤爲/dev/sdb
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節

[root@lzx ~]# mkfs.ext4 /dev/sdb        //格式化成ext4格式
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdb is entire device, not just one partition!
無論如何也要繼續? (y,n) y    //輸入y
[root@lzx ~]# blkid /dev/sdb      //查看未掛載的分區類型
/dev/sdb: UUID="9425d437-b596-453b-8c04-59be24378ceb" TYPE="ext4"

[root@lzx ~]# mkdir /kvm_data
[root@lzx ~]# mount /dev/sdb /kvm_data       //掛載
[root@lzx ~]# vim /etc/fstab      //新增這一行,讓它開機直接掛載
/dev/sdb      /kvm_data    ext4      defaults         0 0
  • 安裝kvm:
[root@lzx ~]# yum install -y virt-* libvirt bridge-utils qemu-img
  • 增加橋接網卡:
[root@lzx ~]# cd /etc/sysconfig/network-scripts/
[root@lzx network-scripts]# cp ifcfg-ens33 ifcfg-br0
[root@lzx network-scripts]# vim ifcfg-br0
TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.33.127
NETMASK=255.255.255.0
GATEWAY=192.168.33.2
DNS1=8.8.8.8
DNS2=4.4.4.4

[root@lzx network-scripts]# vim ifcfg-ens33 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
[root@lzx network-scripts]# systemctl restart network
[root@lzx network-scripts]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.33.127  netmask 255.255.255.0  broadcast 192.168.33.255
        inet6 fe80::d3a5:5cb8:f917:cbde  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:13:48:42  txqueuelen 1000  (Ethernet)
        RX packets 30  bytes 2480 (2.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11  bytes 854 (854.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:13:48:42  txqueuelen 1000  (Ethernet)
        RX packets 237  bytes 32478 (31.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 54  bytes 7240 (7.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 40  bytes 3096 (3.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 40  bytes 3096 (3.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • 啓動libvirtd服務:
[root@lzx network-scripts]# cd 
[root@lzx ~]# systemctl start libvirtd
[root@lzx ~]# ps aux |grep libvirtd
root       7716  1.5  0.6 701696 24892 ?        Ssl  12:42   0:00 /usr/sbin/libvirtd
[root@lzx ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29134842	no		ens33
virbr0		8000.5254006471bc	yes		virbr0-nic      //kvm啓動起來的橋接網卡

創建虛擬機安裝CentOS7

使用xftp上傳CentOS7的鏡像文件到虛擬機上,xftp下載地址:https://www.netsarang.com/download/down_form.html?code=623

在這裏插入圖片描述

[root@lzx ~]# ls
1.php  anaconda-ks.cfg  CentOS-7-x86_64-Minimal-1708.iso
[root@lzx ~]# mv CentOS-7-x86_64-Minimal-1708.iso /tmp/
  • 安裝CentOS7:
[root@lzx ~]# virt-install --name=linux01 --memory=512,maxmemory=1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/tmp/CentOS-7-x86_64-Minimal-1708.iso --disk path=/kvm_data/linux01.img,size=10 --bridge=br0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0"

--name定義虛擬機名稱;--memory定義磁盤大小,maxmemory爲最大磁盤大小,可以支持熱調整;--vcpus定義cpu核數,maxcpus爲最大cpu核數;--os-type定義系統類型,--os-variant定義具體系統版本;--location定義安裝鏡像文件所在路徑,可以是鏈接;--disk path定義虛擬磁盤路徑、名字及大小;--birdge定義橋接網卡;--graphics定義是否開啓圖形;--console定義終端屬性

到選擇這一步,進行操作

在這裏插入圖片描述

第1項:語言選擇        第2項:時間設置
第3項:安裝源          第4項:軟件選擇
第5項:安裝目標        第6項:Kdump
第7項:網絡設置        第8項:root密碼
第9項:是否創建一個普通用戶並設置密碼

這裏其實和我們在VMware Workstation上安裝CentOS7類似,只不過換成了命令行下操作

首先選擇語言,按下1

在這裏插入圖片描述

再按Enter鍵,選擇68

在這裏插入圖片描述

再選擇1,簡體中文

在這裏插入圖片描述

語言設置完畢,配置完成的項就會顯示爲X。往下繼續配置時間,按下2

在這裏插入圖片描述

再按下1,設置時區

在這裏插入圖片描述

再按下2,選擇亞洲,再按Enter鍵,選擇64,上海,時間設置完畢。

在這裏插入圖片描述

往下設置安裝目標,按下5

在這裏插入圖片描述

只有一個選項,按下c,繼續

在這裏插入圖片描述

這裏默認是2,按下c,繼續

在這裏插入圖片描述

選擇1,標準分區

在這裏插入圖片描述

按下c,繼續,安裝目標設置完畢

在這裏插入圖片描述

再來設置root密碼,按下8

在這裏插入圖片描述

輸入兩遍要設置的密碼,root密碼設置完畢

在這裏插入圖片描述

接下來就不需要再設置了,按下b,開始安裝

在這裏插入圖片描述

等待幾分鐘,安裝完畢

在這裏插入圖片描述

按下Enter鍵,它會自動重啓,重啓完提示登錄

在這裏插入圖片描述

輸入賬號及密碼後登錄進來

在這裏插入圖片描述

回到宿主機,按Ctrl + ] 鍵可以回到宿主機

在這裏插入圖片描述

虛擬機管理

上面已經安裝好了一臺虛擬機,那麼在宿主機命令行下怎麼去管理虛擬機呢?

  • 查看剛安裝的虛擬機的虛擬磁盤:
[root@lzx ~]# df -h
文件系統        容量  已用  可用 已用% 掛載點
/dev/sda3        18G  5.2G   13G   29% /
devtmpfs        1.9G     0  1.9G    0% /dev
tmpfs           1.9G     0  1.9G    0% /dev/shm
tmpfs           1.9G  8.8M  1.9G    1% /run
tmpfs           1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sdb         20G  1.2G   18G    7% /kvm_data
/dev/sda1       197M  115M   83M   59% /boot
tmpfs           378M     0  378M    0% /run/user/0

[root@lzx ~]# ls /kvm_data/
linux01.img  lost+found        //linux01.img就是虛擬機linux01的虛擬磁盤
  • 列出當前系統所有的虛擬機:
[root@lzx ~]# virsh list --all        //不加--all,只會列出開機狀態下的虛擬機
 Id    名稱                         狀態
----------------------------------------------------
 2     linux01                        running
  • 關閉正在運行的虛擬機:
[root@lzx ~]# virsh shutdown linux01      //關閉正在運行的虛擬機
域 linux01 被關閉

[root@lzx ~]# virsh list
 Id    名稱                         狀態
----------------------------------------------------

[root@lzx ~]# virsh list --all
 Id    名稱                         狀態
----------------------------------------------------
 -     linux01                        關閉
  • 開啓關閉中的虛擬機:
[root@lzx ~]# virsh start linux01        //開啓關閉中的虛擬機
域 linux01 已開始

[root@lzx ~]# virsh list
 Id    名稱                         狀態
----------------------------------------------------
 3     linux01                        running
  • 進入開啓中的虛擬機:
關閉的虛擬機是無法進入的

[root@lzx ~]# virsh console linux01       //進入開啓中的虛擬機
連接到域 linux01
換碼符爲 ^]

[  157.307403] random: crng init done

CentOS Linux 7 (Core)
Kernel 3.10.0-693.el7.x86_64 on an x86_64

localhost login: root        
密碼:          //輸入賬號密碼登錄進來
Last login: Sun Sep 30 17:27:39 on ttyS0
[root@localhost ~]# 
  • 設置虛擬機網卡:
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:48:71:79 brd ff:ff:ff:ff:ff:ff

[root@localhost ~]# dhclient
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:48:71:79 brd ff:ff:ff:ff:ff:ff 
    inet 192.168.33.7/24 brd 192.168.33.255 scope global dynamic eth0       //獲取到IP 192.168.33.7,網段與宿主機一致,因爲是橋接模式
       valid_lft 1794sec preferred_lft 1794sec
    inet6 fe80::5054:ff:fe48:7179/64 scope link 
       valid_lft forever preferred_lft forever

[root@localhost ~]# ping www.qq.com
PING https.qq.com (58.247.214.47) 56(84) bytes of data.
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=1 ttl=128 time=13.3 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=2 ttl=128 time=18.2 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=3 ttl=128 time=14.9 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=4 ttl=128 time=15.8 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=5 ttl=128 time=14.0 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=6 ttl=128 time=11.1 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=7 ttl=128 time=14.6 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=8 ttl=128 time=15.0 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=9 ttl=128 time=11.3 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=10 ttl=128 time=22.8 ms
 
--- https.qq.com ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9021ms
rtt min/avg/max/mdev = 11.166/15.146/22.820/3.226 ms        //這時就可以聯網了,只要宿主機網絡沒有問題
  • 查看虛擬機磁盤及cpu核數:
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            480         114         145           6         220         194        //總大小爲480M
Swap:          1023           0        1023

[root@localhost ~]# cat /proc/cpuinfo 
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 44
model name	: Westmere E56xx/L56xx/X56xx (Nehalem-C)
stepping	: 1
microcode	: 0x1
cpu MHz		: 3696.004
cache size	: 4096 KB
physical id	: 0
siblings	: 1
core id		: 0
cpu cores	: 1         //數量爲1核
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 11
wp		: yes
flags		: fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm constant_tsc rep_good nopl pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 x2apic popcnt aes hypervisor lahf_lm
bogomips	: 7392.00
clflush size	: 64
cache_alignment	: 64
address sizes	: 43 bits physical, 48 bits virtual
power management:

[root@localhost ~]# df -h
文件系統        容量  已用  可用 已用% 掛載點
/dev/vda3       8.0G  1.1G  7.0G   13% /
devtmpfs        487M     0  487M    0% /dev
tmpfs           497M     0  497M    0% /dev/shm
tmpfs           497M  6.6M  490M    2% /run
tmpfs           497M     0  497M    0% /sys/fs/cgroup
/dev/vda1      1014M  119M  896M   12% /boot
tmpfs            49M     0   49M    0% /run/user/0
  • 查看宿主機kvm進程:
每一個虛擬機在宿主機上都是一個進程

[root@lzx ~]# ps aux |grep kvm
root        492  0.0  0.0      0     0 ?        S<   16:19   0:00 [kvm-irqfd-clean]
qemu       2948  4.8 14.8 1597760 573732 ?      Sl   17:41   0:49 /usr/libexec/qemu-kvm -name linux01 -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off,dump-guest-core=off -cpu Westmere -m 1024 -realtime mlock=off -smp 1,maxcpus=2,sockets=2,cores=1,threads=1 -uuid 9584c1c4-3cf4-48c4-8aae-2268822c0dd1 -display none -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-3-linux01/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x5 -drive file=/kvm_data/linux01.img,format=qcow2,if=none,id=drive-virtio-disk0 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive if=none,id=drive-ide0-0-0,readonly=on -device ide-cd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 -netdev tap,fd=26,id=hostnet0,vhost=on,vhostfd=28 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:48:71:79,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev socket,id=charchannel0,path=/var/lib/libvirt/qemu/channel/target/domain-3-linux01/org.qemu.guest_agent.0,server,nowait -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=org.qemu.guest_agent.0 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on
root       2956  0.0  0.0      0     0 ?        S    17:41   0:00 [kvm-pit/2948]
  • 強制關閉虛擬機:
[root@lzx ~]# virsh destroy linux01       //強制關閉虛擬機,等同於斷開電源
  • 刪除虛擬機:
[root@lzx ~]# virsh undefine linux01       //徹底銷燬虛擬機,會刪除虛擬機配置文件,但虛擬磁盤不會刪除
  • 查看虛擬機的配置文件:
[root@lzx ~]# ls /etc/libvirt/qemu
linux01.xml  networks         //linux01.xml就是虛擬機linux01的配置文件

[root@lzx ~]# cat /etc/libvirt/qemu/linux01.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh edit linux01
or other application using the libvirt API.
-->

<domain type='kvm'>
  <name>linux01</name>
  <uuid>9584c1c4-3cf4-48c4-8aae-2268822c0dd1</uuid>
  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>524288</currentMemory>
  <vcpu placement='static' current='1'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact' check='partial'>
    <model fallback='allow'>Westmere</model>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm_data/linux01.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:48:71:79'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
  </devices>
</domain>
  • 讓虛擬機隨宿主機開機啓動:
[root@lzx ~]# virsh autostart linux01        //讓虛擬機隨宿主機開機啓動
  • 解除虛擬機開機啓動:
[root@lzx ~]# virsh autostart --disable linux01       //解除虛擬機開機啓動
  • 掛起虛擬機:
[root@lzx ~]# virsh suspend linux01        //掛起虛擬機,類似於Windows的睡眠
  • 恢復虛擬機:
[root@lzx ~]# virsh resume linux01       //恢復虛擬機,解除掛起狀態

克隆虛擬機

克隆虛擬機,我們在VMware上面操作的時候很方便,接下來我們要在命令行下克隆虛擬機。

  • 克隆需要先關閉虛擬機:
[root@lzx ~]# virsh list --all
 Id    名稱                         狀態
----------------------------------------------------
 1     linux01                        running

[root@lzx ~]# virsh shutdown linux01
域 linux01 被關閉

[root@lzx ~]# virsh console linux01
錯誤:域未運行
  • 克隆虛擬機:
[root@lzx ~]# virt-clone --original linux01 --name linux02 --file /kvm_data/linux02.img       //virt-clone 克隆虛擬機;--original 指定克隆源;--name 指定克隆後虛擬機名稱;--file 指定新克隆虛擬機的虛擬磁盤路徑
正在分配 'linux02.img'                              |  10 GB  01:09     

成功克隆 'linux02'。

[root@lzx ~]# ls /etc/libvirt/qemu/
linux01.xml  linux02.xml  networks        //多出來linux02.xml這個配置文件

[root@lzx ~]# virsh list --all
 Id    名稱                         狀態
----------------------------------------------------
 -     linux01                        關閉
 -     linux02                        關閉        //多出來linux02這臺虛擬機

開啓了虛擬機之後,我們可以在宿主機上SSH虛擬機,退出時直接logout,這比使用virsh console 進入虛擬機方便很多。

快照管理

快照,我們可以給虛擬機當前狀態做一個記錄,這樣我們在後面如果遇到什麼問題,可以回到我們之前做快照的狀態。快照,是在宿主機上給虛擬機做的。

  • 創建快照:
[root@lzx ~]# virsh snapshot-create linux01
已生成域快照 1538982866

[root@lzx ~]# qemu-img info /kvm_data/linux01.img       //查看linux01的信息,同時會查看到linux01的快照列表
image: /kvm_data/linux01.img
file format: qcow2      //虛擬磁盤格式爲qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.2G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         1538982866                0 2018-10-08 15:14:26   00:00:00.000           //剛剛做的快照
Format specific information:
    compat: 1.1
    lazy refcounts: true

raw格式的虛擬磁盤不支持做快照,qcow2支持做快照。

  • 列出某虛擬機的所有快照:
[root@lzx ~]# virsh snapshot-list linux01        //查看linux01的所有快照
 名稱               生成時間              狀態
------------------------------------------------------------
 1538982866           2018-10-08 15:14:26 +0800 shutoff
  • 查看當前快照版本:
[root@lzx ~]# virsh snapshot-current linux01         //查看當前狀態對應的快照(距離當前狀態最近的快照)
<domainsnapshot>
  <name>1538982866</name>
  <state>shutoff</state>
  <creationTime>1538982866</creationTime>
  <memory snapshot='no'/>
  <disks>
    <disk name='vda' snapshot='internal'/>
    <disk name='hda' snapshot='no'/>
  </disks>
  <domain type='kvm'>
    <name>linux01</name>
    <uuid>9584c1c4-3cf4-48c4-8aae-2268822c0dd1</uuid>
    <memory unit='KiB'>1048576</memory>
    <currentMemory unit='KiB'>524288</currentMemory>
    <vcpu placement='static' current='1'>2</vcpu>
    <os>
      <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
      <boot dev='hd'/>
    </os>
    <features>
      <acpi/>
      <apic/>
    </features>
    <cpu mode='custom' match='exact' check='partial'>
      <model fallback='allow'>Westmere</model>
    </cpu>
    <clock offset='utc'>
      <timer name='rtc' tickpolicy='catchup'/>
      <timer name='pit' tickpolicy='delay'/>
      <timer name='hpet' present='no'/>
    </clock>
    <on_poweroff>destroy</on_poweroff>
    <on_reboot>restart</on_reboot>
    <on_crash>destroy</on_crash>
    <pm>
      <suspend-to-mem enabled='no'/>
      <suspend-to-disk enabled='no'/>
    </pm>
    <devices>
      <emulator>/usr/libexec/qemu-kvm</emulator>
      <disk type='file' device='disk'>
        <driver name='qemu' type='qcow2'/>
        <source file='/kvm_data/linux01.img'/>
        <target dev='vda' bus='virtio'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
      </disk>
      <disk type='file' device='cdrom'>
        <driver name='qemu' type='raw'/>
        <target dev='hda' bus='ide'/>
        <readonly/>
        <address type='drive' controller='0' bus='0' target='0' unit='0'/>
      </disk>
      <controller type='usb' index='0' model='ich9-ehci1'>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
      </controller>
      <controller type='usb' index='0' model='ich9-uhci1'>
        <master startport='0'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
      </controller>
      <controller type='usb' index='0' model='ich9-uhci2'>
        <master startport='2'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
      </controller>
      <controller type='usb' index='0' model='ich9-uhci3'>
        <master startport='4'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
      </controller>
      <controller type='ide' index='0'>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
      </controller>
      <controller type='virtio-serial' index='0'>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
      </controller>
      <controller type='pci' index='0' model='pci-root'/>
      <interface type='bridge'>
        <mac address='52:54:00:48:71:79'/>
        <source bridge='br0'/>
        <model type='virtio'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
      </interface>
      <serial type='pty'>
        <target type='isa-serial' port='0'>
          <model name='isa-serial'/>
        </target>
      </serial>
      <console type='pty'>
        <target type='serial' port='0'/>
      </console>
      <channel type='unix'>
        <target type='virtio' name='org.qemu.guest_agent.0'/>
        <address type='virtio-serial' controller='0' bus='0' port='1'/>
      </channel>
      <input type='mouse' bus='ps2'/>
      <input type='keyboard' bus='ps2'/>
      <memballoon model='virtio'>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
      </memballoon>
    </devices>
  </domain>
</domainsnapshot>
  • 查看快照配置文件:
[root@lzx ~]# ls /var/lib/libvirt/qemu/snapshot/linux01/
1538982866.xml
[root@lzx ~]# virsh snapshot-create linux01     //再對linux01創建一個快照
已生成域快照 1538983646
[root@lzx ~]# ls /var/lib/libvirt/qemu/snapshot/linux01/
1538982866.xml  1538983646.xml       //多出來一個快照配置文件
[root@lzx ~]# virsh snapshot-list linux01      
 名稱               生成時間              狀態
------------------------------------------------------------
 1538982866           2018-10-08 15:14:26 +0800 shutoff
 1538983646           2018-10-08 15:27:26 +0800 shutoff
  • 恢復指定快照:
[root@lzx ~]# virsh snapshot-revert linux01 1538982866       //恢復指定快照
[root@lzx ~]# virsh snapshot-list linux01
 名稱               生成時間              狀態
------------------------------------------------------------
 1538982866           2018-10-08 15:14:26 +0800 shutoff
 1538983646           2018-10-08 15:27:26 +0800 shutoff       //恢復前面的快照狀態,後面做的快照也不會消失

[root@lzx ~]# ls /var/lib/libvirt/qemu/snapshot/linux01/
1538982866.xml  1538983646.xml
  • 刪除指定快照:
[root@lzx ~]# virsh snapshot-delete linux01 1538982866        //刪除指定快照
已刪除域快照 1538982866

[root@lzx ~]# virsh snapshot-list linux01
 名稱               生成時間              狀態
------------------------------------------------------------
 1538983646           2018-10-08 15:27:26 +0800 shutoff

[root@lzx ~]# ls /var/lib/libvirt/qemu/snapshot/linux01/
1538983646.xml

虛擬磁盤格式

虛擬磁盤有兩種常用格式,分別是 raw 和 qcow2 ,默認格式是qcow2 。其中,qcow2支持做快照,而raw不支持做快照。

  • 查看虛擬磁盤格式:
[root@lzx ~]# qemu-img info /kvm_data/linux01.img      //查看虛擬磁盤格式
image: /kvm_data/linux01.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.2G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
2         1538983646                0 2018-10-08 15:27:26   00:00:00.000
Format specific information:
    compat: 1.1
    lazy refcounts: true
  • 創建raw格式磁盤:
[root@lzx ~]# qemu-img create -f raw /kvm_data/linux01_2.img 2G         //qemu-img create 創建虛擬磁盤;-f 指定磁盤格式;後面跟磁盤具體路徑和大小
Formatting '/kvm_data/linux01_2.img', fmt=raw size=2147483648 
[root@lzx ~]# qemu-img info /kvm_data/linux01_2.img     
image: /kvm_data/linux01_2.img
file format: raw
virtual size: 2.0G (2147483648 bytes)
disk size: 0
  • 轉換磁盤格式:
[root@lzx ~]# qemu-img convert -O qcow2 /kvm_data/linux01_2.img /kvm_data/linux01_2.qcow2       //qemu-img convert 轉換磁盤格式;-O 指定目標格式;後面先跟要轉換的源磁盤文件,再跟目標磁盤文件。相當於複製,源磁盤文件不發生變化

[root@lzx ~]# qemu-img info /kvm_data/linux01_2.qcow2 
image: /kvm_data/linux01_2.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
  • 對比兩種格式:
[root@lzx kvm_data]# ls -lnth
總用量 2.4G
-rw------- 1 107 107 1.2G 10月  8 16:01 linux02.img
-rw-r--r-- 1   0   0 193K 10月  8 15:56 linux01_2.qcow2
-rw-r--r-- 1   0   0 2.0G 10月  8 15:45 linux01_2.img
-rw------- 1   0   0  11G 10月  8 15:33 linux01.img
drwxr-xr-x 2   0   0 4.0K 9月  30 17:35 lost+found
[root@lzx kvm_data]# du -sh *
0	linux01_2.img
196K	linux01_2.qcow2
1.2G	linux01.img
1.2G	linux02.img
4.0K	lost+found

qcow2格式的磁盤佔用多大就顯示爲多大,而raw格式的磁盤分配給多大就顯示爲多大,即使並沒有佔用完。相比較而言,raw格式的磁盤讀寫性能要比qcow2格式的磁盤更好一些,但raw格式磁盤無法做快照。

  • 更改linux02虛擬磁盤爲raw格式並啓動:
[root@lzx kvm_data]# virsh list
 Id    名稱                         狀態
----------------------------------------------------
 2     linux02                        running

[root@lzx kvm_data]# virsh shutdown linux02
域 linux02 被關閉
[root@lzx kvm_data]# qemu-img convert -O raw /kvm_data/linux02.img /kvm_data/linux02_3.raw

[root@lzx kvm_data]# virsh edit linux02      //更改格式和文件路徑,類似於vim

<driver name='qemu' type='qcow2'/>       改爲       <driver name='qemu' type='raw'/> 
      <source file='/kvm_data/linux02.img'/>               <source file='/kvm_data/linux02_3.raw'/>
[root@lzx kvm_data]# ll
總用量 3597444
-rw-r--r-- 1 root root  2147483648 10月  8 15:45 linux01_2.img
-rw-r--r-- 1 root root      197120 10月  8 15:56 linux01_2.qcow2
-rw------- 1 root root 10739515904 10月  8 15:33 linux01.img
-rw-r--r-- 1 root root 10737418240 10月  8 16:25 linux02_3.raw
-rw------- 1 root root  1229455360 10月  8 16:23 linux02.img
drwxr-xr-x 2 root root        4096 9月  30 17:35 lost+found
[root@lzx kvm_data]# virsh start linux02
域 linux02 已開始

[root@lzx kvm_data]# ll
總用量 3597444
-rw-r--r-- 1 root root  2147483648 10月  8 15:45 linux01_2.img
-rw-r--r-- 1 root root      197120 10月  8 15:56 linux01_2.qcow2
-rw------- 1 root root 10739515904 10月  8 15:33 linux01.img
-rw-r--r-- 1 qemu qemu 10737418240 10月  8 16:25 linux02_3.raw        //這裏屬主屬組發生了改變,說明linux02使用的磁盤是這塊磁盤文件
-rw------- 1 root root  1229455360 10月  8 16:23 linux02.img
drwxr-xr-x 2 root root        4096 9月  30 17:35 lost+found
[root@lzx kvm_data]# virsh snapshot-create linux02       
錯誤:不支持的配置:存儲類型 vda 不支持磁盤 raw 的內部快照       //這時再來做快照會報錯

磁盤擴容(raw)

當虛擬機磁盤空間不足時,需要我們對其擴容,那如何去擴容呢?

  • 增加虛擬磁盤空間:
[root@lzx kvm_data]# qemu-img resize /kvm_data/linux02_3.raw +2G     //qemu-img resize 調整虛擬磁盤大小;+2G 增加2G
Image resized.

[root@lzx kvm_data]# qemu-img info /kvm_data/linux02_3.raw 
image: /kvm_data/linux02_3.raw
file format: raw
virtual size: 12G (12884901888 bytes)      //之前是10G,現在是12G
disk size: 1.1G

但這樣還不行,如果這時進入虛擬機linux02查看,會發現還不是12G空間,還需要在宿主機上重啓虛擬機

[root@lzx kvm_data]# virsh shutdown linux02
域 linux02 被關閉

[root@lzx kvm_data]# virsh start linux02
域 linux02 已開始

[root@lzx kvm_data]# virsh console linux02
連接到域 linux02
換碼符爲 ^]


CentOS Linux 7 (Core)
Kernel 3.10.0-693.el7.x86_64 on an x86_64

localhost login: root
密碼:
Last login: Mon Oct  8 14:37:53 from 192.168.33.6
[root@localhost ~]# fdisk -l

磁盤 /dev/vda:12.9 GB, 12884901888 字節,25165824 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節
磁盤標籤類型:dos
磁盤標識符:0x000ad6b3

   設備 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux

重新分區,但不要破壞原分區

[root@localhost ~]# fdisk /dev/vda
歡迎使用 fdisk (util-linux 2.23.2)。

更改將停留在內存中,直到您決定將更改寫入磁盤。
使用寫入命令前請三思。


命令(輸入 m 獲取幫助):p

磁盤 /dev/vda:12.9 GB, 12884901888 字節,25165824 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節
磁盤標籤類型:dos
磁盤標識符:0x000ad6b3

   設備 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux

命令(輸入 m 獲取幫助):n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): p
已選擇分區 4
起始 扇區 (20971520-25165823,默認爲 20971520):
將使用默認值 20971520
Last 扇區, +扇區 or +size{K,M,G} (20971520-25165823,默認爲 25165823):
將使用默認值 25165823
分區 4 已設置爲 Linux 類型,大小設爲 2 GiB

命令(輸入 m 獲取幫助):p

磁盤 /dev/vda:12.9 GB, 12884901888 字節,25165824 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節
磁盤標籤類型:dos
磁盤標識符:0x000ad6b3

   設備 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux
/dev/vda4        20971520    25165823     2097152   83  Linux      //這裏就是新分出來的2G分區

命令(輸入 m 獲取幫助):q
  • 除了對已有磁盤擴容外,還可以增加新的磁盤:
[root@lzx kvm_data]# qemu-img create -f raw /kvm_data/linux02_4.raw 5G
Formatting '/kvm_data/linux02_4.raw', fmt=raw size=5368709120 
[root@lzx kvm_data]# qemu-img info linux02_4.raw 
image: linux02_4.raw
file format: raw
virtual size: 5.0G (5368709120 bytes)
disk size: 0
[root@lzx kvm_data]# virsh edit linux02         //找到<disk type='file' device='disk'>部分,粘貼下面內容,相當於多給一塊磁盤
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/kvm_data/linux02_4.raw'/>       //路徑改變
      <target dev='vdb' bus='virtio'/>        //dev='vdb',不再是'vda'
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08'  function='0x0'/>       //slot改變,不能與上面磁盤的slot相同
    </disk>
[root@lzx kvm_data]# virsh shutdown linux02
域 linux02 被關閉

[root@lzx kvm_data]# virsh start linux02
域 linux02 已開始

[root@lzx kvm_data]# virsh console linux02
連接到域 linux02
換碼符爲 ^]

CentOS Linux 7 (Core)
Kernel 3.10.0-693.el7.x86_64 on an x86_64

localhost login: root
密碼:
Last login: Mon Oct  8 16:49:03 on ttyS0
[root@localhost ~]# fdisk -l

磁盤 /dev/vda:12.9 GB, 12884901888 字節,25165824 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節
磁盤標籤類型:dos
磁盤標識符:0x000ad6b3

   設備 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux

磁盤 /dev/vdb:5368 MB, 5368709120 字節,10485760 個扇區        //多出來磁盤 /dev/vdb
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節

磁盤擴容(qcow2)

上面講的擴容方式是針對raw格式的。針對qcow2格式,在有快照的情況下是無法直接增加虛擬磁盤空間的

[root@lzx kvm_data]# qemu-img resize /kvm_data/linux01.img +2G
qemu-img: Can't resize an image which has snapshots
qemu-img: This image does not support resize        //這裏有報錯

除非刪除所有快照,然後纔可以直接增加磁盤空間

[root@lzx kvm_data]# virsh snapshot-list linux01
 名稱               生成時間              狀態
------------------------------------------------------------
 1538983646           2018-10-08 15:27:26 +0800 shutoff
[root@lzx kvm_data]# virsh snapshot-delete linux01 1538983646
已刪除域快照 1538983646
[root@lzx kvm_data]# qemu-img resize /kvm_data/linux01.img +2G
Image resized.

剩餘步驟與上面raw格式的一致

另外,除了直接增加虛擬磁盤空間外,可以額外增加磁盤,操作方式與raw一致,virsh edit 時都要注意更改source、target、slot 。

調整CPU、內存、網卡

  • 查看虛擬機配置:
[root@lzx kvm_data]# virsh dominfo linux01      //查看虛擬機配置
Id:             -
名稱:       linux01
UUID:           9584c1c4-3cf4-48c4-8aae-2268822c0dd1
OS 類型:    hvm
狀態:       關閉
CPU:          1
最大內存: 1048576 KiB
使用的內存: 524288 KiB
持久:       是
自動啓動: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
  • 編輯虛擬機配置文件:
[root@lzx kvm_data]# virsh edit linux01        //編輯虛擬機配置文件
<vcpu placement='static' current='1'>2</vcpu>       改爲      <vcpu placement='static' current='2'>2</vcpu>

[root@lzx kvm_data]# virsh start linux01
域 linux01 已開始
[root@lzx kvm_data]# virsh dominfo linux01
Id:             6
名稱:       linux01
UUID:           9584c1c4-3cf4-48c4-8aae-2268822c0dd1
OS 類型:    hvm
狀態:       running
CPU:          2        //CPU核數爲2
CPU 時間:   18.5s
最大內存: 1048576 KiB
使用的內存: 524288 KiB
持久:       是
自動啓動: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
  • 動態調整內存:
[root@lzx kvm_data]# virsh setmem linux01 800m        //virsh setmem 動態調整內存,增加減小都可以,不需要重啓虛擬機

[root@lzx kvm_data]# virsh dominfo linux01
Id:             6
名稱:       linux01
UUID:           9584c1c4-3cf4-48c4-8aae-2268822c0dd1
OS 類型:    hvm
狀態:       running
CPU:          2
CPU 時間:   19.7s
最大內存: 1048576 KiB
使用的內存: 819200 KiB
持久:       是
自動啓動: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
  • 動態調整CPU核數:
[root@lzx kvm_data]# virsh setvcpus linux01 1       //virsh setvcpus 動態調整CPU核數,不需要重啓虛擬機
錯誤:不支持的配置:failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count         //該方式減小核數會報錯,但增加沒問題

[root@lzx kvm_data]# virsh setvcpus linux01 2

動態調整的前提是提前設置好了最大調整範圍,超過這個範圍,動態調整不會起作用。

  • 查看網卡:
[root@lzx kvm_data]# virsh domiflist linux01        //查看網卡
接口     類型     源        型號      MAC
-------------------------------------------------------
vnet1      bridge     br0        virtio      52:54:00:48:71:79
  • 增加網卡:
[root@lzx kvm_data]# virsh attach-interface linux01 --type bridge --source virbr0      //virsh attach-interfac 增加網卡;--type 指定連接類型;--source 指定橋接的源網卡
成功附加接口
[root@lzx kvm_data]# virsh domiflist linux01
接口     類型     源        型號      MAC
-------------------------------------------------------
vnet1      bridge     br0        virtio      52:54:00:48:71:79
vnet2      bridge     virbr0     rtl8139     52:54:00:0c:ac:11
[root@lzx kvm_data]# virsh attach-interface linux01 --type bridge --source br0
成功附加接口

[root@lzx kvm_data]# virsh domiflist linux01
接口     類型     源        型號      MAC
-------------------------------------------------------
vnet1      bridge     br0        virtio      52:54:00:48:71:79
vnet2      bridge     virbr0     rtl8139     52:54:00:0c:ac:11
vnet3      bridge     br0        rtl8139     52:54:00:cf:2f:be
  • 加載配置文件:
[root@lzx kvm_data]# virsh dumpxml linux01 > /etc/libvirt/qemu/linux01.xml     //virsh dumpxml 加載配置文件

上面調整內存、CPU、網卡,沒有這一步,下次開機重啓後所有配置不會生效。

遷移虛擬機

在生產環境中,我們難免會因爲種種原因,需要去遷移虛擬機。

遷移虛擬機需要拷貝兩個文件,一個是配置文件,另一個是虛擬磁盤文件。

  • 需要保證虛擬機是關機狀態
[root@lzx kvm_data]# virsh list
 Id    名稱                         狀態
----------------------------------------------------
 5     linux02                        running
 6     linux01                        running

[root@lzx kvm_data]# virsh shutdown linux01
域 linux01 被關閉
  • 拷貝配置文件
[root@lzx kvm_data]# virsh dumpxml linux01 > /etc/libvirt/qemu/linux03.xml      //如果是遠程機器,可以使用rsync -av 將配置文件拷貝到遠程機器
  • 拷貝磁盤文件
[root@lzx kvm_data]# virsh domblklist linux01       //查看虛擬機磁盤所在目錄
目標     源
------------------------------------------------
vda        /kvm_data/linux01.img
[root@lzx kvm_data]# rsync -av /kvm_data/linux01.img /kvm_data/linux03.img      //遠程需要加上遠程機器ip地址進行拷貝
  • 更改配置文件:
[root@lzx kvm_data]# vi /etc/libvirt/qemu/linux03.xml       //遷移到本機時,配置文件不改會有衝突,如果是遠程遷移不需要做修改

<domain type='kvm' id='6'>     改爲      <domain type='kvm' id='6'>
  <name>linux01</name>                     <name>linux03</name>
  
<uuid>9584c1c4-3cf4-48c4-8aae-2268822c0dd1</uuid>     改爲    <uuid>9584c1c4-3cf4-48c4-8aae-2268811c0dd1</uuid>      //隨便改下數字,位數不要變

    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm_data/linux03.img'/>      //source這裏需要修改
      <backingStore/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
  • 定義新虛擬機:
[root@lzx kvm_data]# virsh define /etc/libvirt/qemu/linux03.xml        //定義新虛擬機
[root@lzx kvm_data]# virsh list --all         //會發現新遷移的linux03虛擬機
 Id    名稱                         狀態
----------------------------------------------------
 5     linux02                        running
 -     linux01                        關閉
 -     linux03                        關閉

另外,遷移虛擬機時,如果是遠程機器,需要遠程機器上安裝KVM,不然遷移過去也運行不起來。

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