最近在啃mesos源码,mesos用cgroup做资源隔离,由于之前没有接触linux container,所以写了一些小代码做了一些小试验来学习一下cgroup。
/proc/mounts文件是以/etc/mtab文件的格式给出当前系统所挂载的文件系统信息,这个文件也能反映出任何手工安装从而在/etc/mtab文件中没有包含的文件系统。当挂载cgroups后,cgroups的挂载点的信息也出现在/proc/mounts中,在我机器上/proc/mounts的条目信息如下:
从左至右的信息是:文件系统name,挂载点绝对路径,文件系统类型,选项,dump的频率和fsck的检查次数。
我在/home/test_dir/cgroups目录下挂载了cgroup的cpu和memory子系统,在/home/test_dir/cgroups2目录下挂载cgroup的net_cls子系统。
输入如下两行命令:
以在/proc/mounts中显示分别显示出了这两个目录。
/proc/cgroups记录着所有cgroup子系统的状态:
从左到右的条目分别是子系统name,hierarchy ID,子系统的cgroup控制组数目,子系统是否可用(1可用,0不可用)
那么这两个文件可以用来干嘛呢?
我们可以通过查看/proc/cgroups是否存在来判断cgroup在机器上是否可用。可以通过解析/proc/cgroups文件获取所有可用的cgroup的子系统信息。
我们可以通过解析/proc/mounts文件内容查看cgroup是否被挂载和指定路径挂载了那些子系统。
写了一段测试代码,使用setmntent/getmntent/hasmntent来查看指定目录是否挂载了子系统。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mntent.h>
bool checkDirMounted(const char* dir, const char* subsys[], size_t num)
{
if (!dir || !subsys || 0 == num) {
return false;
}
FILE* file = setmntent("/proc/mounts", "r");
if (file == NULL) {
return false;
}
while (true) {
struct mntent* mntent = getmntent(file);
if (mntent == NULL) {
break;
}
if (strcmp(mntent->mnt_type, "cgroup") != 0
|| strcmp(mntent->mnt_dir, dir) != 0) {
continue;
}
for (size_t i = 0; i < num; ++i) {
bool failed = !subsys[i] || !hasmntopt(mntent, subsys[i]);
if (failed) {
endmntent(file);
return false;
}
}
return true;
}
endmntent(file);
return false;
}
int main()
{
//我在/home/test_dir/cgroups目录下挂在了cgroup,使用了如下命令:
//mount -t cgroup -o cpu,memory test_cgroups /home/test_dir/cgroups
const char* dir = "/home/test_dir/cgroups";
const char* subSystem[] = {"memory", "cpu"};
//查看指定目录是否挂载了memory和cpu
if (checkDirMounted(dir, subSystem, 2)) {
printf("%s have already mount %s,%s\n", dir, subSystem[0], subSystem[1]);
}
return 0;
}
这段代码运行的结果是:
作者zy,QQ 105789990