KVM虛擬機的克隆
需要註意的是,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虛擬機的克隆