修復Proxmox VE:用指令強制刪除虛擬機器 / Fix Proxmox VE: Remove OpenVZ Container by a Command
本篇是介紹如何處理在Proxmox VE中無法在網頁管理介面(web-based management)中刪除OpenVZ的問題。這個錯誤是因為OpenVZ虛擬機器的本體檔案在刪除、備份、還原的途中被強制中斷,導致OpenVZ檔案遺失、但是設定檔(*.conf)卻還在節點(node)之中,所以在網頁管理介面中仍然會出現那個虛擬機器,但是無法藉由網頁管理介面刪除。這時候只要用指令列中移除在 /etc/pve/openvz/ 的設定檔,刪不掉的虛擬機器就會消失了。
問題狀況 / Problem Description
一般來說,在Proxmox VE的網頁管理介面中,如果要刪除虛擬機器的話,正常做法是:
- 停止虛擬機器
- 按下右上角的「Remove」
- 在Confirm確認視窗中按下「Yes」
上圖的例子中,我要刪除的是VMID編號100的OpenVZ虛擬機器。按下「Yes」之後卻沒有任何反應,下面的Tasks出現了TASK ERROR。
雙擊Tasks訊息顯示詳細訊息,就出現了上圖的錯誤資訊:
stat(/var/lib/vz/root/100): No such file or directory
Container is currently mounted (umount first)
TASK ERROR: command 'vzctl destroy 100' failed: exit code 41
訊息裡面提到了一個路徑「/var/lib/vz/root/100」,看起來像是這個路徑尚未解除掛載(umount)。但是在伺服器上找看看這個路徑,雖然有「/var/lib/vz/root/」,但裡面已經沒有「100」這個資料夾了。
這是什麼問題呢?
問題原因 / Causes of Problem
造成這個問題的原因是因為虛擬機器資料刪除不完全。一個OpenVZ虛擬機器的組成有兩個部分:
- 虛擬機器的實體檔案:擺放在/var/lib/vz/root/資料夾底下。刪除、備份或遷移(migrate)等各種動作會優先處理這裡的檔案。
- 虛擬機器的設定檔:擺放在/etc/pve/openvz/底下,以副檔名.conf表示。網頁管理介面會優先讀取這個檔案的內容來顯示虛擬機器的狀態。之前我們在「OpenVZ掛載NFS的虛擬機器設定」中使用「vzctl set」指令來設定OpenVZ虛擬機器的做法,也是修改設定檔的內容。
實體檔案跟設定檔兩者為一體才是一個完整的OpenVZ虛擬機器,缺一不可。在正常的情況下,Proxmox VE會先處理實體檔案,然後再來修改設定檔的內容。然而很多時候我們在刪除、備份或遷移虛擬機器的實體檔案時,因為檔案本身太大,導致處理到一半就因為異常中斷、沒有順利處理完成。這時候實體檔案可能已經被刪除,但是後面卻沒有處理到設定檔。結果設定檔就存在Proxmox VE中,但是卻因為沒有實體檔案,而無法從網頁管理介面刪除的情況。
解決方法 / Solution
要解決這個問題,做法就是手動刪除Proxmox VE沒有刪除掉的虛擬機器設定檔。
首先,我們要確認刪不掉的虛擬機器是在哪一個節點(node,Proxmox VE實體伺服器)上。
然後到該節點中,點選右上角的「Shell」,開啟該節點的主控臺。
確認你要刪除的OpenVZ虛擬機器的VMID。舉例來說是「100」,那麼就確認看看虛擬機器設定檔在不在「/etc/pve/openvz/100.conf」這個位置,然後用「rm」指令刪除它。指令如下:
rm /etc/pve/openvz/100.conf
在網頁管理介面上,VMID編號 100的OpenVZ虛擬機器就已經消失囉。
結語 / In closing
其實Proxmox VE這種刪不掉虛擬機器的情況還真的蠻常遇到的。刪除虛擬機器刪到一半中斷,以後就刪不掉;遷移遷到一半中斷,以後就刪不掉;還原(restore)還到一半中斷,以後就刪不掉(還原的時候會先建立虛擬機器的設定檔,然後再來慢慢解壓縮虛擬機器的實體檔案)。所以遇到這種虛擬機器刪不掉的情況,請不要驚慌,這很常見。
但問題是「/etc/pve/openvz/」這個存放虛擬機器設定檔的路徑很難找。這個路徑並非直接存放在Proxmox VE實體伺服器節點上,而是掛載在Proxmox VE叢集共享的檔案系統上。因此我們沒辦法直接使用locate指令找到虛擬機器設定檔。雖然我之前做過很多次手動刪除設定檔的操作,但每次都忘記到底上次是怎麼做的。這次終於能好好把它記錄下來,以後就供大家參考吧。