前回を書いてからいつの間にか4ヵ月も経ってしまいました。この間にLXCを含むlinuxcontainers.
これまではLXCというソフトウェアだけが正式にリリースされていましたが,
これらのstableリリースとなる2.
LXC 2.
LXC 1.
第31回で紹介したのは設定項目に関する変更点でした。このうちのいくつかはsystemdをサポートするために内部の実装が変更されたことに伴う変更でした。
そして,
なお,
チェックポイント・リストアとCRIU
チェックポイント機能は,
チェックポイント・
チェックポイントの際,/proc
以下からプロセスに関する情報を収集し,
CRIUはOpenVZ関連のプロジェクトですが,
CRIUが動作する環境
CRIUはカーネル3.
動作条件を満たすディストリビューションでは,
パッケージがなくても,
$ sudo criu check Looks good.
CRIUの用途
CRIUの用途として考えられることは,
ここに挙がっているシナリオのうち,
- ライブマイグレーション
- 起動が遅いサービスのスピードアップ
の2つでしょう。
ライブマイグレーションについては,
後者の
CRIUコマンド
CRIUコマンドを試す前に,
criuでは,criu
のあとに行いたい処理をコマンドとして指定し,criu dump
,criu restore
となります。
criuコマンドはいろいろな機能を持っており,
表1 criuのコマンド
コマンド | 機能 |
---|---|
dump | チェックポイント処理を実行 |
restore | リストア処理を実行 |
check | カーネルがCRIUに必要な機能をサポートするかどうかチェック |
コマンドのあとに指定するオプションのうち,dump
とrestore
で共通に使うものは以下のようなオプションです。
表2 共通オプション
オプション | 意味 |
---|---|
-D / --images-dir | チェックポイントデータの保存ディレクトリ |
-o / --log-file | ログファイル名 |
-v | ログレベル。vの数でレベルを指定でき, |
-j / --shell-job | シェルから実行したプロセスを対象とする場合に指定 |
dumpコマンドでは以下のようなオプションを使用します。チェックポイント対象のプロセスを指定する必要がありますので,-t
は必ず指定します。
表3 dumpコマンドで使う主なオプション
オプション | 意味 |
---|---|
-t / --tree | チェックポイント対象のプロセスの指定 |
restoreコマンドは,-d
オプションを指定せずにcriu restore
を実行すると,-d
を指定すると良いでしょう。
表4 restoreコマンドで使う主なオプション
オプション | 意味 |
---|---|
-d / --restore-detached | リストア後プロセスをcriuから切り離す |
CRIUを使ったプロセスのチェックポイントとリストア
それでは実際にCRIUを使っていきましょう。
今回の実行例はUbuntu 16.
$ lsb_release -d Description: Ubuntu 16.04 LTS $ uname -r 4.4.0-21-generic $ criu --version Version: 2.0
criuはパッケージインストールしていますので,
$ sudo criu check Warn (libnetlink.c:65): ERROR -2 reported by netlink Warn (libnetlink.c:65): ERROR -2 reported by netlink Warn (sockets.c:702): The current kernel doesn't support packet_diag Warn (libnetlink.c:65): ERROR -2 reported by netlink Warn (sockets.c:712): The current kernel doesn't support netlink_diag Looks good.
警告は出るものの"Looks good"と出ているようにCRIUが動作する環境であることがわかります。
ではプロセスの状態をファイルに保存し,
#!/bin/sh
n=0
while :
do
sleep 1
n=`expr $n + 1`
echo $n >> testfile
done
このスクリプトを実行し,
$ sh test.sh & [1] 16246 $ tail -f testfile 1 2 3 4 5 6 ^C $ pstree -p 15599 bash(15599)─┬─pstree(16265) └─sh(16246)───sleep(16264)
さてそれではチェックポイント機能でプロセスの状態をファイルに保存します。ファイルを保存するディレクトリを作成したあと,
$ mkdir criu $ sudo criu dump -t 16246 -vvvv -D criu/ -o dump.log -j [1]+ Killed sh test.sh $ pstree -p 15599 bash(15599)───pstree(16308) (プロセスは存在しない) $ sudo tail -n 1 criu/dump.log (00.021306) Dumping finished successfully (ログに処理が成功したことが記録されている)
以上のようにチェックポイント処理を実行すると,tail -f testfile
を実行すると,
ファイルが保存されているディレクトリを確認してみましょう。
$ ls -F criu/ core-16246.img ids-16246.img pages-1.img stats-dump core-16297.img ids-16297.img pages-2.img stats-restore dump.log inventory.img pstree.img tty.img fdinfo-2.img mm-16246.img reg-files.img tty-info.img fdinfo-3.img mm-16297.img restore.log fs-16246.img pagemap-16246.img sigacts-16246.img fs-16297.img pagemap-16297.img sigacts-16297.img
プロセスの状態を保存したファイルが確認できます。今回の例ではシンプルなシェルスクリプトの実行状態を保存しただけですので,
では,
$ sudo criu restore -vvvv -D criu/ -o restore.log -j -d $ ps axjf : (略) 1 16246 16313 15599 pts/0 20037 S 1001 0:00 sh test.sh 16246 20036 16313 15599 pts/0 20037 S 1001 0:00 \_ sleep 1
psコマンドを実行すると,-d
でcriuコマンドから切り離したあと,
数字を出力していたファイルを確認すると,
$ tail -f testfile 58 59 60 ^C