【概要】
名前空間を分離してコンテナ環境を作りそのなかで指定プログラムを実行するツールです。
標準的Linuxの機能・コマンドでコンテナ環境が作成できることをわかってもらうため、C言語などで
システムコールを使うプログラムではなく、コマンドを実行するシェルスクリプトで機能を実装しています。


コンテナの定義ファイルを用意してそれに従ってコンテナ環境の作成よび起動を行うものとします。


【機能】
コンテナ環境を作成しその中で指定プログラムを実行するための機能を提供します。
なお、コンテナイメージの管理機能は持ちません。


コンテナの基本仕様は以下の通りです。
・CGROUP名前空間以外全ての名前空間を分離した環境を用意
　リソース管理についてはシステムグローバルにしておくためCGROUP名前空間は分離しない

・指定されたプログラムをコンテナ環境で実行する（バックグラウンド実行も指定可能）


・コンテナ環境の設定はコンテナ名をファイル名とした設定ファイルを記述して行う
　定義内容の詳細は、conf配下にある info.txt ファイルを参照

・RaspberryPi OSのシステムイメージをベースとしてコンテナ用のシステム領域を用意
　コンテナ環境ではRaspberryPi OSのコマンドを使用可能

・コンテナ環境でのファイル変更はコンテナ環境でのみ有効となる（ホストや他のコンテナへは影響しない）

・任意のアドレスを指定してコンテナネットワークを追加可能
　指定がなければネットワーク接続はない

・仮想ブリッジを同じものを指定すれば複数コンテナを同じコンテナネットワークに追加可能

・ポートフォワードの設定が可能
　外部からコンテナ内のネットワークサービスへアクセス可能、コンテナからインターネットへアクセス可能

・ホストとコンテナ間で共有フォルダを持てる（１箇所のみ）
　
・CGROUPを使用したリソース制限機能は標準ではない
　resディレクトリ配下にあるコマンドを利用して制御機能は用意
　- CPU利用制限設定
　- メモリ利用制限設定
　- デバイスアクセス制限設定
　サンプル実装としての提供なので要件に合わせて改修して使用



【コマンド】
コンテナ操作は以下の４つのコマンドで行います。
+------------------+--------------------+------------------------------------------------------------------------+
| コマンド         | 機能               | 処理内容                                                               |
+------------------+--------------------+------------------------------------------------------------------------+
| create_mycont.sh | コンテナ環境の作成 | 実行ディレクトリを作成し、システムファイルおよびットワーク環境を準備   |
+------------------+--------------------+------------------------------------------------------------------------+
| start_mycont.sh  | コンテナ環境起動   | コンテナモニタプロセスの起動とIPアドレスポートフォワード設定などを行い |
|                  |                    | コンテナ環境でプログラムの起動                                         |
+------------------+--------------------+------------------------------------------------------------------------+
| stop_mycont.sh   | コンテナ環境停止   | 実行プログラムおよびコンテナモニタプロセスの停止し、ポートフォワード、 |
|                  |                    | IPアドレスの設定解除                                                   |
+------------------+--------------------+------------------------------------------------------------------------+
| remove_mycont.sh | コンテナ環境の削除 | システムファイル、ネットワークを破棄し、実行ディレクトリ削除           |
+------------------+--------------------+------------------------------------------------------------------------+

これらのコマンドは、conf/コンテナ名 のコンテナ定義ファイルに従った操作を行います。



【ファイル構成】
PROG/
	create_mycont.sh		コンテナ環境を作成するコマンド
	start_mycont.sh			コンテナを起動するコマンド
	stop_mycont.sh			コンテナを停止するコマンド
	remove_mycont.s			コンテナ環境を削除するコマンド
	env.sh				環境設定ファイルの生成コマンド
	MYENV				環境設定ファイル
	
	conf/		設定ファイルを配置するディレクトリ
			ここに、コンテナ名をファイル名にして設定ファイルを置く
	
	env/		コンテナ環境／名前空間管理関連
		my_contmon_pid		コンテナのモニタプロセスのPID取得処理
		my_cont_pid		コンテナで動作しているプログラムのPID取得処理
		
	net/		ネットワーク管理関連
		bridge_create.sh	仮想ブリッジの作成処理
		bridge_remove.sh	仮想ブリッジの削除処理
		veth_create.sh		仮想Ethernetデバイスの作成処理
		veth_remove.sh		仮想Ethernetデバイスの削除処理
		net_attach.sh		コンテナにネットワークの接続処理す
		net_detach.sh		コンテナからネットワークの切断処理
		portfwd_create.sh	ポートフォワードの設定処理
		portfwd_remove.sh	ポートフォワードの解除処理
		
	work/		コンテナ環境動作ディレクトリ
			ここに、コンテナ名のディレクトリが作成され動作環境が作られる

	res/		CGROUPリソース制御関連
		cpu_limit.sh		CPU利用制限の設定コマンド
		cpu_unlimit.sh		CPU利用制限の解除コマンド
		memory_limit.sh		メモリ利用制限の設定コマンド
		memory_unlimit.sh	メモリ利用制限の解除コマンド
		device_limit.sh		デバイス利用制限の設定コマンド
		device_unlimit.sh	デバイス利用制限の解除コマンド
		mem.c			メモリ獲得テストプログラム
		my_devctl.c		デバイス制限BPFプログラム
		
	msgserver/	メッセージサーバ実験プログラム
		msgsrv.py		メッセージ収集・表示サーバ
		config.json		設定ファイル
		sendmsg.py		メッセージ送信クライアント



【実行方法】
（環境設定）
以下の手順で環境準備をしてから各コマンドを起動します。
1)環境設定ファイル作成
$ ./env.sh

2)環境設定ファイルの読み込み
$ . MYENV

3)コンテナ定義ファイルの作成
confディレクトリ配下にコンテナ名をファイル名にした設定ファイルを配置します。
記載方法詳細は、conf/info.txt を参照してください。
最低限必要な設定は、PROGの指定で、ここには、work/コンテナ名/root/をルートとした実行プログラムの
プログラムファイル名を設定します。


（コンテナ起動）
1)コンテナ環境を作成
コンテナ名を指定して作成コマンを実行します。
$ ./create_mycont.sh <コンテナ名>

2)コンテナ実行
コンテナ名を指定して起動コマンドを実行します。
$ .start_mycont.sh <コンテナ名> [background]
backgroundオプションを指定するとコマンドはバックグラウンドで実行されます。

（コンテナ停止）
1)コンテナ停止
コンテナ名を指定して停止コマンドを実行します。
$ .stop_mycont.sh <コンテナ名>

2)コンテナ環境削除
コンテナ名を指定して削除コマンドを実行します。
$ .remove_mycont.sh <コンテナ名>



以上
