這個問題一般出現的原因是因爲非正常操作刪除了VM的快照或者base copy。
如果需要了解snapshot的原理您可以參考Citrix KB XenServer: Understanding Snapshots :http://support.citrix.com/article/CTX122978
XenServer中我們可以通過以下的三個操作徹底查出存儲空間是使用在什麼地方,在VM刪除後空間有沒有釋放。
- Xe vm-list name-label=<vm-name>
此命令來檢測這個VM的信息是否已經被XenServer刪除,- Xe vm-disk-list name-label=<vm-name>
此命令來查看VM對應的VDI的信息,在VM刪除後,我們需要確定這個VDI有沒有正常刪除。- Lvscan | grep <vdi-uuid>
此命令來查看在linux底層這個VDI的LVM卷有沒有正常被刪除。
一般情況下出現空間沒辦法釋放的問題都是在第1步和2步的都看似正常情況,第3步裏面這個LVM卷還是沒有被刪除。問題是處在第2步,當我們執行完命令之後,通過Xe vdi-list uuid=<vdi-uuid>確實看不到這個VDI了,並且在xe sr-uuid uuid=<sr-uuid> params=all 的VDIs裏面也找不到已經刪除的VDI,但是當我們搜索/var/log/SMlog時,我們能看到以下的錯誤提示:
<3511> 2012-08-27 06:21:46.110090 *~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*
<3511> 2012-08-27 06:21:46.110165 ***********************
<3511> 2012-08-27 06:21:46.110234 * E X C E P T I O N *
<3511> 2012-08-27 06:21:46.110302 ***********************
<3511> 2012-08-27 06:21:46.110390 gc: EXCEPTION util.SMException, Parent VDI a8367eaa-138c-488d-b349-51b321a5db4e of 1670bd58-c999-49ee-8d07-67947d1baef3 not found
<3511> 2012-08-27 06:21:46.110458 File "/opt/xensource/sm/cleanup.py", line 2509, in gc
_gc(None, srUuid, dryRun)
File "/opt/xensource/sm/cleanup.py", line 2412, in _gc
_gcLoop(sr, dryRun)
File "/opt/xensource/sm/cleanup.py", line 2366, in _gcLoop
sr.scanLocked()
File "/opt/xensource/sm/cleanup.py", line 1283, in scanLocked
self.scan(force)
File "/opt/xensource/sm/cleanup.py", line 2086, in scan
self._buildTree(force)
File "/opt/xensource/sm/cleanup.py", line 1800, in _buildTree
raise util.SMException("Parent VDI %s of %s not " \
<3511> 2012-08-27 06:21:46.110528 *~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*
<3511> 2012-08-27 06:21:46.110603 * * * * * SR d0578696-b96f-54d0-208f-20f07afbeed4: ERROR
以上的信息顯示的是當SR在執行掃描的時候出現了exception,因爲1670bd58-c999-49ee-8d07-67947d1baef3是通過a8367eaa-138c-488d-b349-51b321a5db4e產生的,而UUID爲a8367eaa-138c-488d-b349-51b321a5db4e的VDI已經被刪除了。所以如果要嘗試處理這樣的exception,就需要把所有有關聯的VDI全部刪除掉。你可以通過以下命令查出和a8367eaa-138c-488d-b349-51b321a5db4e有關聯的VDI:
vhd-util scan -f -m "VHD-*" -l VG_XenStorage-<sr-uuid> | grep <vdisk uuid>
但是請注意:
- 方法僅供測試,至於能否徹底清除SR掃描時候所產生的exception要結合用戶的實際生產環境考慮, 因爲後續要刪除的每個VDISK都有可能是非常關鍵的VM數據。
- 上面所提的uuid均爲我的測試環境,請結合自己實際環境中的uuid驗證。
如果用戶環境很難做以上的troubleshooting,那麼我們建議用戶可以考慮手工釋放存儲的空間。在找出想要刪除的VDI後,可以使用命令lvremove /dev/VG_XenStorage-<sr-uuid>/VHD-<vdi-uuid>的方法在存儲上直接刪除此VDI。
當然如果在沒有還有最後一招,實在沒有辦法就只能備份在使用的VM數據後重新安裝XenServer。