LXC 提供了稳定的 C API 以及大量不同语言的绑定。LXC 版本中的 liblxc1 API 的接口可能会增加,但不会在不调用 liblxc2 的情况下删除或更改现有符号。
与稳定的 API 一起发布的第一个 LXC 版本是 1.0.0。只有 lxccontainer.h
头文件中列出的符号是 API 的一部分,所有其它的都是 LXC 的内部符号,且可能在任何时间点改变。
API 用法最好的示例是各语言的绑定的实现以及 LXC 工具本身。
官方同时提供了当前 git master 的代码所对应的最新的 API 文档。
这里是一个简单的示例,用于说明如何创建、启动、停止及销毁一个容器。
在 LXC 中,用 struct lxc_container
结构描述一个容器,该结构封装了如容器名称,容器配置文件路径,容器配置等信息,以及可以对单个容器执行的所有操作。struct lxc_container
结构定义(位于 lxccontainer.h
头文件中,lxc-2.0.7 版)如下:
struct lxc_container
结构是 LXC C API 最主要的部分。除了 struct lxc_container
结构,LXC 还提供了如下的 API:
struct lxc_container
结构的生命周期如下:
即通过 lxc_container_new()
函数创建并初始化,通过 lxc_container_get()
增加结构的引用计数,然后通过结构的成员函数指针执行针对特定容器的操作,最后通过 lxc_container_put()
减小引用计数或释放结构体。lxc_container_put()
与 struct lxc_container
结构的 destroy()
的主要差别在于,后者是销毁磁盘上与特定容器有关的所有数据,而前者只是释放在内存中用于表示特定容器的结构体,而不会对磁盘上容器的数据产生影响。
其中 lxc_container_new()
函数的实现(位于 lxc/src/lxc/lxccontainer.c
)如下:
在这个函数中,为 struct lxc_container
结构分配内存,加载配置,并检查容器是不是创建了一半,如果是就移除创建了一半的容器。最最重要的还是初始化结构体的一大票函数指针。从这个函数中,我们可以非常清除地看到,struct lxc_container
结构的那些 API 函数,其实现是什么。如 start()
成员,其实现是 lxcapi_start()
函数。
前面的示例代码在编译时,需要链接 liblxc。
这些 C API 与相应的命令行工具作用相同。可以利用各个命令行工具,获得更多与 API 调用时发生的错误有关的信息。当容器创建成功时,也就是lxc_container::createl()
成功执行时,就可以通过命令行工具 lxc-ls
来查看创建的容器了,如:
通过 C API 创建的容器,同样可以用命令行工具来操作,如这样起动或停止容器:
上面的示例代码,在执行之前,需要先创建名为 lxcbr0 的 br。创建方法如下:
否则,在启动容器时将失败。从命令行工具中可以看到如下的报错信息:
在 lxc 的日志文件中可以看到这样的内容:
打赏
参考文档:
Get started with lxc.
Linux 容器的建立和简单管理
Done.