如何在 Linux 中儲存和恢復程序?
有時,您會遇到需要對程序進行快照並在以後使用其相同狀態的情況。我們在 Linux 中將此儲存程序狀態以供以後使用的操作稱為檢查點。此操作透過獲取正在執行的程序並將其儲存到檔案中來完成,然後您可以快速再次啟動該程序而不會丟失其狀態。
為了更容易理解,假設您有一個程序正在執行一些計算。為了防止在系統崩潰或重新啟動機器時資料丟失,您可以在其執行時將其狀態儲存到檔案中。然後,當您需要它時,只需恢復該檔案即可。此操作有助於節省記憶體和時間。
為了實現這一點,我們在 Linux 中有一個強大的工具叫做 CRIU,它可以為我們完成所有這些工作。
注意 - 此檢查點/恢復功能需要在核心級別進行一些配置,因此首先,您需要檢查您的核心中是否啟用了檢查點/恢復支援。您可以透過讀取並查詢CONFIG_CHECKPOINT_RESTORE位於/boot/config:中的配置檔案來檢查此項。
grep CONFIG_CHECKPOINT_RESTORE /boot/config-$(uname -r)
您應該獲得 -
CONFIG_CHECKPOINT_RESTORE=y
什麼是 CRIU?
CRIU 代表“使用者空間中的檢查點/恢復”。此工具的作用是讀取 Linux 中程序的狀態並將其儲存到一組稱為映像檔案的檔案中。
CRIU 嘗試捕獲程序的完整狀態,以便以後在同一臺機器或另一臺機器上重新建立相同的程序。
此影像說明了使用 CRIU 在 Linux 中檢查點和恢復程序的過程。
它獲取程序狀態的轉儲,將其放入檔案中,然後恢復它們。這就是檢查點和恢復的含義。
CRIU 使用標準核心 API(例如轉儲、prctl、netlink和系統呼叫)來轉儲程序,並使用相同的方法來恢復程序。
安裝 CRIU
預設情況下,CRIU 未安裝在 Linux 中,但它幾乎在所有 Linux 發行版的軟體包儲存庫中都可用。
對於Debian / Ubuntu / Mint -
apt install criu
注意 - 如果您使用的是 Ubuntu 24.04,由於某些依賴項問題,CRIU 不在官方儲存庫中。您需要使用 CRIU 團隊提供的此 PPA 新增它 -
sudo add-apt-repository ppa:criu/ppa
更新系統並安裝 CRIU -
sudo apt update sudo install criu
對於Arch / 基於 Arch 的發行版 -
pacman -S criu
如果您使用的發行版在官方儲存庫中沒有 CRIU,或者您想從原始碼構建它,您可以檢視 CRIU 網站。
安裝完成後,您可以在終端中鍵入criu來檢查該工具是否已成功安裝。您應該會看到如下輸出 -
使用 CRIU 的示例
我們已成功安裝 CRIU。轉儲程序的步驟對於任何程序都是相同的。
- 首先,您需要獲取要轉儲的程序的 PID。
- 其次,將使用 CRIU 工具轉儲程序。使用 CRIU 轉儲程序的命令如下
criu dump -t <pid> --images-dir /path/to/save/images --leave-running
這裡,
- <pid> - 指定程序 PID。
- <--images-dir> - 指定儲存轉儲的目錄名稱。
- /path/to/save/images - 將包含轉儲檔案的目錄,確保在開始轉儲之前建立了此目錄;否則,您將收到錯誤。
- --leave-running - 此選項在檢查點後保持程序執行;否則,在執行轉儲後進程將停止。
讓我們以一個示例來在實際示例中應用這些步驟。為了演示這一點,讓我們執行一個需要一些時間才能完成的程序。例如 -
開啟終端並執行以下命令 -
sleep 3600 &
此程序將執行一段時間,在此示例中為 3600 秒(1 小時);末尾的&符號表示我們需要在後臺執行它。現在,我們確實有正在執行的程序了。
第二件事,我們應該做的是獲取此程序的 PID。我們可以使用pregrp -
pgrep sleep
其輸出為 -
8521
第三件事,建立儲存檔案的目錄 -
mkdir sleepdump
這裡我稱之為sleepdump,您可以根據自己的喜好命名它。
之後我們獲取了程序 ID 並建立了儲存檔案的目錄,現在我們應該準備好使用 CRIU 了 -
sudo criu dump -t 8521 --images-dir ~/sleepdump --shell-job
這裡我們新增–shell-job告訴 CRIU 此程序是從 shell 執行的。如果沒有此選項,CRIU 將不會捕獲與 shell 上下文相關的所有必要資料,因此轉儲將失敗。
我們沒有新增leave-running選項,因此轉儲後進程將終止。
執行此命令後,我們應該在建立的目錄(在此示例中為sleepdump)中獲得映像檔案 -
此時,我們剛剛成功轉儲了我們的程序。現在是時候學習如何恢復它了。
要使用 CRIU 恢復程序,我們使用以下命令 -
sudo criu restore --images-dir ~/path/to/save/images
我們示例中的路徑在這裡是sleepdump -
sudo criu restore --images-dir ~/sleepdump
這應該會恢復程序並再次執行它。我們在這裡執行的程序適用於您想要轉儲的任何程序。
結論
在本教程中,我們演示瞭如何使用強大的工具 CRIU 在 Linux 中執行檢查點。我們只做了一個簡單的示例,但 CRIU 功能更強大,並且有很多功能等待探索。