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()函数:
点击(此处)折叠或打开
- int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);
- vfork是fork的部分过程,用以简化并提高效率。
- fork是进程资源的完全复制,包括进程的PCB、进程的系统堆栈、进程的用户空间、进程打开的设备等。
- 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的实现
阅读(5699) | 评论(0) | 转发(0) |