Contents

Vagrant 關機沒用到的機器

在日常開發中,同時有多個 Vagrant 虛擬機器在執行,不只佔用大量記憶體和 CPU,也可能造成網路連接埠衝突。本文整理 Vagrant 常用的機器管理指令,以及各指令的差異與適用場景。

Vagrant 基本工作流程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 建立並啟動虛擬機器(依 Vagrantfile 設定)
vagrant up

# 關閉虛擬機器(保存磁碟狀態)
vagrant halt

# 暫停虛擬機器(記憶體快照)
vagrant suspend

# 從暫停狀態恢復
vagrant resume

# 重新啟動虛擬機器(套用 Vagrantfile 變更)
vagrant reload

# 完全刪除虛擬機器(釋放所有資源)
vagrant destroy

各指令的差異與適用場景

指令 說明 啟動速度 適用場景
suspend 暫停(記憶體快照,類似電腦睡眠) 最快(秒級) 短暫離開,稍後繼續工作
halt 正常關機(保留磁碟) 較快(需完整開機) 今天不用了,明天繼續
destroy 完全刪除 最慢(需重建) 此環境不再需要

suspend vs halt 的選擇

  • suspend(推薦日常使用):速度最快,vagrant resume 幾秒即可回到工作狀態。缺點是仍佔用 RAM(因為要保存記憶體快照)。
  • halt(推薦長期不用時):完全關機,不佔用 RAM,但下次 vagrant up 需要完整的開機程序(1-2 分鐘)。

查看所有 Vagrant 機器狀態

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查看目前目錄的機器狀態
vagrant status

# 查看系統上所有 Vagrant 機器的狀態
vagrant global-status

# 輸出範例:
# id       name    provider   state   directory
# 4b7e381  default virtualbox running /home/user/project-a
# 7d2f1c9  default virtualbox saved   /home/user/project-b
# 9a1b3e2  default virtualbox poweroff /home/user/project-c

批次關閉所有執行中的機器

當有多個機器在執行時,可以一次關閉所有:

1
2
3
4
5
# 暫停所有執行中的機器(推薦)
vagrant global-status | awk '/running/{print }' | xargs -r -d '\n' -n 1 -- vagrant suspend

# 關閉所有執行中的機器
vagrant global-status | awk '/running/{print }' | xargs -r -d '\n' -n 1 -- vagrant halt

vagrant snapshot 快照功能

快照可以在特定時間點保存虛擬機器的完整狀態,方便回滾:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 建立快照(需要機器在執行中)
vagrant snapshot save <快照名稱>
vagrant snapshot save before-update

# 列出所有快照
vagrant snapshot list

# 還原到指定快照
vagrant snapshot restore <快照名稱>
vagrant snapshot restore before-update

# 刪除快照
vagrant snapshot delete <快照名稱>

# push/pop 快照(類似堆疊操作)
vagrant snapshot push   # 儲存目前狀態
vagrant snapshot pop    # 還原並刪除最後一個快照

快照的使用情境:

  • 在安裝重大軟體或進行系統更新前先建立快照
  • 測試設定變更,失敗可快速回滾
  • 示範環境的快速重置

常見問題排查

global-status 顯示已刪除的機器

global-status 有快取,若機器已手動刪除但仍顯示,可以清除快取:

1
vagrant global-status --prune

機器因連接埠衝突無法啟動

1
2
3
4
# 查看哪個 port 被佔用
netstat -tlnp | grep <port>

# 先關閉衝突的 Vagrant 機器再啟動

參考資料