抽空學學KVM(七):虛擬機快照和克隆

前幾天學寫了KVM中qume-info命令的使用,今天學學在虛擬化裡面用處廣泛的快照和克隆功能,snapshot和virt-clone。對於snapshot命令的使用其實很簡單。進入virsh介面以後可以查看對對應的命令查看詳細的參數使用介紹。

virsh # snapshot-                        #snapshot命令主要是這10個命令
snapshot-create     snapshot-dumpxml    snapshot-parent
snapshot-create-as  snapshot-edit       snapshot-revert
snapshot-current    snapshot-info       
snapshot-delete     snapshot-list       
virsh # snapshot-
#snapshot-create - Create a snapshot from XML #從XML文件裡面創建一個快照
#snapshot-create-as - Create a snapshot from a set of args;Create a snapshot (disk and RAM) from arguments;#從一個argument(內容提要)裡面創建一個快照
#snapshot-current - Get or set the current snapshot        #獲取當前快照
#snapshot-delete - Delete a domain snapshot                #刪除快照
#snapshot-dumpxml - Dump XML for a domain snapshot                #備份某一實例的快照當前的xml文件
#snapshot-edit - edit XML for a snapshot,Returns basic information about a snapshot.#編輯某個快照的xml文件
#snapshot-list - List snapshots for a domain              #快照列表
#snapshot-parent - Get the name of the parent of a snapshot;Extract the snapshot's parent, if any #提取某個快照的跟
#snapshot-revert - Revert a domain to a snapshot;Revert domain to snapshot; #將實例恢復到快照的某一狀態

下面簡單看看常見的命令使用吧

virsh # list --all
 Id    Name                           State
----------------------------------------------------
 1     test-kvm                       running

virsh # snapshot-create test-kvm
Domain snapshot 1603521065 created          #為什麼這裡創建的快照的名字時這一串數值呢?
virsh # snapshot-list test-kvm
Name Creation Time State
------------------------------------------------------------
1603521065 2020-10-24 14:31:05 +0800 running   #快照的名稱其實是與我創建的快照時的北京時間相關的。這個數字的叫做格林威治時間,也叫作Unix時間戳,說明1970.1.1到現在過了1603521065秒
virsh #

[root@KVM03-10 opt]# ll -h
total 6.7G
-rw-------. 1 root root 10G Oct 11 12:14 centos2.1.raw
-rw-r--r--. 1 qemu qemu 1.5G Oct 24 14:40 centos2.1.raw.qcow2
-rw-r--r--. 1 qemu qemu 4.1G Apr 27 20:56 CentOS-7.3-x86_64-DVD-1611.iso
-rw-r--r--. 1 root root 193K Oct 11 11:55 raw-to-qcow2.qcow2
-rw-r--r--. 1 root root 1.0G Oct 11 11:35 resize.raw
-rw-r--r--. 1 root root 5.4K Oct 11 12:38 test-kvm.xml
-rw-r--r--. 1 root root 257K Oct 11 11:36 test.qcow2
-rw-r--r--. 1 root root 5.0G Oct 11 10:50 test.raw

[root@KVM03-10 opt]# virsh snapshot-list test-kvm
Name Creation Time State
------------------------------------------------------------
1603521065 2020-10-24 14:31:05 +0800 running
1603521844 2020-10-24 14:44:04 +0800 running

[root@KVM03-10 opt]# ll -h
total 7.7G
-rw-------. 1 root root 10G Oct 11 12:14 centos2.1.raw
-rw-r--r--. 1 qemu qemu 1.7G Oct 24 14:44 centos2.1.raw.qcow2    #發現做一次快照,虛機使用的磁碟就會增加一部分,說明其實我的快照文件是放在這個虛機的磁碟文件中的。
-rw-r--r--. 1 qemu qemu 4.1G Apr 27 20:56 CentOS-7.3-x86_64-DVD-1611.iso
-rw-r--r--. 1 root root 193K Oct 11 11:55 raw-to-qcow2.qcow2
-rw-r--r--. 1 root root 1.0G Oct 11 11:35 resize.raw
-rw-r--r--. 1 root root 5.4K Oct 11 12:38 test-kvm.xml
-rw-r--r--. 1 root root 257K Oct 11 11:36 test.qcow2
-rw-r--r--. 1 root root 5.0G Oct 11 10:50 test.raw
[root@KVM03-10 opt]#
virsh # snapshot-delete test-kvm --current        #刪除虛機當前快照,發現虛機的磁碟文件並未縮小。
Domain snapshot 1603521844 deleted
root@KVM03-10 opt]# ll -h
total 6.7G
-rw-------. 1 root root 10G Oct 11 12:14 centos2.1.raw
-rw-r--r--. 1 qemu qemu 1.7G Oct 24 15:00 centos2.1.raw.qcow2    #這是因為當前虛機所有磁碟格式為寫時複製,也就是說虛機的磁碟會越來越大
-rw-r--r--. 1 qemu qemu 4.1G Apr 27 20:56 CentOS-7.3-x86_64-DVD-1611.iso
-rw-r--r--. 1 root root 193K Oct 11 11:55 raw-to-qcow2.qcow2
-rw-r--r--. 1 root root 1.0G Oct 11 11:35 resize.raw
-rw-r--r--. 1 root root 5.4K Oct 11 12:38 test-kvm.xml
-rw-r--r--. 1 root root 257K Oct 11 11:36 test.qcow2
-rw-r--r--. 1 root root 5.0G Oct 11 10:50 test.raw
[root@KVM03-10 opt]#

下面再來試一下依照快照恢復,做這個操作前,首先確認虛機是否已經在宿主機上上做了快照。然後進入虛機內部,刪系統文件rm -rf /*

virsh # snapshot-revert test-kvm --current      #通過快照恢復系統

virsh # reboot --domain test-kvm           #重啟虛機後,虛機正常
Domain test-kvm is being rebooted

快照功能就這麼多,其實在生產中很少會到命令行的形式去做快照,一般是在前台介面操作。下面在學習一下虛機的克隆命令哈。

[root@KVM03-10 opt]# virt-clone --help
usage: virt-clone --original [NAME] ...
Duplicate a virtual machine, changing all the unique host side configuration like MAC address, name, etc.
The VM contents are NOT altered: virt-clone does not change anything _inside_ the guest OS, it only duplicates disks and does host side changes. So things like changing passwords, changing static IP address, etc are outside the scope of this tool. For these types of changes, please see virt-sysprep(1).

簡單介紹一下virt-clone的命令描述吧。virt-clone是用來複制一台虛擬機並改變所有主機側唯一的資訊,包括Mac地址、主機名(這個主機名應該是KVM平台看到的主機名,而不是虛機系統內部的主機名)等

虛機內容並不會被改變,virt-clone命令不會改變用戶作業系統內的任何資訊,它僅僅是拷貝磁碟和完成主機名的修改。所以像修改用戶名(local-host),修改靜態IP地址等不屬於該命令的範圍,如果要做此類修改,請參加virt-sysprep。

常用的命令

General Options:
  -o ORIGINAL_GUEST, --original ORIGINAL_GUEST Name of the original guest; The status must be shut off or paused.    #被克隆的虛機
  --original-xml ORIGINAL_XML    XML file to use as the original guest.
  --auto-clone          Auto generate clone name and storage paths from the original guest configuration.
  -n NEW_NAME, --name NEW_NAME Name for the new guest          #克隆後的名字
  --reflink             use btrfs COW lightweight copy
[root@KVM03-10 opt]# virt-clone -o test-kvm -n test-kvm-clone --auto-clone
WARNING  Setting the graphics device port to autoport, in order to avoid conflicting.  #提示,為了避免衝突,把克隆出來的虛機的VNC埠設置設置為了自動
WARNING  The requested volume capacity will exceed the available pool space when the volume is fully allocated. (10240 M requested capacity > 8768 M available)
Allocating 'centos2.1.raw-clone.qcow2'                           |  10 GB  00:00:09

Clone 'test-kvm-clone' created successfully.

查看虛機的xml文件如下:

  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>            #該虛機磁碟文件類型為QCOW2,因為克隆前的磁碟文件也是,所以不會修改
      <source file='/opt/centos2.1.raw-clone.qcow2'/>    #該虛機使用的磁碟文件路徑在此,因為克隆命令的選項為auto-clone。此時虛機的磁碟文件路徑與原機器一樣
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>

再衝突的對比一下克隆前後的兩台機器之間xml文件的區別,檢查發現和virt-clone解釋內容一致。對比虛機系統內部的用戶名是沒有修改的,因為IP地址為DHCP,所以會有變化

[root@KVM03-10 qemu]# diff test-kvm.xml test-kvm-clone.xml
4c4
<   virsh edit test-kvm
---
>   virsh edit test-kvm-clone
9,10c9,10
<   <name>test-kvm</name>
<   <uuid>a9c5fb0f-9f5f-4f0b-87ca-06f4b6dfc62d</uuid>      #克隆前虛機的名字和UUID
---
>   <name>test-kvm-clone</name>
>   <uuid>e6598719-4944-49cd-83f6-85cfe431883f</uuid>    #克隆後虛機的名字和UUID
52c52
<       <source file='/opt/centos2.1.raw.qcow2'/>        #磁碟文件路徑
---
>       <source file='/opt/centos2.1.raw-clone.qcow2'/>
76a77
>     <controller type='pci' index='0' model='pci-root'/>
83d83
<     <controller type='pci' index='0' model='pci-root'/>
85c85
<       <mac address='52:54:00:db:81:f8'/>          #克隆前虛機的Mac地址
---
>       <mac address='52:54:00:c3:44:a1'/>          #克隆後虛機的Mac地址
122a123
>   <seclabel type='dynamic' model='dac' relabel='yes'/>
[root@KVM03-10 qemu]#

宿主機的VNC埠多了5901,因為VNC自動分配

[root@KVM03-10 opt]# netstat -tlunp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      2123/qemu-kvm
tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      4434/qemu-kvm

被克隆虛機的快照在克隆過程中不會被一併克隆

[root@KVM03-10 opt]# ll -h
total 7.9G
-rw-------. 1 root root  10G Oct 11 12:14 centos2.1.raw
-rw-------. 1 qemu qemu 1.2G Oct 24 16:05 centos2.1.raw-clone.qcow2   #克隆後的虛機磁碟文件不會包含克隆前虛機的快照
-rw-r--r--. 1 qemu qemu 1.7G Oct 24 16:05 centos2.1.raw.qcow2
-rw-r--r--. 1 qemu qemu 4.1G Apr 27 20:56 CentOS-7.3-x86_64-DVD-1611.iso
-rw-r--r--. 1 root root 193K Oct 11 11:55 raw-to-qcow2.qcow2
-rw-r--r--. 1 root root 1.0G Oct 11 11:35 resize.raw
-rw-r--r--. 1 root root 5.4K Oct 11 12:38 test-kvm.xml
-rw-r--r--. 1 root root 257K Oct 11 11:36 test.qcow2
-rw-r--r--. 1 root root 5.0G Oct 11 10:50 test.raw
[root@KVM03-10 opt]#

剛才操作的過程叫做完全克隆,是把虛機的磁碟文件完完整整的複製一份,對於生產中大磁碟虛機,速度可能比較慢,另外還有一種克隆方式叫連接克隆。其實對於這一區別,vmware workstations對這個做出了很好的解釋:

 

 

下面就創建一個鏈接克隆玩一把。

[root@KVM03-10 opt]# qemu-img create -f qcow2 -b centos2.1.raw.qcow2 centos2.1.raw-clone-link.qcow2    
#-b選項可參見「rebase [-q] [-f fmt] [-t cache] [-T src_cache] [-p] [-u] -b backing_file [-F backing_fmt] filename」

#其實這條命令中也可以通過「-o」實現,具體可看一下
Formatting 'centos2.1.raw-clone-link.qcow2', fmt=qcow2 size=10737418240 backing_file='centos2.1.raw.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off [root@KVM03-10 opt]#

[root@KVM03-10 opt]# qemu-img create -f qcow2 -o ? centos2.1.raw-clone-link.qcow2
Supported options:

  1. size Virtual disk size
  2. compat Compatibility level (0.10 or 1.1)
  3. backing_file File name of a base image
  4. backing_fmt Image format of the base image
  5. encryption Encrypt the image
  6. cluster_size qcow2 cluster size
  7. preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
  8. lazy_refcounts Postpone refcount updates

[root@KVM03-10 opt]#

[root@KVM03-10 opt]# qemu-img create -f qcow2 -o backing_file=centos2.1.raw.qcow2 centos2.1.raw-clone-link-o.qcow2
Formatting ‘centos2.1.raw-clone-link-o.qcow2′, fmt=qcow2 size=10737418240 backing_file=’centos2.1.raw.qcow2’ encryption=off cluster_size=65536 lazy_refcounts=off
[root@KVM03-10 opt]#

[root@KVM03-10 opt]# ll -h
total 7.9G
-rw——-. 1 root root 10G Oct 11 12:14 centos2.1.raw
-rw-r–r–. 1 root root 193K Oct 24 16:42 centos2.1.raw-clone-link-o.qcow2
-rw-r–r–. 1 root root 193K Oct 24 16:34 centos2.1.raw-clone-link.qcow2    #通過鏈接克隆做到的很小
-rw——-. 1 qemu qemu 1.2G Oct 24 16:31 centos2.1.raw-clone.qcow2

查看磁碟資訊

[root@KVM03-10 opt]# qemu-img info centos2.1.raw-clone-link-o.qcow2
image: centos2.1.raw-clone-link-o.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
backing file: centos2.1.raw.qcow2
Format specific information:
    compat: 1.1
    lazy refcounts: false
[root@KVM03-10 opt]# qemu-img info centos2.1.raw-clone-link.qcow2
image: centos2.1.raw-clone-link.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
backing file: centos2.1.raw.qcow2   #該磁碟文件的後置配磁碟文件,所以的讀寫都是基於centos2.1.raw.qcow2進行。換句話說比如在centos2.1.raw.qcow2上安裝了某軟體,centos2.1.raw-clone-link.qcow2大小也不會發送變化
Format specific information:
    compat: 1.1
    lazy refcounts: false
[root@KVM03-10 opt]#

準備好虛機的磁碟文件以後,需要再搞一個虛機的配置文件,直接複製即可,不過需要修改一下配置文件中所使用到的磁碟文件目錄和名字

[root@KVM03-10 qemu]# cp test-kvm.xml test-kvm-clone-link.xml
[root@KVM03-10 qemu]# ll
total 24
drwxr-xr-x. 2 root root   26 Oct 11 10:11 autostart
drwx------. 3 root root   42 Aug 26 09:58 networks
-rw-------. 1 root root 4577 Oct 24 16:57 test-kvm-clone-link.xml
-rw-------. 1 root root 4650 Oct 24 15:43 test-kvm-clone.xml
-rw-------. 1 root root 4577 Oct 24 15:12 test-kvm.xml

<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type=’file’ device=’disk’>
<driver name=’qemu’ type=’qcow2’/>
<source file=’/opt/centos2.1.raw-clone-link.qcow2’/>

<interface type=’network’>


<source network=’default’/>
<model type=’virtio’/>
<address type=’pci’ domain=’0x0000′ bus=’0x00′ slot=’0x03′ function=’0x0’/>

[root@KVM03-10 qemu]# virsh define test-kvm-clone-link.xml    #導入成功
Domain test-kvm-clone-link defined from test-kvm-clone-link.xml

[root@KVM03-10 qemu]# virsh start test-kvm-clone-link
Domain test-kvm-clone-link started

[root@KVM03-10 qemu]# virsh list –all              #啟動成功
Id Name State
—————————————————-
1 test-kvm running
2 test-kvm-clone running
3 test-kvm-clone-link running

[root@KVM03-10 qemu]#

[root@KVM03-10 qemu]# virsh console test-kvm-clone-link
Connected to domain test-kvm-clone-link
Escape character is ^]

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

localhost login: root
Password:
Last login: Sat Oct 24 15:14:11 on tty1
[root@localhost ~]#                    #系統正常

進入到虛機內部創建一個文件

[root@localhost ~]# dd if=/dev/zero of=/home/test-liuhuan.raw bs=200M count=4  #創建了一個800Mb的文件
4+0 records in
4+0 records out
838860800 bytes (839 MB) copied, 10.4435 s, 80.3 MB/s
[root@localhost ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        10G  1.8G  8.3G  18% /
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
tmpfs           100M     0  100M   0% /run/user/0
[root@localhost ~]# cd /home/
[root@localhost home]# ll -h
total 801M
-rw-r--r--. 1 root root 4.0K Aug 31 22:28 grub2.cfg.bak
-rw-r--r--. 1 root root 4.0K Aug 31 22:30 grub.cfg.bak
-rw-r--r--. 1 root root 800M Oct 24 17:21 test-liuhuan.raw
[root@localhost home]#

[root@KVM03-10 opt]# ll -h
total 8.9G
-rw——-. 1 root root 10G Oct 11 12:14 centos2.1.raw
-rw-r–r–. 1 root root 193K Oct 24 16:42 centos2.1.raw-clone-link-o.qcow2
-rw-r–r–. 1 qemu qemu 807M Oct 24 17:23 centos2.1.raw-clone-link.qcow2   #通過鏈接創建出來的虛機的磁碟文件增加了800M,但是後置備的磁碟文件的目錄並未增加
-rw——-. 1 qemu qemu 1.2G Oct 24 17:18 centos2.1.raw-clone.qcow2
-rw-r–r–. 1 qemu qemu 1.7G Oct 24 17:03 centos2.1.raw.qcow2
[root@KVM03-10 opt]#

 

[root@localhost ~]# dd if=/dev/zero of=/home/test-liuhuan.raw bs=300M count=2 #在test-kvm,即通過鏈接方式被克隆的虛機,創建一個600M的文件
2+0 records in
2+0 records out
629145600 bytes (629 MB) copied, 9.02812 s, 69.7 MB/s
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 10G 1.6G 8.5G 16% /
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
tmpfs 100M 0 100M 0% /run/user/0
[root@localhost ~]#

[root@KVM03-10 opt]# ll -h
total 9.4G
-rw——-. 1 root root 10G Oct 11 12:14 centos2.1.raw
-rw-r–r–. 1 root root 193K Oct 24 16:42 centos2.1.raw-clone-link-o.qcow2
-rw-r–r–. 1 qemu qemu 807M Oct 24 17:37 centos2.1.raw-clone-link.qcow2
-rw——-. 1 qemu qemu 1.2G Oct 24 17:39 centos2.1.raw-clone.qcow2
-rw-r–r–. 1 qemu qemu 2.0G Oct 24 17:39 centos2.1.raw.qcow2        #test-kvm的虛機磁碟文件也隨之增加,但鏈接克隆出來的虛機的磁碟文件不會增加
-rw-r–r–. 1 qemu qemu 4.1G Apr 27 20:56 CentOS-7.3-x86_64-DVD-1611.iso
-rw-r–r–. 1 root root 193K Oct 11 11:55 raw-to-qcow2.qcow2
-rw-r–r–. 1 root root 1.0G Oct 11 11:35 resize.raw
-rw-r–r–. 1 root root 257K Oct 11 11:36 test.qcow2
-rw-r–r–. 1 root root 5.0G Oct 11 10:50 test.raw

#也就是可以這樣理解,因為qcow2文件類型的特點為寫時複製,通過鏈接方式克隆出來的虛機運行過程使用的系統與被克隆虛機為同一個。但是後面再次增加其他文件則寫到自己虛機的磁碟文件中。但是如果刪除了原虛機的磁碟文件,鏈接克隆出來的虛機將無法正常運行。

 

 

 

Tags: