移轉至新硬體上的 Azure Stack HCI

適用於:Azure Stack HCI 版本 22H2 和 21H2;Windows Server 2022、Windows Server 2019、Windows Server 2016、Windows Server 2012 R2、Windows Server 2008 R2

本主題說明如何使用 Windows PowerShell 和 Robocopy 將 Windows Server 2012 R2、Windows Server 2016 或 Windows Server 2019 上的虛擬機器 (VM) 檔案移轉至新的 Azure Stack HCI 伺服器硬體。 Robocopy 是將檔案從一部伺服器複製到另一部伺服器的健全方法。 即便中斷連線,也可從其最後一個已知狀態繼續運作。 Robocopy 也支援透過伺服器訊息區 (SMB) 進行多執行緒檔案複製。 如需詳細資訊,請參閱 Robocopy

注意

不支援從 Windows Server 到 Azure Stack HCI 的 Hyper-V 即時移轉和 Hyper-V 複寫。 不過,Hyper-V 複本在 HCI 系統之間有效且受到支援。 您無法將 VM 復寫至相同叢集中的另一個磁碟區,而只能復寫到另一個 HCI 系統。

如果您有想要移轉 Windows 2012 R2 或更舊版本的 VM,請參閱移轉較舊的 VM

若要使用相同的硬體移轉至 Azure Stack HCI,請參閱在相同硬體上移轉至 Azure Stack HCI

下圖顯示 Windows 伺服器來源叢集和 Azure Stack HCI 目的地叢集作為範例。 您也可以在獨立伺服器上移轉 VM。

將叢集遷移至 Azure Stack HCI

根據預期的停機時間,使用叢集之間具有雙 40 GB RDMA 東-西網路的單一 NIC,以及針對 32 多執行緒設定的 Robocopy,您可以實現每小時 1.9 TB 的傳送速率。

注意

本文未涵蓋移轉延展式叢集的 VM。

開始之前

開始移轉之前,需要考慮幾項需求和事項:

  • 所有 Windows PowerShell 命令都必須以管理員身分執行。

  • 您必須具有來源和目的地叢集之管理員權限的網域認證,而且具有同時包括這兩個叢集的來源和目的地組織單位的完整權限。

  • 這兩個叢集都必須位於相同的 Active Directory 樹系和網域中,以促進叢集之間的 Kerberos 驗證進行 VM 的移轉。

  • 這兩個叢集都必須位於 Active Directory OU,且此 OU 具有群組原則物件 (GPO) 封鎖繼承設定。 這可確保網域層級的 GPO 和安全性原則不會影響移轉。

  • 這兩個叢集都必須連接到相同的時間來源,才能在叢集之間支援一致的 Kerberos 驗證。

  • 請記下來源叢集上 VM 所使用的 Hyper-V 虛擬交換器名稱。 匯入 VM 之前,您必須在 Azure Stack HCI 目的地叢集「虛擬機器網路」上使用相同的虛擬交換器名稱。

  • 移除任何來源 VM 的 ISO 映像檔案。 在 [硬體] 區段的 [VM 屬性] 中使用 Hyper-V 管理員即可完成此操作。 針對任何虛擬 CD/DVD 光碟機選取 [移除]。

  • 關閉來源叢集上的所有 VM。 這是確保在整個移轉過程中維護版本控制和狀態的必要條件。

  • 視需要檢查 Azure Stack HCI 是否支援您的 VM 版本,以匯入和更新您的 VM。 請參閱 VM 版本支援和更新 一節,以了解如何進行。

  • 備份來源叢集上的所有 VM。 完成所有應用程式和資料的損毀一致備份,以及所有資料庫的應用程式一致備份。 若要備份至 Azure,請參閱使用 Azure 備份

  • 如果您必須復原至先前的狀態,請建立來源叢集 VM 和網域控制站的檢查點。 這不適用於實體伺服器。

  • 請確定來源和目的地叢集存放裝置之間的最大型框架大小都相同,特別是 RDMA 網路介面卡與其各自的交換器網路埠,以提供最有效率的端對端傳送封包大小。

  • 請記下來源叢集上的 Hyper-V 虛擬交換器名稱。 您將在目的地叢集上重複使用它。

  • Azure Stack HCI 硬體應該至少具有與來源硬體相等的容量和設定。

  • 將來源和目的地叢集之間的網路躍點數目或實體距離降至最低,以協助最快的檔案傳輸。

支援和更新 VM 版本

下表列出 Windows Server 作業系統版本和其 VM 版本。

無論 VM 執行的作業系統版本為何,直接移轉至 Azure Stack HCI 所支援的最低 VM 版本是 5.0 版。 這代表 Windows Server 2012 R2 上 VM 的預設版本。 因此,在 2.0、3.0 或 4.0 版本上執行的任何 VM 都必須在移轉前更新為 5.0 版。

OS 版本 VM 版本
Windows Server 2008 SP1 2.0
Windows Server 2008 R2 3.0
Windows Server 2012 4.0
Windows Server 2012 R2 5.0
Windows Server 2016 8.0
Windows Server 2019 9.0
Azure Stack HCI 9.0

針對 Windows Server 2012 R2、Windows Server 2016 和 Windows Server 2019 上的 VM,請先將所有 VM 更新為來源硬體上支援的最新 VM 版本,然後再執行 Robocopy 移轉指令碼。 這可確保 VM 匯入成功時,所有 VM 的版本至少為 5.0 版。

針對 Windows Server 2008 SP1、Windows Server 2008 R2-SP1 和 Windows 2012 的 VM,VM 版本將小於 5.0 版。 這些 VM 也會使用 .xml 檔進行設定,而非 .vcmx 檔案。 因此,不支援直接將 VM 匯入 Azure Stack HCI。 在這些情況下,您有兩個選項,如移轉舊版 VM 中的詳細說明。

更新 VM 版本

下列命令適用於 Windows Server 2012 R2 和更新版本。 使用下列命令來顯示單一伺服器上的所有 VM 版本:

Get-VM * | Format-Table Name,Version

顯示叢集中所有伺服器上的所有 VM 版本:

Get-VM –ComputerName (Get-ClusterNode)

若要將所有 VM 更新為所有伺服器上的最新支援版本:

Get-VM –ComputerName (Get-ClusterNode) | Update-VMVersion -Force

RDMA 建議

如果您使用遠端直接記憶體存取 (RDMA) ,Robocopy 可以利用它在叢集之間複製您的 VM。 以下是使用 RDMA 的一些建議:

  • 將兩個叢集連線至相同的存取交換器 (ToR 交換器),以使用來源與目的地叢集之間最快的網路路徑。 針對儲存體網路路徑,通常支援 10GbE/25GbE 或更高的速度,並有效率的調控 RDMA。

  • 如果來源和目的地叢集 (ROCE 對 iWARP) 之間的 RDMA 介面卡或標準不同,Robocopy 會透過最快的可用網路來利用 SMB,而非使用 TCP/IP。 這通常是東-西網路的雙 10Gbe/25Gbe 或更快的速度,提供在叢集之間複製 VM VHDX 檔案的最佳方式。

  • 為確保 Robocopy 可以在叢集之間 (東-西網路) 利用 RDMA,請設定 RDMA 儲存網路,以便能在來源與目的地叢集之間路由。

建立新叢集

在您可以建立 Azure Stack HCI 叢集之前,必須先在將出現在叢集中的每個新伺服器上安裝 Azure Stack HCI OS。 如需如何進行此作業的詳細資訊,請參閱部署 Azure Stack HCI 作業系統

使用 Windows Admin Center 或 Windows PowerShell 建立新的叢集。 如需如何進行此作業的詳細資訊,請參閱使用 Windows Admin Center 建立 Azure Stack HCI 叢集,並使用 Windows PowerShell 建立 Azure Stack HCI 叢集

重要

介於叢集之間的 Hyper-V 虛擬交換器 (VMSwitch) 名稱必須相同。 請確定在目的地叢集上建立的虛擬交換器名稱,與所有伺服器上的來源叢集上所使用的虛擬交換器名稱相符。 匯入 VM 之前,請先確認交換器的名稱是否相同。

注意

您必須向 Azure 註冊 Azure Stack HCI 叢集,才能在上面建立新的 VM。 如需詳細資訊,請參閱向 Azure 註冊

執行移轉指令碼

下列 PowerShell 指令碼 Robocopy_Remote_Server_.ps1 會使用 Robocopy 將 VM 檔案及其相依目錄和中繼資料從來源複製到目的地叢集。 此指令碼已從 TechNet 的原始指令碼中修改:使用 PowerShell 和 RoboCopy 將檔案 robocopy 到遠端伺服器

指令碼會將所有 VM VHD、VHDX 和 VMCX 檔案複製到指定叢集共用磁碟區 (CSV) 的目的地叢集。 一次移轉一個 CSV。

移轉指令碼會在每部本地來源伺服器中執行,以利用 RDMA 和快速網路傳輸的優點。 若要這樣做:

  1. 請確定每個目的地叢集節點都設為目的地 CSV 的 CSV 擁有者。

  2. 若要判斷所有要複製的 VM VHD 和 VHDX 檔案位置,請使用下列 Cmdlet。 檢閱 C:\vmpaths.txt 檔案,以判斷要從步驟 4 開始執行 Robocopy 的最上層來源檔案路徑:

    Get-ChildItem -Path "C:\Clusterstorage\Volume01\*.vhd*" -Recurse > c:\vmpaths.txt
    

    注意

    如果您的 VHD 和 VHDX 檔案位於相同磁碟區的不同路徑中,則您必須針對每個不同的路徑執行移轉指令碼,才能將它們全部複製。

  3. 變更下列三個變數,以符合來源叢集 VM 路徑與目的地叢集 VM 路徑:

    • $Dest_Server = "Node01"
    • $source = "C:\Clusterstorage\Volume01"
    • $dest = "\\$Dest_Server\C$\Clusterstorage\Volume01"
  4. 在每部 Windows 伺服器來源伺服器上執行下列指令碼:

<#
#===========================================================================  
# Script: Robocopy_Remote_Server_.ps1
#===========================================================================  
.DESCRIPTION:
Change the following variables to match your source cluster VM path with the destination cluster VM path. Then run this script on each source Cluster Node CSV owner and make sure the destination cluster node is set to the CSV owner for the destination CSV.

        Change $Dest_Server = "Node01"
        Change $source  = "C:\Clusterstorage\Volume01"
        Change $dest = "\\$Dest_Server\C$\Clusterstorage\Volume01"
#>

$Space       = Write-host ""
$Dest_Server = "Node01"
$source      = "C:\Clusterstorage\Volume01"
$dest        = "\\$Dest_Server\C$\Clusterstorage\Volume01"
$Logfile     = "c:\temp\Robocopy1-$date.txt"
$date        = Get-Date -UFormat "%Y%m%d"
$cmdArgs     = @("$source","$dest",$what,$options)  
$what        = @("/COPYALL")
$options     = @("/E","/MT:32","/R:0","/W:1","/NFL","/NDL","/LOG:$logfile","/xf")
 
## Get Start Time
$startDTM = (Get-Date)
 
$Dest_Server     = "Node01"
$TARGETDIR   = \\$Dest_Server\C$\Clusterstorage\Volume01
$Space
Clear
## Provide Information
Write-host ".....Copying Virtual Machines FROM $Source to $TARGETDIR ....................." -fore Green -back black
Write-Host "........................................." -Fore Green

## Kick off the copy with options defined  
robocopy @cmdArgs
 
## Get End Time
$endDTM = (Get-Date)
 
## Echo Time elapsed
$Time = "Elapsed Time: = $(($endDTM-$startDTM).totalminutes) minutes"  
## Provide time it took
Write-host ""
Write-host " Copy Virtual Machines to $Dest_Server has been completed......" -fore Green -back black
Write-host " Copy Virtual Machines to $Dest_Server took $Time        ......" -fore Cyan

匯入 VM

最佳做法是為每個叢集節點建立至少一個叢集共用磁碟區 (CSV),針對每個 CSV 擁有者啟用 VM 的平衡,以提高復原能力、效能和 VM 工作負載的規模。 根據預設,此平衡會每隔五分鐘自動發生,而且必須在使用來源叢集節點與目的地叢集節點之間的 Robocopy 時納入考量,以確保來源和目的地 CSV 擁有者相符,提供最理想的傳輸路徑和速度。

在 Azure Stack HCI 叢集上執行下列步驟以匯入 VM,使其具有高可用性,並加以啟動:

  1. 執行下列 Cmdlet 以顯示所有 CSV 擁有者節點:

    Get-ClusterSharedVolume
    
  2. 針對每個伺服器節點,前往 C:\Clusterstorage\Volume 並設定所有 VM 的路徑,例如 C:\Clusterstorage\volume01

  3. 在每個 CSV 擁有者節點上執行下列 Cmdlet,以在 VM 匯入之前顯示每個磁碟區的所有 VM VMCX 檔案路徑。 修改路徑以符合您的環境:

    Get-ChildItem -Path "C:\Clusterstorage\Volume01\*.vmcx" -Recurse
    

    注意

    Windows Server 2012 R2 和較舊的 VM 會使用 XML 檔案,而不是 VCMX 檔案。 如需詳細資訊,請參閱移轉較舊的 VM 一節。

  4. 針對每個伺服器節點執行下列 Cmdlet,以匯入、註冊,並讓 VM 在每個 CSV 擁有者節點上具有高可用性。 這可確保 VM 的平均分配,以達到最佳處理器和記憶體配置:

    Get-ChildItem -Path "C:\Clusterstorage\Volume01\*.vmcx" -Recurse | Import-VM -Register | Get-VM | Add-ClusterVirtualMachineRole
    
  5. 在每個節點上啟動每個目的地 VM:

    Start-VM -Name
    
  6. 登入並確認所有 VM 都在執行,而且您的所有應用程式和資料都存在:

    Get-VM -ComputerName Server01 | Where-Object {$_.State -eq 'Running'}
    
  7. 將您的 VM 更新為 Azure Stack HCI 的最新版本,以充分利用所有的改善:

    Get-VM | Update-VMVersion -Force
    
  8. 指令碼完成後,請檢查 Robocopy 記錄檔中是否有任何列出的錯誤,並確認已成功複製所有 VM。

移轉較舊的 VM

如果您有 Windows server 2008 SP1、Windows Server 2008 R2-SP1、Windows Server 2012 或 Windows Server 2012 R2 的 VM,則本節適合您。 您有兩個選項可以處理這些 VM:

  • 先將這些 VM 移轉至 Windows Server 2012 R2、Windows Server 2016 或 Windows Server 2019,接著更新 VM 版本,然後開始進行移轉程序。

  • 使用 Robocopy 將所有 VM VHD 複製到 Azure Stack HCI。 然後建立新的 VM,並將複製的 VHD 連結至 Azure Stack HCI 中的 VM。 這會略過這些較舊 VM 的 VM 版本限制。

Windows Server 2012 R2 和較舊的 Hyper-V 主機會使用 XML 檔案格式進行其 VM 設定,這與用於 Windows Server 2016 和更新版本的 Hyper-V 主機的 VCMX 檔案格式不同。 這需要不同的 Robocopy 命令將這些 VM 複製到 Azure Stack HCI。

選項 1:暫存移轉

這兩階段的移轉用於裝載在 Windows Server 2008 SP1、Windows Server 2008 R2-SP 和 Windows Server 2012 上的 VM。 以下是您所使用的程序:

  1. 探索要複製的所有 VM VHD 和 VHDX 檔案的位置,然後檢閱 vmpaths.txt 檔案以判斷 Robocopy 開始的最上層來源檔案路徑。 使用下列 Cmdlet:

    Get-ChildItem -Path "C:\Clusterstorage\Volume01\*.vhd*" -Recurse > c:\vmpaths.txt
    
  2. 使用下列範例 Robocopy 命令,先使用步驟 1 中所決定的最上層路徑,將 VM 複製到 Windows Server 2012 R2:

    Robocopy \\2012R2-Clus01\c$\clusterstorage\volume01\Hyper-V\ \\20H2-Clus01\c$\clusterstorage\volume01\Hyper-V\ /E /MT:32 /R:0 /w:1 /NFL /NDL /copyall /log:c:\log.txt /xf

  3. 確認 Windows Server 2012 R2 叢集上使用的虛擬交換器 (VMSwitch) 名稱,與 Windows 2008 R2 或 Windows Server 2008 R2-SP1 來源上使用的交換器名稱相同。 若要顯示在叢集中所有伺服器上使用的交換器名稱,請使用:

    Get-VMSwitch -CimSession $Servers | Select-Object Name
    

    視需要重新命名 Windows Server 20212 R2 上的交換器名稱。 若要在叢集中的所有伺服器上重新命名交換器名稱,請使用:

    Invoke-Command -ComputerName $Servers -ScriptBlock {rename-VMSwitch -Name $using:vSwitcholdName -NewName $using:vSwitchnewname}
    
  4. 將 VM 複製並匯入至 Windows Server 2012 R2:

    Get-ChildItem -Path "c:\clusterstorage\volume01\Hyper-V\*.xml"-Recurse
    
    Get-ChildItem -Path "c:\clusterstorage\volume01\image\*.xml" -Recurse    | Import-VM -Register | Get-VM | Add-ClusterVirtualMachineRole  
    
  5. 在 Windows Server 2012 R2 上,將所有 VM 的 VM 版本更新為5.0 版:

    Get-VM | Update-VMVersion -Force
    
  6. 執行移轉指令碼,將 VM 複製到 Azure Stack HCI。

  7. 遵循匯入 VM 中的程序,使用下列程序來取代步驟 3 和步驟 4 以處理 XML 檔案,並將 VM 匯入至 Azure Stack HCI:

    Get-ChildItem -Path "c:\clusterstorage\volume01\Hyper-V\*.xml"-Recurse
    
    Get-ChildItem -Path "c:\clusterstorage\volume01\image\*.xml" -Recurse    | Import-VM -Register | Get-VM | Add-ClusterVirtualMachineRole  
    
  8. 完成 匯入 VM的其餘步驟。

選項 2:直接 VHD 複製

此方法會使用 Robocopy 將裝載在 Windows 2008 SP1、Windows 2008 R2-SP1 和 Windows 2012 的 VM VHD 複製到 Azure Stack HCI。 這會略過這些較舊 VM 支援的最低 VM 版本限制。 針對裝載在 Windows Server 2008 SP1 和 Windows Server 2008 R2-SP1 的 VM,我們建議採用此選項。

裝載在 Windows 2008 SP1 和 Windows 2008 R2-SP1 的 VM 僅支援第 1 代 VHD 的第 1 代 VM。 因此,必須在 Azure Stack HCI 上建立對應的第 1 代 VM,才能將複製的 VHD 連結至新的 VM。 請注意,這些 VHD 無法升級為第 2 代 VHD。

注意

Windows Server 2012 支援第 1 代和第 2 代 VM。

以下是您所使用的程序:

  1. 使用範例 Robocopy 將 VM VHD 直接複製到 Azure Stack HCI:

    Robocopy \\2012R2-Clus01\c$\clusterstorage\volume01\Hyper-V\ \\20H2-Clus01\c$\clusterstorage\volume01\Hyper-V\ /E /MT:32 /R:0 /w:1 /NFL /NDL /copyall /log:c:\log.txt /xf

  2. 建立新的第1代 VM。 如需如何進行此作業的詳細資訊,請參閱管理 VM

  3. 將複製的 VHD 檔案連結至新的 VM。 如需詳細資訊,請參閱管理虛擬硬碟 (VHD)

供您參考,以下 Windows 伺服器客體作業系統支援第 2 代 VM:

  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2
  • Windows Server 2012
  • Windows 10
  • 64 位元版本的 Windows 8.1 (64 位元)
  • 64 位元版本的 Windows 8 (64 位元)
  • Linux (請參閱支援的 Linux 和 FreeBSD VM)

後續步驟