Docker熱移動ツールCRIU原理シリーズ:テストセットZDTM

4994 ワード


 
ZDTMはZero DownTime Migrationを表し、ダウンタイム移行はゼロです.ZDTMテストセットはOpenVZの熱移行のために開発されたテストセットであり、CRIUもそれをテストセットとして使用している.ZDTMテストセットは多くのテスト例からなり、現在CRIUには384のテスト例が含まれている.同時にZDTMテストキットは自動化キットであり、各サブテストをプロセスとして起動し、準備が整うのを待ってから起動したプロセスをダンプし、それを復元し、リストアの状態がテストで正しいと判断した状態であるかどうかを確認する必要があります.テスト自体はtest/zdtm/サブディレクトリの1つにあります.完全なループキットはtest/zdtm.pyスクリプト.
この文書では、インタフェースZDTM APIの基本的な使用とテストについて説明します.
一、準備作業:依存パッケージとcriuソースコードをダウンロードしてコンパイルする
ZDTMテストセットを実行するには、現在のホストにlibaio-devel(RPM)またはlibaio-dev(DEB)パッケージをインストールする必要があります.同時にスクリプトzdtm.pyをテストするには、PyYAML(RPM)またはpython-yaml(DEB)パッケージをインストールする必要があります.
ZDTM関連コードはcriuソースのtestディレクトリにあります.criuソースコードのZDTMテストセットをダウンロードしてコンパイルできます.コマンドは
[local@localhost test]$ git clone  https://github.com/checkpoint-restore/criu.git
[local@localhost test]$ cd criu
[local@localhost test]$ su
[root@localhost test]# make clean ; make zdtm

コンパイルが完了すると、testディレクトリにアクセスしてZDTMテストセットのリストを表示できます.
[root@localhost test]# cd test
[root@localhost test]# ./test/zdtm.py list

zdtm/static/env00
zdtm/static/file_append
zdtm/static/cgroup00
zdtm/transition/maps008
zdtm/transition/epoll
zdtm/transition/ipc
zdtm/transition/fork2
zdtm/transition/socket-tcp
zdtm/transition/unix_sock
。。。

 
二、ZDTMのすべてのテストセットまたは単一のテスト用例を実行する
単一のZDTMテストケース使用コマンド"zdtmを実行する.py-t Name.ここでNameは使用例の名前を表します.たとえば
[root@localhost test]# cd test
[root@localhost test]#./zdtm.py run -t zdtm/static/env00

=== Run 1/1 ================ zdtm/static/env00
========================== Run zdtm/static/env00 in h ==========================
Start test
./env00 --pidfile=env00.pid --outfile=env00.out --envname=ENV_00_TEST
Run criu dump
Run criu restore
Send the 15 signal to  44
Wait for zdtm/static/env00(44) to die for 0.100000
Removing dump/zdtm/static/env00/44
========================= Test zdtm/static/env00 PASS ==========================
========================= Run zdtm/static/env00 in ns ==========================
Start test
./env00 --pidfile=env00.pid --outfile=env00.out --envname=ENV_00_TEST
Run criu dump
=[log]=> dump/zdtm/static/env00/92/1/dump.log
------------------------ grep Error ------------------------
(00.476455) 	Running ip route save
(00.478566) 	Running ip -6 route save
(00.480640) 	Running ip rule save
Command "save" is unknown, try "ip rule help".
(00.482652) Warn  (criu/net.c:1878): Check if "ip rule save" is supported!
------------------------ ERROR OVER ------------------------
Run criu restore
Send the 15 signal to  111
Wait for zdtm/static/env00(111) to die for 0.100000
Removing dump/zdtm/static/env00/92
========================= Test zdtm/static/env00 PASS ==========================

ここで、「Test zdtm/static/env 00 PASS」にはenv 00テストケーステストケースの結果が表示され、その過程で生成された*.imgテンポラリファイルのデフォルトは削除されており、「Removing dump/zdtm/static/env 00/92」から分かる.
 
あるテストケースを実行する過程でテストケースの中間を保持する場合.imgファイル、コマンド"zdtm.py run「コマンドに追加」--keep-img always」オプション.例:
[root@localhost test]# ./zdtm.py run -t zdtm/static/env00 --keep-img always

実行後に生成する*imgファイルはディレクトリdump/zdtm/の下にあります.例えば、テストenv 00の使用例を参照して生成する.imgの結果は次のとおりです.
[root@localhost test]# cd dump/zdtm/static/env00/44/1/
[root@localhost 1]# ls
core-44.img   fs-44.img      pagemap-44.img		restore.cropt
dump.cropt    ids-44.img     pagemap-shmem-3620349.img	restore.log
dump.log      inventory.img  pages-1.img		seccomp.img
fdinfo-2.img  memfd.img      pages-2.img		stats-dump
files.img     mm-44.img      pstree.img			stats-restore

        
すべてのZDTMテストセット使用コマンド"zdtmを実行する.py-a"または"zdtm.py -a --parallel 2“
./zdtm.py run -a --parallel 2

ここで"-a"はallを表し、つまりすべての使用例を実行します.--parallel「パラレル実行を表します」--parallel 2「は、2つのスレッドを使用して実行することを表します.382のテスト・インスタンスをすべて実行するのに時間がかかります.実行が終了すると、次のメッセージが表示されます.
 
三、ZDTM API
より多くのサブテストを記述するために、開発者は以下に宣言されたAPIを使用する必要があります.1つのZDTMテスト例は、基本的に次の3段階を含む.
準備フェーズ:プロセスがバックアップを開始する前のアクション.
≪実行フェーズ|Executeフェーズ|emdw≫:このフェーズでは、プロセスを任意の場所で中断およびバックアップできます.
検証フェーズ:リカバリ後、テストプログラムは正確性を検証し、結果を報告します.
関連するAPIは以下の通りである.test_init(argc, argv): 。 , 。 test_daemon(): , 。 test_go(): dump/restore 。 test_waitsig(): 。 pass(): 。 fail(message): err(message): 。 test_msg(message):テスト情報.
典型的なテスト例は次のとおりです.
int main(int argc, char **argv)
{
	test_init(argc, argv);

	/* Preparations */

	test_daemon();

#if test want to act and get c/r-ed unexpectedly
	while (test_go()) {
		/* Actions go here */
	}
#else test just want to wait for c/r to happen
	/* Actions go here. */

	test_waitsig();
#endif

	/* checks */

	if (test_passed())
		pass();
	else
		fail("Something went wrong");

	return 0;
}