Chinaunix首页 | 论坛 | 博客
  • 博客访问: 359963
  • 博文数量: 87
  • 博客积分: 2571
  • 博客等级: 少校
  • 技术积分: 920
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-29 13:10
文章分类

全部博文(87)

文章存档

2012年(49)

2011年(7)

2010年(26)

2009年(5)

分类: LINUX

2012-03-21 13:55:36

lxc: linux Container library

定义:
cgroup:一组进程的行为控制
subsystem:是cgroup中可添加删除的模块.在cgroup架构的封装下为cgroup提供多种行为控制
hierarchy:cgroup的集合

kernel的源代码中:
挂载目录,也就是cgroup的根目录用数据结构struct cgroupfs_root表示;
cgroup用struct cgroup表示;

借一张网上的图片



源码:
lxc_为前缀的函数/数据结构,都表示是在container内部的操作/数据定义


src/lxc/Cgroup.c

get_cgroup_mount():将指定subsystem挂接到cgroup所在目录(固定为:/proc/mounts)
-->get_init_cgroup():获取初始化的cgroup信息(路径)?
     当入参没有指定时,返回固定值:/proc/1/cgroup中的第一个entry


lxc_attach_proc_to_cgroups()
-->lxc_cgroup_path_get():用subsystem+cgroup构成path返回
-->lxc_cgroup_attach():往tasks列表中加入pid


lxc_cgroup_destroy()
-->lxc_one_cgroup_destroy():
-->get_init_cgroup():
-->recursive_rmdir():只是将get_init_cgroup()的输出递归删除


lxc_cgroup_create():对每一个mount的cgroup,加入到container中
-->lxc_one_cgroup_create():对指定subsystem,把cgroup加入到container中

src/lxc/Start.c
由src/lxc/lxc_start.c在其main()中调用:
-->lxc_start():
-->lxc_check_inherited():失败则返回(到/proc/self/fd中根据配置要求,关闭fd)
-->__lxc_start():实际执行clone
-->lxc_init():初始化container,返回一个lxc_handler结构体handler
-->lxc_spawn():返回handler->pid
-->lxc_clone():clone
-->lxc_poll():登记该container(用epoll实现)
-->while(waitpid(handler->pid,....)):
-->out_fini:清理过程1,return
-->lxc_cgroup_destroy():
-->lxc_fini():设置状态STOPPING/STOPPED,清理lxc_poll()的注册,free数据
-->out_abort:清理过程2,return
-->lxc_abort():

lxc_spawn():
-->lxc_sync_init():socketpair():创造一对未命名的、相互连接的UNIX域套接字
(后续由lxc_sync_fini()关闭)
-->if(需要设置网络),失败则lxc_sync_fini()并return
-->lxc_find_gateway_addresses():
-->lxc_create_network():
-->lxc_clone():在新namespace下


lxc_abort():
-->lxc_set_state():设置为ABORTING
-->kill:杀进程

src/lxc/Namespace.c
lxc_clone()
-->do_clone():调用linux的clone()函数:
点击(此处)折叠或打开
  1. int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);

  2. vfork是fork的部分过程,用以简化并提高效率。
  3. fork是进程资源的完全复制,包括进程的PCB、进程的系统堆栈、进程的用户空间、进程打开的设备等。
  4. clone中其实只有前两项是被复制了的,后两项都与父进程共享,共享数据的保护必须由上层应用来保证



src/lxc/Network.c
这块涉及细节比较多,暂空

src/lxc/Lxc_xxx.c
都是lxc工具的实现,
main()
-->lxc_arguments_parse()
-->lxc_log_init()
-->和工具自身特性有关的调用
src/lxc/Lxc_freeze.c和src/lxc/Lxc_unfreeze.c
向container的 freezer.state 文件中写入FROZEN和THAWED(旧版是RUNNING)


src/lxc/Lxc-xxx.in
与src/lxc/Lxc_xxx.c类似,不过是shell的实现
阅读(4841) | 评论(0) | 转发(0) |
0

上一篇:常用开源软件/工具

下一篇:lxc操作和说明

给主人留下些什么吧!~~