2017年6月10日 星期六

[經驗分享]ProxmoxVE虛擬機磁碟容量0MB異常事件





奇怪問題


公司伺服器已經 100% 虛擬化多年,採用的是 Proxmox VE (PVE) 這套開源的虛擬化伺服器系統。

長期以來使用良好,這次事件是起因於我幫 VM 中 Windows Server 伺服器新掛上一顆虛擬磁碟後開始。




問題症狀


正常來說,在 VM 上幫機器新增磁碟,使用 [Add Hard Disk],VM 就可以使用這顆硬碟。

剛開始用著用著並沒有感到異常,磁碟都可以正常讀取與寫入。

直到有一天我要幫這個磁碟開啟「陰影複製 / 以前的版本」功能,才發現系統不給我設定,顯示「容量不足」!



檔案總管容量正確



奇怪的是,我使用檔案總管查看,該磁碟的可用空間都是正確顯示的。



接下來進一步使用磁碟管理員看看有什麼可疑之處。




磁碟管理容量異常



噢!磁碟管理員所顯示的「容量」與「可用空間」竟然都是 0MB,這事絕對蹊蹺。


雖然平時讀寫正常,可是無法開啟「陰影複製 / 以前的版本」,對資料版本造成影響,所以我陸續試了一些方法,磁碟檢查、修復、用其它工具軟體、掛載到其它主機開啟...,都無法改變 0MB 的情況。




尋找原因


在 VM 裡解決不了,接著就來往上頭追,我們看一下 Proxmox VE 所顯示的磁碟狀況。



Proxmox VE 容量正常



在這裡看來,這顆磁碟也沒有異常且容量正確,甚至對他做 Resize Disk 增加容量也沒有問題,它原本是 520G 我增加到 530G,裡面 VM 也能正確擴展與使用。


好吧,再往上頭爬一點,來到 Console 介面看看磁碟狀況如何。




Console 容量異常


SSH 連入 Storage 主機查看容量,一看不得了,檔案容量相去甚大,本來該是 530G 的磁碟檔,怎麼只有 422G?


看到這裡,心有譜了。




連接架構


在確診之前,必需先講述一下我的 Proxmox VE 與 Storage 運作模式。



系統連接模式圖




Proxmox VE 上運作 Guest OS 所使用的 VM Image,都是存放在以 FreeNAS 建置的 Storage 之中。



磁碟掛載層次圖


這兩者間

  • 以 NFS 做為檔案傳輸協定
  • VM 映像檔是 File Level
  • 檔案格式採用 QCOW2。



 也就是說,每一個 VM 的磁碟都是一個 .qcow2 檔案。 




直指核心


上面提到,VM 裡與 Proxmox VE 介面上的磁碟容量都正確,但是進 Storage 實際看該檔案的容量卻有短少,我就知道原因所在。


在該磁碟建立的當時,Proxmox VE 介面曾經出現問題,但我卻沒有特別在意。



建立磁碟出現錯誤



出現錯誤訊息後,按下 OK,介面上沒有出現這顆磁碟,不過進到 Storage 去看這個新的磁碟檔案確實是有產生。




為了讓這顆磁碟可以使用,我就手動修改了該 VM 的設定檔,強制掛進來使用。



修改 VM 設定強制掛載



改完設定檔後,確實 VM 裡的 Windows Server 可以開始使用這顆磁碟,讀寫正確,但是磁碟管理員卻是容量異常。




真相大白


正是修改設定造成的悲劇。

更精確的說,是我「設定檔改得太快」才成悲劇



為什麼?


當 Proxmox VE 出現「Connection error - Timeout.」錯誤訊息後,該磁碟檔案實際上仍然在背景將容量開到正確,只是因為超出 Web 介面的容許值所以出錯。

此時,背景的 Job 仍然在持續擴充該磁碟檔案的容量,而我在他還沒有擴充到目標正確容量時,強制修改 VM 設定檔把他掛載進來用,反而中斷容量擴充的完整工作,導致磁碟檔案潛藏問題。





解決方案


要修正這問題有好幾種方法,例如:用 QEMU 工具修復 qcow2 檔,或是另建一顆良好的磁碟掛載進來,再將檔案複製過去。


我選擇的是後者,檔案複製到新的良好磁碟,並利用 robocopy 完整的把 NTFS 安全性與檔案日期一併帶過去。


Robocopy 指令如下:

robocopy F:\Folder\ G:\Folder\ /E /COPYALL /DCOPY:T /W:5 /R:5 /XO


  • 參數 /E
    複製子目錄(含空的)
      
  • 參數 /COPYALL
    複製所有檔案資訊(主要是 NTFS 安全性)
      
  • 參數 /DCOPY:T
    複製目錄時間戳記(保存原有的檔案更新日期)
      
  • 參數 /R:5
    失敗複本的重試次數(預設是 1 百萬次)
      
  • 參數 /W:5
    重試之間等候時間(預設是 30 秒)
      
  • 參數 /XO
    排除較舊的檔案(若來源檔沒有比較新就不複製)