上回介紹過在 Azure 開 B1s 小 VM 裝 Debian Linux / Docker 跑網站,繼續做一些自動化安裝實驗。

由於還在摸索階段,把 VM 搞砸重來的機率很高,我想到 Hyper-V VM 磁碟可以建立所謂還原點(Checkpoint),必要時將 VM 還原回先前的狀態,Azure VM 也可以這麼做嗎?

研究了一下,Azure 有備份服務,可以備份整台 VM、整顆磁碟、指定資料夾或檔案、SQL、SAP、PostgreSQL、Blob... 等。

不過備份功能偏向每日定時備份、保留幾天這樣的長期維運概念,雖然也能手動備份還原指定磁碟,但需要建備份保存庫指派還原角色... 等等,程序較繁瑣。我想要像 Hyper-V 一樣簡單粗暴,手動記下某個時點的磁碟狀態,弄壞時回到該時點的狀態,評估後,為磁碟建立快照集(Snapshot)更接近我的需求。

在 Azure Portal 檢視 VM OS 碟,UI 有個「Create snapshot」功能:

輸入 Snapshot 名稱,選擇 Full 完整備份或以先前完整備分為基準針對差異部分做 Incremental 增量備份(資料量較少可省點費用),Storage Type 部分要留意,預設選項是 Zone-redundant,建議選 Standard HDD 就好,成本較低:

做好備份就可以惡搞 VM 了。不小心玩壞時,用以下方式還原。

開啟 Snapshot,使用 Create disk 功能用它建立一顆新磁碟:

檢視 VM 磁碟清單,有個 Swap OS disk 功能:

選擇新建好的磁碟,並輸入 VM 名稱作為確認,便可進行抽換。抽換時 VM 會被強制關機,換好要手動啟動。

這樣就能將 OS 磁碟機還原到先前做快照的狀態了。換下來的 OS 碟可以保留稍後再換回來對照,若不需要了記得刪除以免佔用空間產生無謂費用。

看完抽換 OS 碟操作步驟後,老讀者們應該已猜到到接下來要發生什麼事。

是的,這段 UI 操作的複雜度不意外地超過現代王藍田的忍耐極限,逼得我開始學習 Azure PowerShell 指令,試著寫腳本將一連串動作自動化,如此,測試時把 VM 玩壞時,只要貼指令按 Enter 再稍等幾分鐘,VM 便會坐時光機回到最初的樣子,這樣才能玩得盡興。

Azure Portal 標頭列有個命令列圖示,按下後瀏覽器視窗下半段會出現一個線上版命令列視窗(Cloud Shell)(如下圖),Shell 有兩種選擇:Bash 或 PowerShell,推薦使用 Azure PowerShell,操作體驗較好。

你也可以在本機安裝 Azure PowerShell 在 Windows Terminal 執行,但實驗階段用 Cloud Shell 能做到下方敲指令,上方用 Azure Portal UI 檢查執行結果,二者完美搭配。

花了點工夫,拼湊出以下腳本,貼到 Colud Shell 執行,不費吹灰之力便能把 VM OS 還原回 Snapshot 的版本。這是個開端,未來有其他要重複執行的動作,也都可以改用指令更有效率完成。

$resGrpName = 'DockerSetupLab'
$snapName = 'DebianOSDiskSnapshot'
$vmName = 'DockerBase'
$storageType = 'Premium_LRS'
$diskSize = '32'
$location = 'eastus'
$diskName = "DebianDisk-$([Guid]::NewGuid().ToString().Substring(0, 8))"
# 使用 Snapshot 建立磁碟機
$snap = Get-AzSnapshot -ResourceGroupName $resGrpName -SnapshotName $snapName
$diskConfig = New-AzDiskConfig -SkuName $storageType -Location $location -CreateOption Copy -SourceResourceId $snap.Id -DiskSizeGB $diskSize -HyperVGeneration V2
$newOSDisk = New-AzDisk -Disk $diskConfig -ResourceGroupName $resGrpName -DiskName $diskName
# 抽換 VM OS 碟
Stop-AzVM -ResourceGroupName $resGrpName -Name $vmName 
$vm = Get-AzVM -ResourceGroupName $resGrpName -Name $vmName 
$origOSDiskName = $vm.StorageProfile.OsDisk.Name # 記下原 OS 碟名稱以備刪除
Set-AzVMOSDisk -VM $vm -ManagedDiskId $newOSDisk.Id -Name $newOSDisk.Name
Update-AzVM -ResourceGroupName $resGrpName -VM $vm
Start-AzVM -ResourceGroupName $resGrpName -Name $vmName
# 刪除原 OS 碟 (如果不需要保留的話)
Remove-AzDisk -ResourceGroupName $resGrpName -DiskName $origOSDiskName

【參考資料】

最後,我讓最會尬聊的 ChatGPT 來露一手:

前面感覺還中規中矩,但有些動作是多餘的,到第 5 點明顯把設定 OS 跟設定 OS Disk 混在一起了,如果有考慮前後文,這裡應要偵測出矛盾。畢竟 ChatGPT 只是個大型語言模型,策略是分析提問從超大知識庫找出相關題材組成精美拼盤,使出渾身解數跟你尬聊,它沒能力識別正確性,也無法提供最佳化解答,把事情做好做對還是人的責任。但由於它的知識超級淵博,回答常能帶來很多新知與啟發,危險之處也在於看似專業的回答常正確與錯誤混雜,「識讀」能力變得格外重要,應把它想成自然語言版的 Google,從答案擷取新知再進一步研究得到自己的版本,應是善用它的正確姿勢。

Tutorial of how to make snapshot and restore the VM OS disk.


Comments

Be the first to post a comment

Post a comment