基于本地存儲的kvm虛擬機在線遷移
kvm虛擬機遷移分為4種
(1)熱遷移基于共享存儲
(2)熱遷移基于本地存儲
(3)冷遷移基于共享存儲
(4)冷遷移基于本地存儲
這里介紹的是基于本地存儲的熱遷移
動態塊遷移版本要求
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服務 源宿主機和目標宿主機都要執行
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監聽方式,無論是tcp,ssh,tls認證方式都需要配置 , 源宿主機和目標宿主機都要執行
vi /etc/sysconfig/libvirtd
LIBVIRTD_ARGS="--listen"
3、編輯/etc/libvirt/qemu.conf文件 源宿主機和目標宿主機都要執行
vi /etc/libvirt/qemu.conf
vnc_listen = "0.0.0.0"
解釋
vnc_listen:使虛擬機帶外VNC默認監聽.0.0.0.0
4、重啟libvirtd服務,使配置生效, 源宿主機和目標宿主機都要執行
/etc/init.d/libvirtd restart
5、檢查端口和進程,libvirtd是否監聽16509端口, 源宿主機和目標宿主機都要執行
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、在目標宿主機創建同樣大小的鏡像文件,路徑、名稱也要一樣
要加上preallocation=metadata,否則使用virt-install命令安裝完成后虛擬機磁盤鏡像會變為raw格式
qemu-img create -f qcow2 -o preallocation=metadata /data/kvmimg/CQ-NGINX01.qcow2 100G
9、遷移 ,192.168.1.26為目標宿主機的內網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、在目標宿主機執行,會顯示paused狀態 即是suspended狀態
watch virsh list --all
11、在目標宿主機執行,顯示遷移進度
tailf /var/log/libvirt/qemu/CQ-NGINX01.log
12、在目標宿主機執行,鏡像文件目錄為/data/kvmimg/,顯示虛擬機鏡像的大小,會看到虛擬機鏡像會不斷增大表示數據已經在遷移過來
注意創建鏡像文件的時候要使用preallocation=metadata
cd /data/kvmimg/
watch du -h *
13、虛擬機遷移完成后,源宿主機為關機狀態,目標宿主機變為running狀態
virsh list --all #源宿主機
virsh list --all #目標宿主機
14、源宿主機刪除xml配置文件
virsh destroy CQ-NGINX01
virsh undefine CQ-NGINX01
注意:
遷移過程中ping會有卡頓,有時會丟幾個包,如果虛擬機中有部署數據庫,應用程序最好有重連機制
回遷方法
建議不要刪除源宿主機上的鏡像文件,保留鏡像文件
#在目標宿主機上執行 ,回遷到源宿主機
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
注意:
源宿主機和目標宿主機最好要保持硬件一致 ,這樣遷移和回遷出問題的幾率才能降到最低!
遷移速度和成功率和網絡有很大關系,宿主機的網絡盡量是萬兆或千兆多網卡綁定,可以提高遷移速度和成功率
#限制遷移速度 為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是一樣的。(之前看論壇里發的解決方法是需要下載一個dmidecode 命令的文件去替換系統的,達到修改的目的,不過我只是修改了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 直接創建一個就可以,沒有disk.img 直接create一個
注:創建的磁盤應該和源虛擬機的磁盤是一樣的大小(更大應該是可以)和格式(raw還是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
可能目標宿主機和源宿主機內存不夠
建議:目標宿主機和源宿主機上都關閉一些不必要的虛擬機把內存騰出來
也可以清空cache把內存騰出來
#清除cache 首先執行sync命令
sync
echo 3 > /proc/sys/vm/drop_caches
基于TCP認證方式的遷移(需要輸入用戶名和密碼)
步驟跟上面大致相同,只是有些步驟需要做相應變更
1、配置libvirtd服務 源宿主機和目標宿主機都要執行,auth_tcp使用sasl認證方式
vi /etc/libvirt/libvirtd.conf
auth_tcp = "sasl"
sed -i 's/^#auth_tcp = \"sasl\"/auth_tcp = \"sasl\"/' /etc/libvirt/libvirtd.conf
2、創建libvirt管理用戶virtadmin
saslpasswd2 -a libvirt virtadmin
Password:
Again (for verification):
用戶名:virtadmin
密碼:xxxxxxx
可以使用sasldblistuser2命令查看創建了那些用戶:
sasldblistusers2 -f /etc/libvirt/passwd.db
7、在源宿主機連接目標宿主機的libvirtd并查看虛擬機信息,會詢問用戶和密碼,輸入saslpasswd2命令創建的用戶virtadmin和密碼即可
virsh -c qemu+tcp://root@192.168.1.26:16509/system
Please enter your authentication name: virtadmin
Please enter your password:
Welcome to virsh, the virtualization interactive terminal.
9、遷移 ,192.168.1.26為目標宿主機的內網IP,tcp認證方式,遷移時間有點長需要開一個screen窗口,不需要cd 到鏡像文件所在目錄,
同樣輸入saslpasswd2 命令創建的用戶virtadmin和密碼即可
screen -S migratekvm
virsh migrate --live --copy-storage-all --unsafe --persistent CQ-NGINX01 qemu+tcp://root@192.168.1.26:16509/system
Please enter your authentication name: virtadmin
Please enter your password:
文章列表
![]() |
不含病毒。www.avast.com |