如何在 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

此影像說明了使用 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來檢查該工具是否已成功安裝。您應該會看到如下輸出 -

Install 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)中獲得映像檔案 -

Example CRIU

此時,我們剛剛成功轉儲了我們的程序。現在是時候學習如何恢復它了。

要使用 CRIU 恢復程序,我們使用以下命令 -

sudo criu restore --images-dir ~/path/to/save/images

我們示例中的路徑在這裡是sleepdump -

sudo criu restore --images-dir ~/sleepdump

這應該會恢復程序並再次執行它。我們在這裡執行的程序適用於您想要轉儲的任何程序。

結論

在本教程中,我們演示瞭如何使用強大的工具 CRIU 在 Linux 中執行檢查點。我們只做了一個簡單的示例,但 CRIU 功能更強大,並且有很多功能等待探索。

更新於: 2024 年 11 月 4 日

40 次檢視

啟動你的 職業生涯

透過完成課程獲得認證

開始
廣告