1. 程式人生 > >KVM虛擬機的克隆

KVM虛擬機的克隆

order nor 位置 直接 ron 允許 手動 error target

克隆KVM虛擬機使用到的命令是virt-clone,該工具主要用來克隆虛擬機,也可以使用一系列參數對克隆出的新虛擬機進行定制化。

需要註意的是,virt-clone不會修改Guest OS內的任何信息,它僅僅只是復制虛擬機磁盤並在宿主機端做一些修改。所以,類似修改密碼、設置靜態IP地址等都無法通過virt-clone來完成。


virt-clone的用法:

基礎選項:

--version:查看版本

-h,--help:查看幫助信息

--connect=URI:連接到虛擬機管理程序 libvirt 的URI

一般選項:

-o ORIGINAL_GUEST, --original=ORIGINAL_GUEST:原來的虛擬機名稱,原虛擬機必須處於關機或者暫定狀態

--original-xml=ORIGINAL_XML:使用XML文件作為原始虛擬機

--auto-clone:從原來的虛擬機配置自動生成克隆名稱和存儲路徑。例如,原虛擬機名為VM01,那克隆的虛擬機名為VM01-clone,原虛擬機的磁盤路徑為/usr/src/VM01.img,克隆後的虛擬機磁盤路徑為/usr/src/VM01-clone.img

-n NEW_NAME, --name=NEW_NAME:新的虛擬機名稱

-u NEW_UUID, --uuid=NEW_UUID:克隆虛擬機的新的UUID,默認值是一個隨機生成的UUID

存儲選項:

-f NEW_DISKFILE, --file=NEW_DISKFILE:指定新的虛擬機磁盤文件

--force-copy=TARGET:強制復制設備

--nonsparse:不使用稀疏文件復制磁盤映像

--preserve-data:不克隆存儲設備,新的虛擬機鏡像通過--file指定原始的未做修改的鏡像,並將它同克隆後的虛擬機的XML文件關聯起來

網絡選項:

-m NEW_MAC, --mac=NEW_MAC:設置一個新的mac地址,默認是一個隨機的mac

混雜選項:

--print-xml:並不真正執行克隆操作,而是僅僅打印自動生成的克隆後的XML文件

--replace:不檢查命名沖突,允許使用新的克隆替換已經存在的虛擬機

-d, --debug:打印debug調試信息

--prompt:要求用戶輸入多種條件或者必須的選項

--force:不使用命令提示符來輸入,相當於在適用的選項直接回復yes選項,並結束所有的命令提示符操作

-q, --quiet: 僅僅輸出錯誤信息,阻止其他信息的輸出


virt-clone克隆虛擬機示例:

[root@kvm-node1 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 1     centos6.5                      running
[root@kvm-node1 ~]# virsh shutdown centos6.5
Domain centos6.5 is being shutdown
[root@kvm-node1 ~]# virsh list
 Id    Name                           State
----------------------------------------------------

1)使用--auto-clone進行克隆

首先,確認源虛擬機已關機後,使用virt-clone進行虛擬機克隆。

[root@kvm-node1 ~]# virt-clone -o centos6.5 --auto-clone
Cloning centos6.img                                                                     |  10 GB     02:04     
Clone 'centos6.5-clone' created successfully.

待虛擬機克隆完成後,使用virsh list --all查看系統中已註冊的domain.

[root@kvm-node1 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
[root@kvm-node1 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos6.5                      shut off
 -     centos6.5-clone                   shut off

再到宿主機的libvirt目錄查看虛擬機的xml文件:

[root@kvm-node1 ~]# ll /etc/libvirt/qemu/
total 12
-rw------- 1 root root 3071 Jun 30 23:09 centos6.5-clone.xml
-rw------- 1 root root 3053 Jun 26 03:25 centos6.5.xml
drwx------ 3 root root 4096 Jun 25 07:16 networks

檢查源虛擬機和克隆出的虛擬機的xml配置的磁盤文件位置:

[root@kvm-node1 ~]# awk -F"'" '/<source file=/{print $2}' /etc/libvirt/qemu/centos6.5.xml 
/images/kvm/centos6.img
[root@kvm-node1 ~]# awk -F"'" '/<source file=/{print $2}' /etc/libvirt/qemu/centos6.5-clone.xml 
/images/kvm/centos6-clone.img

到磁盤文件目錄查看:

[root@kvm-node1 ~]# ll /images/kvm/centos6*
-rwxr-xr-x 1 root root 10737418240 Jun 30 23:11 /images/kvm/centos6-clone.img
-rwxr-xr-x 1 root root 10737418240 Jun 30 23:08 /images/kvm/centos6.img

2)使用--name對新虛擬機進行命名,使用--file指定存儲位置

[root@kvm-node1 ~]# virt-clone --original centos6.5 --name newcentos6 --file /opt/tools/newcentos6.img
Cloning centos6.img                                                                     |  10 GB     01:06     
Clone 'newcentos6' created successfully.
[root@kvm-node1 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos6.5                      shut off
 -     newcentos6                     shut off
[root@kvm-node1 ~]# ll /etc/libvirt/qemu/
total 12
-rw------- 1 root root 3053 Jun 26 03:25 centos6.5.xml
drwx------ 3 root root 4096 Jun 25 07:16 networks
-rw------- 1 root root 3057 Jun 30 23:31 newcentos6.xml
[root@kvm-node1 ~]# awk -F"'" '/<source file=/{print $2}' /etc/libvirt/qemu/centos6.5.xml 
/images/kvm/centos6.img
[root@kvm-node1 ~]# awk -F"'" '/<source file=/{print $2}' /etc/libvirt/qemu/newcentos6.xml 
/opt/tools/newcentos6.img
[root@kvm-node1 ~]# ll /images/kvm/centos6*
-rwxr-xr-x 1 root root 10737418240 Jun 30 23:08 /images/kvm/centos6.img
[root@kvm-node1 ~]# ll /opt/tools/newcentos6*
-rwxr-xr-x 1 root root 10737418240 Jun 30 23:32 /opt/tools/newcentos6.img
3)指定多個存儲路徑
[root@kvm-node1 opt]# virt-clone > --connect qemu:///system > --original centos6.5 > --name centos6.5-2 > --file /usr/src/centos6.5-2-system.img > --file /usr/src/centos6.5-2-data.img
Cloning centos6.img                                                                     |  10 GB     01:21     
Clone 'centos6.5-2' created successfully.

註意:使用多個--file的場景為原虛擬機有多個磁盤,比如系統盤和數據盤,或者系統盤和CDROM(因為光盤是只讀,所以需要使用--force選項)等。

4)使用已有的物理磁盤用作新虛擬機的磁盤文件

首先,檢查一下原虛擬機的磁盤映像文件:

[root@kvm-node1 ~]# qemu-img info /images/kvm/centos6.img 
image: /images/kvm/centos6.img
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 1.5G
使用qemu-img創建一個新的映像文件:
[root@kvm-node1 ~]# qemu-img create -f raw -o size=10G /images/kvm/mycentos6.img
Formatting '/images/kvm/mycentos6.img', fmt=raw size=10737418240

查看新的映像文件信息:

[root@kvm-node1 ~]# qemu-img info /images/kvm/mycentos6.img 
image: /images/kvm/mycentos6.img
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 0

使用virt-clone進行虛擬機克隆操作,因為是對已有文件進行覆蓋寫入,註意要指定--force參數,不然會報錯。

[root@kvm-node1 ~]# virt-clone --connect qemu:///system --original centos6.5 --name mycentos6.5 --file /images/kvm/mycentos6.img --force --mac 52:54:00:26:5a:86
Cloning centos6.img                                                                     |  10 GB     00:59     
Clone 'mycentos6.5' created successfully.

克隆成功後,使用virsh list -all查看:

[root@kvm-node1 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos6.5                      shut off
 -     mycentos6.5                     shut off

檢查新舊虛擬機配置文件中定義的磁盤文件路徑:

[root@kvm-node1 ~]# awk -F"'" '/<source file=/{print $2}' /etc/libvirt/qemu/centos6.5.xml 
/images/kvm/centos6.img
[root@kvm-node1 ~]# awk -F"'" '/<source file=/{print $2}' /etc/libvirt/qemu/mycentos6.5.xml 
/images/kvm/mycentos6.img

查看原虛擬機的磁盤文件信息:

[root@kvm-node1 ~]# qemu-img info /images/kvm/mycentos6.img 
image: /images/kvm/mycentos6.img
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 10G

再檢查克隆後的虛擬機的磁盤文件信息:

[root@kvm-node1 ~]# qemu-img info /images/kvm/centos6.img 
image: /images/kvm/centos6.img
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 1.5G

註意:雖然克隆後的虛擬機顯示disk size為10G,但是在文件系統中占用的空間仍舊和原虛擬機一樣。

最後,檢查一下兩個虛擬機配置文件中設定的mac地址:

[root@kvm-node1 ~]# awk -F"'" '/mac address/{print $2}' centos6.5.xml 
awk: cmd. line:1: fatal: cannot open file `centos6.5.xml' for reading (No such file or directory)
[root@kvm-node1 ~]# awk -F"'" '/mac address/{print $2}' /etc/libvirt/qemu/centos6.5.xml 
52:54:00:26:5a:8d
[root@kvm-node1 ~]# awk -F"'" '/mac address/{print $2}' /etc/libvirt/qemu/mycentos6.5.xml 
52:54:00:26:5a:86

可以看到,克隆的虛擬機已經將mac地址修改成virt-clone中設置的值了。

註意:使用已經存在的磁盤去克隆虛擬機,要求已存在的磁盤空間大於或等於原虛擬機的磁盤空間大小,如果已存在的磁盤空間比原虛擬機的磁盤空間大,那麽在克隆完成後虛擬機會在第一次啟動時進行文件系統調整。


使用克隆後的虛擬機:

以上面最後一種方法創建的虛擬機mycentos6.5為例:

[root@kvm-node1 kvm]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos6.5                      shut off
 -     mycentos6.5                    shut off
[root@kvm-node1 kvm]# virsh start centos6.5
Domain centos6.5 started
[root@kvm-node1 kvm]# virsh start mycentos6.5
error: Failed to start domain mycentos6.5
error: internal error Process exited while reading console log output: char device redirected to /dev/pts/3
2018-06-30T16:14:43.410547Z qemu-kvm: Failed to start VNC server on `0.0.0.0:0': socket bind failed: Address already in use

這裏出現一個錯誤,是因為VNC監聽地址已使用,需要重新制定一個新的端口,這裏使用virsh edit命令進行修改:


[root@kvm-node1 kvm]# virsh edit mycentos6.5
Domain mycentos6.5 XML configuration edited.

說明:只是將mycentos6.5.xml中的VNC端口由5900修改為5901.

[root@kvm-node1 kvm]# virsh start mycentos6.5
Domain mycentos6.5 started

技術分享圖片

使用vnc連接虛擬機後,發現網卡名字為eth2,因為原虛擬機已經存有eth0和eth1的配置文件,所以這裏自動生成了eth2網卡,但是mac地址是我們之前指定的,所以需要手動修改

/etc/udev/rules.d/70-persistent-net.rules 相關配置,然後重啟虛擬機即可,不再贅述。

綜上,使用virt-clone克隆虛擬機的使用分為如下步驟:

1、 使用virt-clone命令進行克隆

2、 通過virsh edit命令修改克隆後虛擬機的VNC連接端口

3、 配置克隆後虛擬機的網卡

KVM虛擬機的克隆