1. 概要

後で使用するためにプロセスを保存すると、複雑な数学的計算やレンダリングなどの長いプロセスを実行しているときに役立ちます。 このチュートリアルでは、複数回の再起動で使用できるプロセスを保存および復元する方法を見ていきます。 ほとんどのLinuxディストリビューションは完全なマシン休止状態をサポートしていますが、他のプロセスに影響を与えることなく特定のプロセスを保存することに主に焦点を当てています。

チュートリアル全体を通して、プロセスの維持に役立つkillcriuなどのさまざまなツールを使用します。 それとは別に、VirtualBoxなどの仮想マシンにオペレーティングシステムの状態を保存する方法についても説明します。

2. killコマンドの使用

Linuxをしばらく使用している場合は、このコマンドがかなり頻繁に使用されているのを見たことがあるでしょう。 killコマンドを使用して、実行中のプロセスにシグナルを送信します。これらのシグナルは、プロセス間通信の手段を提供します。 たとえば、端末から直接、別のプロセッサからプロセスを終了、停止、または切断するための信号を送信できます。

2.1. 基本的な使用法

killコマンドの基本的な構文は非常に単純です。

$ kill -[SIGNAL] [PID]

信号の前には「-」が付いており、その後に信号コードまたは特定のアクションを示す信号名が続きます。信号の後にPIDが続きます。 Linuxの各プロセスには、そのマシン上のプロセスを一意に識別するプロセスID(PID)があります。

私たちの場合、プロセスを一時的に一時停止または停止することに関心があります。 プロセスを一時停止すると、後でプロセスを再開して通常の実行を続行できるようになります。 幸い、killコマンドは-STOPおよび-CONT信号を提供します。

2.2. プロセスの停止と再開

たとえば、CPU時間を大量に消費する長時間実行プロセスを停止し、CPU使用率も高くする短いプロセスを実行する必要があるとします。 -STOP シグナルを使用して、長いプロセスを一時的に停止できます。

$ kill -STOP 8763

コマンドを実行すると、CPU使用率が低下していることがわかります。 プロセスは引き続きメインメモリに存在しますが、Linuxは時間の経過とともにプロセスをスワップアウトして、メモリ内の他のプロセス用のスペースを作成します。

プロセスを再開する準備ができたら、プロセスに-CONTシグナルを送信できます。

$ kill -CONT 8763

マシンをシャットダウンすると、Linuxは、長時間実行されているプロセスを含め、すべてのプロセスをメモリから消去することを知っておく必要があります。 したがって、 kill コマンドは、プロセスをディスクに保存せずに一時的に停止して再開する場合に役立ちます。

ただし、再起動後もプロセスを永続化する必要がある場合は、次に説明する他のツールを確認することをお勧めします。

3. criuを使用する

criu は、プロセスの保存と復元に最も広く使用されているツールです。 同じ目的で利用できる他のツールと比較して、最も多くの機能を備えています。 それだけでなく、最新のLinuxカーネルでも最新であり、定期的に保守されています

criuを使用すると、プロセスまたはプロセスの一部をチェックポイントとしてハードドライブに保存できます。チェックポイントは、後でフリーズした時点からプロセスを再開するために使用できるファイルで構成されます。

3.1. インストール

criu バイナリパッケージは、ほとんどのディストリビューションの公式リポジトリで利用できます。 ディストリビューションに付属のパッケージマネージャーを使用してインストールできます。

# On Ubuntu, Debian
$ apt install criu
# On Fedora
$ yum install criu
# On Arch, Manjaro
$ pacman -S criu

パッケージが公式リポジトリで利用できない場合は、ソースからのコンパイルについて criuwikiを参照できます。

3.2. 基本的な使用法

criu がマシンにインストールされたら、先に進んでそれを確認できます。

$ criu -v 
Version: 3.16.1

criuを使用する前に、LinuxカーネルがCONFIG_CHECKPOINT_RESTOREオプションを有効にしてコンパイルされた場合にのみ機能することを知っておく必要があります。 そうしないと、criuが文句を言い、プロセスが保存されません。 したがって、必要なオプションを使用してカーネルをコンパイルする必要がある場合があります。

ここで、カーネルの構成でこのオプションを確認する必要がある場合は、/proc/zconfig.gzファイルを読み取るだけです。

$ zcat /proc/config.gz | grep CHECKPOINT
CONFIG_CHECKPOINT_RESTORE=y

これで、criuを使用してプロセスをダンプする準備が整いました。 ダンピングとは何か疑問に思われるかもしれません。 プロセスのダンプは、その時点で実行中のプロセスのスナップショットをメモリに取得し、そのスナップショットを他の情報と一緒にディスクに保存する方法です

コマンドラインからcriuを使用してプロセスをダンプする方法を見てみましょう。

$ criu dump -t [PID] -D /path/to/dir [OPTIONS]

dumpオプションでダンプ操作を指定します。 次に、 -tまたは–treeオプションを使用してPIDを書き込みます。 それとは別に、 -D オプションを使用して、チェックポイントを配置するディレクトリも指定します。

プロセスをダンプする前に、criuがプロセスとその子プロセスをダンプすることに注意する必要があります。たとえば、ターミナルからプロセスを生成した場合、criuは試行します。プロセスツリー全体をダンプします。 そのため、他のプロセスに依存しないように、setsidを使用してターミナルからコマンドラインプログラムを実行する必要があります。

これで、ファイルシステムからプロセスを復元する場合、チェックポイントディレクトリでプロセスを指定するだけで済みます。

$ criu restore -D /path/to/dir

criu は、最初に以前のPIDを使用してプロセスを復元しようとしますが、そのPIDがすでに使用されている場合、復元されたプロセスは新しいPIDで再開されます。

3.3. 例

例として、無限ループを含むカスタムbashスクリプトを作成しましょう。 変数に10を追加し、ループが繰り返されるたびに出力します。 先に進んでスクリプトを記述し、それを実行してみましょう。

#!/bin/bash

NUM=0
while true; do
  NUM=$((NUM+10))
  echo "NUM: $NUM"
done

setsidを使用してスクリプトを実行してみましょう。

$ setsid ./infinite-loop.sh

スクリプトが実行されたので、pgrepでそのPIDを確認しましょう。

$ pgrep infinite-loop.sh
2805

それでは、 criu を使用して、プロセスをディスクに保存しましょう。

$ criu dump -t $(pgrep infinite-loop.sh) -D ~/Documents/infinite-loop

それを分解しましょう:

  • -t は、pgrepコマンドからコマンド置換を介して取得したプロセスのPIDを指定します。
  • -D オプションは、無限ループチェックポイントファイルが保存されるディレクトリを示します

それでは、 kill infinite-loop プロセスを実行して、チェックポイントファイルから再開できるようにします。

$ kill $(pgrep infinite-loop.sh)

次に、restoreオプションを指定してcriuコマンドを実行し、プロセスを再開しましょう。

$ criu restore -D ~/Documents/infinite-loop
NUM: 10030560
NUM: 10030570
NUM: 10030580
.
.
.

ルート権限でcriuコマンドを実行する必要があることに注意してください。そうしないと、操作が許可されていませんエラーが発生します。

4. 仮想マシンでの状態の保存

仮想マシンは、後でいつでも再開できるディストリビューションの状態を保存するための便利なオプションを提供します。 この例では、 VirtualBox を使用します。これは、コンパクトでほとんどのプラットフォームで使用できるためです。

VirtualBoxをセットアップしたら、選択したディストリビューションを起動してみましょう。 ログインしたら、先に進んでを押しますまたはタイトルバーの閉じるボタン。 仮想マシンを閉じようとすると、ダイアログが表示されます。 「マシンの状態を保存する」ラジオボックスをチェックして、「OK」をクリックしましょう。

これで、VMは現在のオペレーティングシステムの現在の状態を保存し、オペレーティングシステムをオンに戻すと状態を再開します。

VMは、必ずしも単一のプロセスをフリーズするのではなく、完全なオペレーティングシステムをフリーズします。 ただし、単一のプロセスをフリーズする場合は、VMで実行されているオペレーティングシステムでcriuを使用できます。 それだけでなく、同じオペレーティングシステムと同じソフトウェアを実行していると仮定して、フリーズしたプロセスをホストオペレーティングシステムに移植することもできます。

5. 結論

このチュートリアルでは、プロセスをフリーズして復元する方法について説明しました。 プロセスを一時的に一時停止および再開するためのkillコマンドについて説明しました。 次に、 criu ツールを使用して、ディスクとの間でプロセスを保存および復元する方法について詳しく説明しました。

最後に、オペレーティングシステムの状態をVMに保存する方法について簡単に説明しました。