【v2v遷移】Xen2kvm 遷移-linux篇

来源:https://www.cnblogs.com/wang272/archive/2023/10/23/xen2kvm_linux_virtual_machine_migration.html
-Advertisement-
Play Games

導讀: 本文系原創,歡迎規範轉載。 本文描述瞭如何處理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])咨詢。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 高精度(加減乘除) 高精度的核心思想就是利用數組去儲存大數,然後通過模擬手動計算的方式,來進行計算。 主要分三個模塊: 1.讀入數據並轉換為(int)類型儲存 高精度加法 核心思想:將每個位上的數字都+起來,如果大於10就進位。 核心代碼如下: c[i]+=a[i]+b[i];//兩數相加 c[i+ ...
  • Go的map是一種高效的數據結構,用於存儲鍵值對。其底層實現是一個哈希表(hash table),下麵是有關map底層實現的詳細介紹: 哈希表: map的底層實現是一個哈希表,也稱為散列表。哈希表是一個數組,其中每個元素被稱為"桶",用於存儲鍵值對。 哈希表的大小是可動態調整的,當存儲的鍵值對數量達 ...
  • 函數是一段代碼塊,只有在調用時才會運行。您可以將數據(稱為參數)傳遞給函數。 函數可以返回數據作為結果。 創建函數 在Python中,使用def關鍵字定義函數: 示例 def my_function(): print("Hello from a function") 調用函數 要調用函數,請使用函數 ...
  • Python流程式控制制是Python編程中非常重要的一部分,它用於控製程序的執行流程。Python提供了多種流程式控制制語句,包括if語句、while迴圈、for迴圈、break和continue語句等。這種流程式控制制在各個語言中都是大同小異的,如果你已經學過其他的語言,那麼這章節就可以直接跳過。 if語句 ...
  • 模板智能數組指針 1.管理任意類型的數組指針 2.釋放的時候自動刪除數組指針指向的記憶體 //模板智能數組指針 template<typename T> class AiArrayPtr { public: AiArrayPtr(T *pArray) { m_pAiPtr = pArray; m_bI ...
  • 通過前面13天的學習,對Dart基礎有了系統的熟悉,今天我們開始學習Dart類和對象,本文主要學習Dart類,包括類方法,構造器,對象類型,實例變數,隱性介面,類變數和類方法等…… ...
  • 【學習課程】:【【小白入門 通俗易懂】2021韓順平 一周學會Linux】 https://www.bilibili.com/video/BV1Sv411r7vd/?p=14&share_source=copy_web&vd_source=2c07d62293f5003c919b2df9b2e054 ...
  • 在 Linux 系統中,/proc和/sys都是特殊的文件系統,數據內容是存放在記憶體中,這兩個目錄文件中的內容由內核動態生成,查看這個文件中的內容,實際上就是查詢內核的某些狀態或信息。 可以將這兩個目錄文件理解為虛擬的目錄,即在硬碟上不存在。 /proc 文件系統 proc 是process(進程) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...