MOOSSin
選單

全部文章 · 開源工具

VirtualBox 當家用伺服器的虛擬化層:關機、快照與 clone 的取捨

VirtualBox 是桌面用的虛擬化軟體,拿來跑長時間運作的 Linux 虛擬機也可以,但有幾件事要先知道:它會拖住主機的關機流程、快照不適合當長期還原點、跟 Hyper-V 不能共存。這篇是我把它當伺服器用一個月的整理,外加一個關於分租套房的比喻。

有一陣子我很想要一台 Linux 伺服器。不是為了什麼偉大的理由,就是想有一台二十四小時開著、放我自己網站的機器。看了一輪雲端主機的價格,再看看桌上那台本來就不會關的 Windows 電腦,我心裡冒出一個很省錢的念頭:能不能在它裡面再開一台?

答案是可以,工具叫 VirtualBox。Oracle 維護,核心以 GPL-2.0 釋出,目前是 7.x 版。它的設計對象是桌面使用者,讓你在 Windows 上開一個視窗跑 Linux 試試看的那種。但在一台不關機的主機上跑一台 Ubuntu Server 虛擬機,讓它承擔正式服務,也行得通。我這樣做了一個月,以下是我會提醒自己的幾件事,還有幾個差點把自己嚇死的時刻。

分租套房理論

虛擬機就像在你的房子裡隔出一間套房租給別人。房客有自己的門、自己的浴室、自己的作息,你們互不干擾。但房子是你的,水電是你的,你搬家的時候房客會跟著被搬。大部分虛擬化的問題都可以用這個比喻想清楚:房東做了什麼會影響房客,房客做了什麼會影響房東。

主機關機時,它會拖住流程

這是我第一個踩到的雷,而且踩得很痛。主機關機時 Windows 會通知 VirtualBox,VirtualBox 會替執行中的虛擬機存檔。存檔本身沒問題,問題是它可能在存檔後仍延遲關機超過幾秒,Windows 等不到就取消整個關機或重開流程。結果是虛擬機停在已儲存狀態,主機卻沒有重開,裡面的服務就這樣離線。

用套房比喻,就是房東要出門前敲門說「我要鎖大門了」,房客回「等我一下」,然後房東等到不耐煩,決定不出門了,但房客已經把自己的東西收好躺平了。兩個人都以為對方在處理,結果整棟房子停擺。

解法是不要從開始功能表關機,寫一支腳本:先 VBoxManage controlvm <vm> savestate,輪詢等到 VirtualBox 的行程真的結束,才呼叫 shutdown。開機那一端用工作排程器在登入後執行 VBoxManage startvm <vm> --type headless。注意虛擬機是註冊在使用者設定檔裡的,用 SYSTEM 帳號跑排程會找不到它,你會得到一個「找不到這台機器」的錯誤,然後開始懷疑自己是不是把整台虛擬機弄丟了。沒有,它只是在另一個人的抽屜裡。

快照不是還原點

VirtualBox 有一個很誘人的功能叫快照。按一下,現在的狀態就存起來,出事了可以跳回去。聽起來像遊戲存檔對不對?我一開始也這樣想,然後打算每天存一次。

問題在快照的原理。快照一建立,基礎磁碟檔就變成唯讀,之後所有寫入都落到一個會一直長大的差異磁碟;刪除快照時要做合併,那是最容易出事的一步。快照適合幾個小時內就會刪掉的檢查點,像是「我要改一個設定,改壞了要能跳回來」。它不適合當每天一份的長期還原點,那會讓你養出一串越來越長、越來越難刪的差異磁碟。

長期還原點要用 VBoxManage clonevm --mode all 做完整複製,而且不要 register,避免有人誤啟動第二台一模一樣的機器。兩台一模一樣的機器同時在線,會發生的事情大概跟兩個人拿著同一把鑰匙同時開同一扇門差不多,沒有人知道誰進去了。

clone 要在關機狀態下做,時間跟磁碟大小和磁碟速度有關,10 GB 左右的 VDI 在同一顆磁碟上一邊讀一邊寫,我量到七分鐘出頭。這裡有個小提醒:看 clone 有沒有在動,看暫存目錄裡檔案的大小,不要看 CPU。它幾乎不用 CPU,工作管理員裡看起來像死了一樣,很容易被誤判成卡住然後手滑按取消。我就是那個手滑的人,取消之後才發現它已經複製了九成。

跟 Hyper-V 不能共存

Hyper-V、WSL2、Virtual Machine Platform、Docker Desktop,這幾樣在 Windows 上都會啟用 Hyper-V 的虛擬化層。VirtualBox 7 能在 Hyper-V 底下跑,但會退到一個慢很多的相容模式,而且要重開機才生效。

這件事很陰險,因為 Windows 會在你不注意的時候幫你開這些功能。裝個 Docker Desktop,勾一個「使用 WSL2」,重開機之後你的虛擬機突然慢到像在泥巴裡走路,你會花一整晚找原因。如果虛擬機裡跑著重要的東西,這幾個功能一個都不要開;需要 Docker 就進虛擬機裡用。房子裡只能有一個房東。

檔案系統壞了怎麼辦

虛擬機不正常關機幾次之後,ext4 有可能損壞。開機時的自動 fsck 修不了會停在 initramfs 的 BusyBox shell,畫面上一堆你看不懂的訊息,最後一行是一個很冷淡的提示符號。這時你沒有 SSH,只能對主控台輸入,VBoxManage controlvm <vm> keyboardputstring 可以把指令一個字一個字送進去,例如 fsck.ext4 -y /dev/sda2。

修完之後有一個很容易卡住的地方:initramfs 裡的 reboot 什麼都不會做。你打了 reboot,按 Enter,畫面沒動,你再打一次,還是沒動,你開始以為機器真的壞了。要用 exit 讓開機流程繼續。這件事花了我很久才查到,那段時間的心情大概是「我是不是應該去買一台真的伺服器」。

磁碟的一條規矩

虛擬機的磁碟檔在主機的哪個分割區上,那個分割區在虛擬機執行時就不能強制卸載,chkdsk /x 這類指令不能下。房客還在裡面洗澡的時候,不要把整棟樓的水關掉。

小劇場:那我到底該不該這樣做

「所以你真的把網站放在桌機裡面的虛擬機裡?」

「對。」

「停電怎麼辦?」

「停電的話網站會停,跟租雲端主機遇到機房出事一樣,只是我的機房是我的書桌。」

「聽起來很克難。」

「是很克難。但我每個月省下的錢可以喝三十杯手搖,而且我學到的東西比租一台現成的多很多。」

「你為什麼要用手搖來算?」

「因為那是我最熟悉的貨幣單位。」

我的結論

VirtualBox 不是為伺服器設計的,它的關機行為和工具鏈都會提醒你這一點,大概每個星期提醒一次。但對個人規模的服務,它給你一台可以整機備份、整機還原、跟開發環境隔開的 Linux 機器,不用多買一台電腦。

如果你也想試,我的建議只有一個:第一天就把關機腳本寫好,貼在螢幕邊上,然後永遠不要從開始功能表按關機。剩下的都還算平順,真的。

一點關於 VirtualBox 的身世

VirtualBox 最早是一間德國公司 Innotek 在 2007 年開源的,隔年 Sun 把 Innotek 買下,再過兩年 Oracle 又把 Sun 買下,所以它現在叫 Oracle VM VirtualBox,名字裡有一種被轉手兩次的滄桑。它能活到今天而且還在更新,在 Oracle 手上的開源專案裡算是幸運的。

有一件事很多人不知道:VirtualBox 本體是 GPL,但「擴充套件包」是另一個授權,個人和教育用途免費,企業用要付錢。擴充套件包提供 USB 2.0 和 3.0 支援、遠端桌面這些功能。如果你在公司的電腦上裝了它,理論上是要授權的,Oracle 的法務部門對這件事很認真,網路上有不少收到帳單的故事。我自己沒有裝擴充套件包,伺服器用途不需要 USB。

VBoxManage 這個命令列工具有幾百個子命令,幾乎所有圖形介面能做的事它都能做,而且更多。我現在幾乎不開圖形介面了,所有操作都是 VBoxManage 加腳本。學會它的那個週末,我感覺自己像是拿到了機器的後門鑰匙。

常見的三個誤會

第一個誤會是「虛擬機很慢」。在有硬體虛擬化的機器上,CPU 密集的工作跟原生差不了多少,慢的是磁碟 I/O 和某些網路情境。我的網站在裡面跑了一個月,沒有人抱怨慢,包括我自己。

第二個誤會是「存檔(savestate)等於關機」。存檔是把記憶體整個寫到磁碟然後暫停,下次從那個瞬間繼續;關機是正常的關閉流程。存檔快,但如果你在存檔狀態下改了虛擬機的設定或磁碟,醒來的時候它會很困惑。要改設定就正常關機。

第三個誤會是「快照可以當備份」。上面講過了,但這個誤會太普遍,值得再說一次。快照是檢查點,不是備份。備份要能拿到另一台機器上還原,快照做不到。

一個週末可以試的小練習

裝一台 Ubuntu Server 的虛擬機,不要開圖形介面,全程用 VBoxManage。createvm、modifyvm 設記憶體和網路、storagectl 加控制器、createmedium 建磁碟、storageattach 掛上去、startvm --type headless 啟動。這一串指令第一次打會很痛苦,但打完你會完全理解一台虛擬機是由哪些東西組成的,比在圖形介面點下一步下一步學到的多十倍。

裝好之後練習關機腳本:寫一個 .cmd,先 controlvm savestate,用迴圈等到 list runningvms 裡沒有它,再印一行「可以關機了」。不用真的關機,印那一行就好。然後把這個腳本放在桌面,從此不要再從開始功能表關機。

後記

那位算手搖飲的朋友後來問我,如果哪天有錢了會不會去租雲端主機。我想了一下,說大概會,但會捨不得。這台虛擬機教我的東西,是那些一鍵部署的服務永遠不會教的,因為它們把所有會出事的地方都藏起來了。出過事才知道事情在哪,這句話很老套,但在這台機器上是真的。

官方網站:virtualbox.org

閱讀偏好

返回全部文章作者與內容更正

留言(0)

還沒有留言。讀完有想法,歡迎留下第一則。

留言經站長審核後才會顯示。暱稱和留言會公開,請不要寫下電話、地址等個人資料;資料怎麼處理,請見隱私權政策。