詳解基于本地存儲的kvm虛擬機在線遷移
kvm虛擬機遷移分為4種
(1)熱遷移基于共享存儲
(2)熱遷移基于本地存儲
(3)冷遷移基于共享存儲
(4)冷遷移基于本地存儲
這里介紹的是基于本地存儲的熱遷移
動態(tài)塊遷移版本要求
qemu版本要求 大于或等于0.12.1(centos6.7或以上都沒問題)
rpm -qa|grep qemu qemu-kvm-0.12.1.2-2.491.el6_8.1.x86_64 qemu-kvm-tools-0.12.1.2-2.491.el6_8.1.x86_64
目標宿主機:192.168.1.24 機器名:CQ-KVM01
源宿主機:192.168.1.26 機器名:CQ-KVM02
遷移使用tcp認證方式
kvm虛擬機名稱,是一臺跑nginx的虛擬機:CQ-NGINX01
1、配置libvirtd服務 源宿主機和目標宿主機都要執(zhí)行
vi /etc/libvirt/libvirtd.conf listen_tls = 0 listen_tcp = 1 tcp_port = "16509" listen_addr = "0.0.0.0" auth_tcp = "none" mdns_adv = 0
解釋
- listen_tls:關閉tls,默認是開啟的
- listen_tcp :開啟tcp認證
- tcp_port:tcp端口配置,默認端口是16509
- auth_tcp:配置是否開啟口令認證,默認不開啟
- mdns_adv:是否開啟mdns組播,默認關閉
sed -i 's/^#listen_tls = 0/listen_tls = 0/' /etc/libvirt/libvirtd.conf sed -i 's/^#listen_tcp = 1/listen_tcp = 1/' /etc/libvirt/libvirtd.conf sed -i 's/^#tcp_port = \"16509\"/tcp_port = \"16509\"/' /etc/libvirt/libvirtd.conf sed -i 's/^#listen_addr = \"192.168.0.1\"/listen_addr = \"0.0.0.0\"/' /etc/libvirt/libvirtd.conf sed -i 's/^#auth_tcp = \"sasl\"/auth_tcp = \"none\"/' /etc/libvirt/libvirtd.conf sed -i 's/^#mdns_adv = 1/mdns_adv = 0/' /etc/libvirt/libvirtd.conf
cat libvirtd.conf |grep -iE "listen_tls" cat libvirtd.conf |grep -iE "listen_tcp" cat libvirtd.conf |grep -iE "tcp_port" cat libvirtd.conf |grep -iE "listen_addr" cat libvirtd.conf |grep -iE "auth_tcp" cat libvirtd.conf |grep -iE "mdns_adv"
2、配置libvirtd監(jiān)聽方式,無論是tcp,ssh,tls認證方式都需要配置 , 源宿主機和目標宿主機都要執(zhí)行
vi /etc/sysconfig/libvirtd LIBVIRTD_ARGS="--listen"
3、編輯/etc/libvirt/qemu.conf文件 源宿主機和目標宿主機都要執(zhí)行
vi /etc/libvirt/qemu.conf vnc_listen = "0.0.0.0"
解釋
- vnc_listen:使虛擬機帶外VNC默認監(jiān)聽.0.0.0.0
4、重啟libvirtd服務,使配置生效, 源宿主機和目標宿主機都要執(zhí)行
/etc/init.d/libvirtd restart
5、檢查端口和進程,libvirtd是否監(jiān)聽16509端口, 源宿主機和目標宿主機都要執(zhí)行
netstat -lntp | grep libvirtd
tcp 0 0 0.0.0.0:16509 0.0.0.0:* LISTEN 48825/libvirtd
修改iptables腳本,放行16509端口和49152端口
#ACCESS kvm iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 5900:5909 -j ACCEPT iptables -A INPUT -p tcp --dport 16509 -j ACCEPT iptables -A INPUT -p tcp --dport 49152 -j ACCEPT
6、在源宿主機和目標宿主機加上IP和主機的解析
#24機器上 echo "192.168.1.26 CQ-KVM02" >> /etc/hosts #26機器上 echo "192.168.1.24 CQ-KVM01" >> /etc/hosts
7、在源宿主機連接目標宿主機的libvirtd并查看虛擬機信息
virsh -c qemu+tcp://root@192.168.1.26:16509/system virsh -c qemu+tcp://root@192.168.1.24:16509/system
8、在目標宿主機創(chuàng)建同樣大小的鏡像文件,路徑、名稱也要一樣
要加上preallocation=metadata,否則使用virt-install命令安裝完成后虛擬機磁盤鏡像會變?yōu)閞aw格式
qemu-img create -f qcow2 -o preallocation=metadata /data/kvmimg/CQ-NGINX01.qcow2 100G
9、遷移 ,192.168.1.26為目標宿主機的內(nèi)網(wǎng)IP,tcp認證方式,遷移時間有點長需要開一個screen窗口,不需要cd 到鏡像文件所在目錄
screen -S migratekvm virsh migrate --live --copy-storage-all --unsafe --persistent CQ-NGINX01 qemu+tcp://root@192.168.1.26:16509/system
10、在目標宿主機執(zhí)行,會顯示paused狀態(tài) 即是suspended狀態(tài)
watch virsh list --all
11、在目標宿主機執(zhí)行,顯示遷移進度
tailf /var/log/libvirt/qemu/CQ-NGINX01.log
12、在目標宿主機執(zhí)行,鏡像文件目錄為/data/kvmimg/,顯示虛擬機鏡像的大小,會看到虛擬機鏡像會不斷增大表示數(shù)據(jù)已經(jīng)在遷移過來
注意創(chuàng)建鏡像文件的時候要使用preallocation=metadata
cd /data/kvmimg/ watch du -h *
13、虛擬機遷移完成后,源宿主機為關機狀態(tài),目標宿主機變?yōu)閞unning狀態(tài)
virsh list --all #源宿主機 virsh list --all #目標宿主機
14、源宿主機刪除xml配置文件
virsh destroy CQ-NGINX01 virsh undefine CQ-NGINX01
注意:
遷移過程中ping會有卡頓,有時會丟幾個包,如果虛擬機中有部署數(shù)據(jù)庫,應用程序最好有重連機制
回遷方法
建議不要刪除源宿主機上的鏡像文件,保留鏡像文件
#在目標宿主機上執(zhí)行 ,回遷到源宿主機
virsh dumpxml CQ-NGINX01 >~/CQ-NGINX01.xml virsh migrate --live --copy-storage-all --unsafe --persistent CQ-NGINX01 qemu+tcp://root@192.168.1.24:16509/system
注意:
源宿主機和目標宿主機最好要保持硬件一致 ,這樣遷移和回遷出問題的幾率才能降到最低!
遷移速度和成功率和網(wǎng)絡有很大關系,宿主機的網(wǎng)絡盡量是萬兆或千兆多網(wǎng)卡綁定,可以提高遷移速度和成功率
#限制遷移速度 為600M/s virsh migrate-setspeed CQ-NGINX01 600
--------------------------------------------------------------------------------
在線遷移問題匯總
(如果ssh的端口不是默認22,可以寫為 qemu+ssh://target:port/system)
Question 1:
error: internal error hostname on destination resolved to localhost, but migration requires an FQDN
解決辦法很簡單,因為默認情況下hostname 是 localhost,我們需要把目標的hostname修改一下,臨時的也可以。
#hostname target
Question 2:
error: internal error Attempt to migrate guest to the same host 00020003-0004-0005-0006-000700080009
這個在mail list 中有大牛說是服務器提供商的問題,你可以用#dmidecode -s system-uuid 查看一下這個ID,理論上是#virsh sysinfo | grep uuid 及# virsh capabilities | grep uuid
這三個ID是一樣的。(之前看論壇里發(fā)的解決方法是需要下載一個dmidecode 命令的文件去替換系統(tǒng)的,達到修改的目的,不過我只是修改了libvirt的配置文件就可以了,可能是版本的問題)
我們修改一下libvirtd的配置文件
#sed -i "/#host_uuid/ahost_uuid = \"`uuidgen`\"" /etc/libvirt/libvirtd.conf
重啟一下libvirtd 服務
# /etc/init.d/libvirtd restart
然后再查看一下
# virsh capabilities | grep uuid
Question 3:
error: unable to set user and group to '107:107' on '/image/vmtest/disk.img': No such file or directory
如果順利進入到這步的話,就很簡單了,沒有directory 直接創(chuàng)建一個就可以,沒有disk.img 直接create一個
注:創(chuàng)建的磁盤應該和源虛擬機的磁盤是一樣的大?。ǜ髴撌强梢裕┖透袷剑╮aw還是qcow2)
qemu-img create /image/vmtest/disk.img +sizeG
Question 4:
error: Unable to resolve address 'target' service '49155': Name or service not known
《《Name or service not known》》在/etc/hosts 添加解析的ip和target的域名即可
Question 5:
virsh migrate --live --copy-storage-all --unsafe --persistent CQ-NGINX01 qemu+tcp://root@192.168.1.24:16509/system
error: Unable to read from monitor: Connection reset by peer
可能目標宿主機和源宿主機內(nèi)存不夠
建議:目標宿主機和源宿主機上都關閉一些不必要的虛擬機把內(nèi)存騰出來
也可以清空cache把內(nèi)存騰出來
#清除cache 首先執(zhí)行sync命令
sync echo 3 > /proc/sys/vm/drop_caches
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
詳解kvm部署三個虛擬機實現(xiàn) WordPress 實驗
這篇文章主要介紹了詳解kvm部署三個虛擬機實現(xiàn) WordPress 實驗,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11