導讀: 本文系原創,歡迎規範轉載。 本文描述瞭如何處理linux虛擬機從xen虛擬化遷移kvm虛擬化遇到問題,包括重建initramfs,處理未卸載的tools等。 系列文章: xen2kvm遷移-Windows篇 xen2kvm遷移-Linux篇 遷移環境: 源平臺:華為FusionCompute ...
導讀:
本文系原創,歡迎規範轉載。
本文描述瞭如何處理linux虛擬機從xen虛擬化遷移kvm虛擬化遇到問題,包括重建initramfs,處理未卸載的tools等。
系列文章:
xen2kvm遷移-Windows篇
xen2kvm遷移-Linux篇
遷移環境:
源平臺:華為FusionComputeV100R006C10SPC101
目標平臺:基於KVM虛擬化的雲平臺,本文以原生的libvirt為例
虛擬機:centos 7.6
具體操作步驟:
1、在源平臺導出格式為ovf的磁碟鏡像
導出後,得到vhd文件:centos_xen-1.vhd
。將該文件傳輸到一個裝有libvirt和相關工具套件的Linux環境上,本文所使用的是一臺centos7.6物理機,部署了GUI界面,安裝了libvirt libvirt-client qemu-img virt-manager
等工具。
2、下載華為自研的qemu-img-hw命令
解壓得到命令,為命令賦予執行許可權:
[root@hyperhost ~ ]$ unzip qemu-img-hw.zip
[root@hyperhost ~ ]$ cd qemu-img-hw.zip
[root@hyperhost ~ ]$ chmod a+x qemu-img-hw
使用該命令查看導出vhd文件格式:
據華為公有雲文檔描述:zvhd和zvhd2是雲服務內部自研格式,qemu-img工具無法識別這兩種格式的鏡像文件,需要使用華為自研的qemu-img-hw工具:
[root@hyperhost ~ ]$ ./qemu-img-hw info centos_xen-1.vhd
image: centos_xen-1.vhd
file format: zvhd
virtual size: 100G (107374182400 bytes)
disk size: 769M
如果使用原生的qemu-img命令查看鏡像格式,會顯示raw,會誤導用戶接下來錯誤的執行轉換命令:
[root@hyperhost ~]$ qemu-img info centos_xen-1.vhd
image: centos_xen-1.vhd
file format: raw
virtual size: 769M (806404096 bytes)
disk size: 769M
3、將zvhd格式轉換為qcow2格式
轉換時間依數據量而定
[root@hyperhost ~]$ ./qemu-img-hw convert -p -f zvhd -O qcow2 centos_xen-1.vhd centos_xen.qcow2
(100.00/100%)
# 轉換成功:
[root@hyperhost ~]$ qemu-img info centos_xen.qcow2
image: centos_xen.qcow2
file format: qcow2
virtual size: 100G (107374182400 bytes)
disk size: 1.6G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false
4、部署為kvm虛擬機
本文使用virt-manager將qcow2磁碟部署為虛擬機:
5、啟動虛擬機,處理故障
本虛擬機安裝時使用了lvm邏輯捲,會報此卡在啟動界面:
超時後提示用戶,找不到邏輯捲:
重啟:
按滑鼠下鍵,進入rescue kernel:
重建initramfs文件,掃描vg,激活vg,重啟虛擬機
先嘗試重建initramfs文件,如果不行再嘗試掃描、激活vg。
# 重建initramfs文件
[root@localhost ~]# dracut -f
# 掃描vg
[root@localhost ~]# lvm vgscan
# 激活vg
[root@localhost ~]# lvm vgchange -ay
# 重啟
[root@localhost ~]# init 6
以預設內核啟動
啟動正常:
6、另一個場景
現在看另一個場景,需要遷移的虛擬機為centos7:
- 安裝了GUI,並且日常以圖形化界面啟動;
- 安裝了華為的uvp-tools;
- 沒有使用lvm;
- 啟用了selinux;
排查思路:
轉換qcow2格式的鏡像、上傳kvm環境這些操作都一樣:
[root@hyperhost ~]$ qemu-img-hw convert -p -f zvhd -O qcow2 centos_1qaz-1.vhd centos_1qaz-1.qcow2
在之前的場景下,正常啟動時報錯無法找到磁碟,針對這種情況,需要使用dracut -f 重建initramfs。
並且因為找到不到磁碟,所以無法掛載根磁碟chroot進行修複,因此需要在rescue kernel啟動。
但是在安裝了GUI的場景下,使用rescue kernel會卡在數字logo啟動界面:
這裡因為有GUI,所以我們無法知道到卡住的原因,所以我們嘗試掛載iso鏡像,進入救援模式進行修複。
進入救援模式後,按照說明輸入1選擇繼續,這裡提示我們需要救援的環境已經被掛載到了/mnt/sysimage,此時按下回車繼續,執行chroot /mnt/sysimage進入我們要救援的系統:
執行dracut -f
重建initramfs,這裡我們順便禁用selinux:
如果有多個kernel,這裡需要執行:dracut --regenerate-all -f
兩次輸入exit,退出救援模式。這次我們選擇使用本地盤啟動。並且之前因為GUI的原因,我們無法看到啟動時的boot message,這裡我們解決這個問題:
選擇第一個內核,按下e進入編輯:
將linux16開頭的這行中rhgb quiet
內容刪掉,按下ctrl+x組合鍵:
其中:
rhgb = redhat graphical boot
quiet = 靜默模式,不顯示boot message
啟動後,會卡在這裡,我們發現,這裡提示Xen_hcall:DomU hypercall user-space has been created.
Xen_hcall是xen的半虛擬化驅動,該驅動要和主機的xen api(其實就是hypercall)通信,因為我們已經遷移到kvm環境上,該驅動本應該在導出之前卸載,這裡我們演示如何處理沒有卸載tools的情況:
強制重啟,重新進入光碟救援模式,在/etc/.uvp-monitor路徑下果然發現tools沒有卸載,嘗試執行卸載腳本無法執行:
這裡我們的思路是,xen_hcall是一個模塊,在開機時自動載入,因此我們去開機啟動腳本看看,果然發現載入xen_hcall的命令:
嘗試修該文件,發現沒有許可權,為其添加許可權,chmod u+w /etc/rc.d/rc.local
,然後修改文件:
重新啟動,註意從本地盤啟動,發現已經可以正常啟動了:
在實際操作過程中,處理完xen_hcall模塊的問題後,筆者兩次發現了虛擬機啟動會卡在nfs這裡:
經過排查發現,安裝圖形化桌面時,會自動安裝nfs並啟用,如果出現這種情況,需要再次進入救援模式,刪除nfs-client.taget的軟鏈接,避免開機自動啟動。
rm /etc/systemd/system/nfs-client.target
後續工作:
- 卸載cdrom設備,或者修改啟動順序,從本地盤啟動;
- 卸載uvp vm-tools;
思路總結:
- 如果出現無法找到根磁碟,則必須重建initramfs,如果有多個內核,要對所有內核進行重建:
dracut --regenerate-all -f
- 如果虛擬機安裝了tools,導出前需要卸載;如果沒卸載可以參考本文處理;
- 如果虛擬機使用了圖形化,為了便於在啟動時看到報錯信息,需要編輯grub菜單去掉rhgb quiet參數;
作者:wang272
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出。 原文鏈接 如有問題,可郵件([email protected])咨詢。