5

Azure 學習筆記 - 建立磁碟快照與還原

 1 year ago
source link: https://blog.darkthread.net/blog/switch-azure-osdiks-w-snapshot/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Azure 學習筆記 - 建立磁碟快照與還原

2022-12-10 12:57 PM 0 479

上回介紹過在 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」功能:

Fig1_638062450184119913.png

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

Fig2_638062450187675194.png

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

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

Fig3_638062450189565862.png

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

Fig4_638062450191363254.png

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

Fig5_638062450193110113.png

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

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

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

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

Fig6_638062450194904811.png

你也可以在本機安裝 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 來露一手:

Fig7_638062450197302033.png

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK