前回を書いてからいつの間にか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コマンドはいろいろな機能を持っており、
コマンド | 機能 |
---|---|
dump | チェックポイント処理を実行 |
restore | リストア処理を実行 |
check | カーネルがCRIUに必要な機能をサポートするかどうかチェック |
コマンドのあとに指定するオプションのうち、dump
とrestore
で共通に使うものは以下のようなオプションです。
オプション | 意味 |
---|---|
-D / --images-dir | チェックポイントデータの保存ディレクトリ |
-o / --log-file | ログファイル名 |
-v | ログレベル。vの数でレベルを指定でき、 |
-j / --shell-job | シェルから実行したプロセスを対象とする場合に指定 |
dumpコマンドでは以下のようなオプションを使用します。チェックポイント対象のプロセスを指定する必要がありますので、-t
は必ず指定します。
オプション | 意味 |
---|---|
-t / --tree | チェックポイント対象のプロセスの指定 |
restoreコマンドは、-d
オプションを指定せずにcriu restore
を実行すると、-d
を指定すると良いでしょう。
オプション | 意味 |
---|---|
-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
異なるホスト間でのチェックポイント・リストア
前述の例はプロセスを実行したホスト上でチェックポイント処理を行い、
次にcriu dump
で取得したファイルを別のホストにコピーし、
まずは先の例と同様にスクリプトを実行させて、
ubuntu@criu1:~$ sh test.sh & [1] 1958 ubuntu@criu1:~$ sudo criu dump -t 1958 -vvvv -D criu/ -o dump.log -j [1]+ Killed sh test.sh ubuntu@criu1:~$ ls criu/ core-1958.img fs-1958.img mm-1958.img pages-2.img stats-dump core-1996.img fs-1996.img mm-1996.img pstree.img tty.img dump.log ids-1958.img pagemap-1958.img reg-files.img tty-info.img fdinfo-2.img ids-1996.img pagemap-1996.img sigacts-1958.img fdinfo-3.img inventory.img pages-1.img sigacts-1996.img
次に関連するファイルをrsyncコマンドを使ってリストア処理を実行するホスト上に転送しましょう。
ubuntu@criu1:~$ sudo rsync -a test.sh testfile criu ubuntu@criu2:/home/ubuntu/
転送先にファイルが転送されていることを確認します。
ubuntu@criu2:~$ ls -F criu/ testfile test.sh ubuntu@criu2:~$ ls criu core-1958.img fs-1958.img mm-1958.img pages-2.img stats-dump core-1996.img fs-1996.img mm-1996.img pstree.img tty.img dump.log ids-1958.img pagemap-1958.img reg-files.img tty-info.img fdinfo-2.img ids-1996.img pagemap-1996.img sigacts-1958.img fdinfo-3.img inventory.img pages-1.img sigacts-1996.img
スクリプトの出力が記録されるファイルの最後の行を確認したあと、
ubuntu@criu2:~$ tail -n 1 testfile (ファイルの最後の数字を確認) 17 ubuntu@criu2:~$ sudo criu restore -vvvv -D criu/ -o restore.log -j -d (リストアコマンド実行) ubuntu@criu2:~$ ps axjf | less (プロセスの確認) :(略) 1 1958 1743 1511 pts/0 2092 S 1001 0:00 sh test.sh 1958 2091 1743 1511 pts/0 2092 S 1001 0:00 \_ sleep 1 ubuntu@criu2:~$ tail -f testfile (数字がインクリメントされていくのを確認) 11 12 13 14 15 16 17 18 19 20 ^C
異なるホスト間でもプロセスがリストアされることが確認できました。
lxc-checkpointコマンド
ここまでで紹介したCRIUを使った、
LXCはチェックポイント・criu
コマンドに必要なオプションを指定して実行しています。
ちなみにlxcパッケージをインストールしても、
実際に実行例を見る前に、
オプション | 意味 |
---|---|
-r / --restore | リストア処理を実行 |
-D / --checkpoint-dir | チェックポイントデータの保存ディレクトリ |
-s / --stop | チェックポイント後にコンテナを停止 |
-v / --verbose | CRIUのログ出力を冗長モードにする |
-d / --daemon | リストア時、 |
-F / --foreground | リストア時、 |
lxc-checkpointコマンドを使ったコンテナのチェックポイント・リストア
チェックポイント・/var/
)
lxc.tty = 0
lxc.console = none
lxc.cgroup.devices.deny = c 5:1 rwm
それでは、/tmp/
に保存するとします。
root@criu01:~# mkdir /tmp/criu (チェックポイント用のディレクトリを作成) root@criu01:~# lxc-start -n ct01 (コンテナの起動) root@criu01:~# lxc-ls -f (コンテナの起動を確認) NAME STATE AUTOSTART GROUPS IPV4 IPV6 ct01 RUNNING 0 - 10.0.3.196 - root@criu01:~# lxc-checkpoint -n ct01 -D /tmp/criu -v -s -l debug -o log (チェックポイント処理実行) root@criu01:~# lxc-ls -f (コンテナ停止の確認) NAME STATE AUTOSTART GROUPS IPV4 IPV6 ct01 STOPPED 0 - - - root@criu01:~# tail -n1 /tmp/criu/dump.log (チェックポイントログの確認) (00.292169) Dumping finished successfully-
-s
オプションを付けて、/tmp/
以下に出力されているチェックポイントのログを見ると、
それでは、/tmp/
に保存したデータを使ってコンテナのリストア処理を実行してみましょう。ここではチェックポイント処理を行ったホストと別のホスト上にリストアしてみます。
異なるホスト間でチェックポイント・
まずはリストア処理に必要なファイルをrsyncコマンドで転送しましょう。転送が必要なファイルは、/tmp/
と/var/
をrsyncで転送しましょう。
root@criu1:~# rsync -az /tmp/criu criu2:/tmp/ root@criu1:~# rsync -az /var/lib/lxc/ct01 criu2:/var/lib/lxc
実際にコンテナのマイグレーションを行う際は、
それではリストア処理を実行してみましょう。
root@criu02:/tmp# lxc-checkpoint -n ct01 -r -D /tmp/criu -v -d -o log -l debug (リストア処理) root@criu02:/tmp# grep success /tmp/criu/restore.log (リストアログの確認) (00.259327) Restore finished successfully. Resuming tasks. root@criu02:/tmp# lxc-ls -f (コンテナの起動の確認) NAME STATE AUTOSTART GROUPS IPV4 IPV6 ct01 RUNNING 0 - 10.0.3.196 -
リストア処理のログと、
チェックポイント、
非特権コンテナのチェックポイント・リストア
第16回で紹介した、
ただし、
では、
このようなコンテナを作るために、
まとめ
今回はCRIUとlxc-checkpointコマンドを簡単に紹介しました。
CRIUには今回紹介した他にも多数のオプションが存在し、
lxc-checkpointコマンドは今回紹介した通り、
このような目的にはLXCを使うのではなく、
LXDに関しては、