CentOS Stream9でLXCを動かす①で取り合えずCentOS上でコンテナが動くところまで設定できました。
次はC言語のAPIを使ってみようと思います。
コンパイルに必要な「lxc–devel 」パッケージをインストールします。合わせてコンパイラ関係も入れます。
# dnf install gcc g++ make lxc-devel -y
インストールすると、APIに使うヘッダファイルは「/usr/include/lxc/lxccontainer.h」に、ライブラリは「/usr/lib64/liblxc.so」に置かれます。
公式のサンプルをベースに、CentOS Stream9のコンテナを作るようにしてみます。
#include <stdio.h> #include <lxc/lxccontainer.h> int main() { struct lxc_container* c; int ret = 1; /* Setup container struct */ c = lxc_container_new("apicontainer", NULL); if (!c) { fprintf(stderr, "Failed to setup lxc_container struct\n"); goto out; } if (c->is_defined(c)) { fprintf(stderr, "Container already exists\n"); goto out; } /* Create the container */ if (!c->createl(c, "download", NULL, NULL, LXC_CREATE_QUIET, "-d", "centos", "-r", "9-Stream", "-a", "amd64", NULL)) { fprintf(stderr, "Failed to create container rootfs\n"); goto out; } /* Start the container */ if (!c->start(c, 0, NULL)) { fprintf(stderr, "Failed to start the container\n"); goto out; } /* Query some information */ printf("Container state: %s\n", c->state(c)); printf("Container PID: %d\n", c->init_pid(c)); /* Stop the container */ if (!c->shutdown(c, 30)) { printf("Failed to cleanly shutdown the container, forcing.\n"); if (!c->stop(c)) { fprintf(stderr, "Failed to kill the container.\n"); goto out; } } /* Destroy the container */ if (!c->destroy(c)) { fprintf(stderr, "Failed to destroy the container.\n"); goto out; } ret = 0; out: lxc_container_put(c); return ret; }
上記のコードをlxctest.cppとして保管し、以下のコマンドでビルドします。
# gcc -llxc lxctest.cpp -o lxctest
ビルドできたら実行します。シャットダウンが指定の30sec以内にできなかったみたいですが、とりあえずは動いたみたいです。
# ./lxctest Container state: RUNNING Container PID: 3538 Failed to cleanly shutdown the container, forcing.