拍照 vs 重建指令:環境重建的兩種思路
環境重建是 dotfile 管理的最終目的:拿到一台空白機器,能在可預期的時間內還原成你熟悉的工作環境。這件事有兩條根本不同的路線,選哪條決定了你之後所有的管理策略。
拍照:VM 快照與磁碟映像
第一種是拍照。VM 快照和磁碟映像(Clonezilla、dd)做的事是把整台機器某一刻的完整狀態凍結存檔——整個虛擬硬碟的 block-level 複製,有時連記憶體狀態都包含。還原就是把映像寫回去,系統回到那一刻,像時光倒流。Docker 的 docker commit 也屬於這個方向:把正在跑的 container 的檔案系統快照成一個 image。
拍照產出的是黑盒子。一個磁碟映像是二進制檔案,沒人能看出裡面到底做了什麼設定、裝了什麼、改過什麼。它大(動輒 GB 級)、跟硬體耦合(換不同架構或不同顯卡可能開不起來)、無法做 diff 或 code review。
重建指令:Dotfile repo + install script
第二種是重建指令。Dotfile repo + install script 描述的是「怎麼從一台空白機器組出這個環境」,每次都從零開始執行。Dockerfile 也是重建指令——一份「照著做就能重現」的食譜,描述每一步該安裝什麼、複製什麼、怎麼啟動。
重建指令產出的是白盒子。每一步都是可讀的文字——這行裝 zsh、那行設定 Hyprland 的 keybind——可以被 review、被 diff、被另一個人讀懂。它小(通常幾十 KB)、跨硬體(同一份 script 加 OS 判斷就能跑在不同機器)、可以進版控走 PR 流程。
dotfile 管理選的是重建指令這條路。代價是你必須把環境建構的過程記錄清楚——每裝一個新工具、每改一個配置都要同步更新 repo。回報是任何一台機器、任何時間點,都能用一份 Git repo 重現你的工作環境。
場景判讀
| 需求 | VM 快照 | Dotfile 重建 |
|---|---|---|
| 保留某一刻的完整系統狀態 | 適合(block-level 完整備份) | 不適合(只管配置層) |
| 在新機器還原工作環境 | 不適合(硬體耦合、映像大) | 適合(跨硬體、輕量) |
| 讓環境可被他人重現(onboarding) | 勉強(黑盒子、難維護) | 適合(白盒子、可 review) |
| 在多台機器維持一致 | 不適合(每台都要拍照) | 適合(一份 repo、多台 apply) |
| 做實驗後回滾(改壞了想恢復) | 適合(秒級回滾) | 要靠 git revert + 重新 apply |
| 讓桌面配置進 review 流程 | 不適合(二進制映像無法 diff) | 適合(純文字、可 diff、可 PR) |
兩者不互斥——常見的組合是:用 dotfile 管理配置(長期可維護的基線),VM 快照用於短期實驗保護(改爛了可以秒回)。