LXCをC言語から操作する①

CentOS Stream9でLXCを動かす①で取り合えずCentOS上でコンテナが動くところまで設定できました。

次はC言語のAPIを使ってみようと思います。

コンパイルに必要な「lxcdevel 」パッケージをインストールします。合わせてコンパイラ関係も入れます。

# 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.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)