前言
开源之夏容器化的申请书,写了,没交上,发出来,做个交流参考。应该有不少暴论的地方,各位多多批评。
项目实现
Namespace
总览
namespace会加入到dragonos中。由于它与内核各个模块紧密联系,启用后绝大部分行为都与ns相关,启动时也需要添加namespace的启动。
所有其他的namespace应当挂靠在user namespace下,这是因为user namespace具有管理其他namespace的capability。process control block将会增加一些指向对应的namespace的指针,具体的实现根据各个子系统进行修改。
考虑到开发时间,开发将会分别实现各个namespace,最后再在user namespace中进行整合。
在下列叙述中,使用ns代替单词namespace。同时,各个子部分的更改都将会伴随着对procfs和sysfs等的更改,因为会改变它们映射的方式。
直接关联的syscall
- clone,新进程,创建并加入新ns
- setns,已有进程,加入已有的ns
- unshare,已有的进程,创建并加入新的ns
- 各个子系统的对应的syscall也要发生对应的更改。具体参考下列叙述。
与procfs等fs的关联
- ns的相关内容将被映射到/proc/<pid>/ns/*下。需要更改register_pid方法,向其中添加ns的映射,同时,也需要对pidns进行更改。
- sysfs也需要绑定新的kobj的映射。
UTS Namespace
指定主机名,主要是几个字符串,需要对process/syscall.rs下的PosixOldUtsName进行些改造,并设立uts_ns来管理它,其中写死的uname会被一个全局的utcns实例代替。uname查询时需要到对应的utsns中得到。
Mount Namespace
需要实现的feature
- 文件系统目录隔离。即不同的mntns持有不同的inode tree。
- 传播。在新建挂载时,需要根据mount namespace的选项(MS_*),判断当前mount是否传播到peer group中。
- chroot。根目录将不再是全局的,改变为mntns相关的。借助mount namespace,各个进程可以具有不同的root节点,这需要对vfs的ROOT_INODE()进行更改,让其返回当前进程(或线程等)关联的ns的。同时,实现sys_chroot。
与MountFS的结合
- 在mountfs的inode中可以建立boardcast关系。
- 将DirEntry对象扩展到MountFS来判断可见性。
Pid Namespace
映射一个新的pid分配表到其父亲分配表,具有两个主要部件,pid分配器,和子pid ns映射。前者分配和回收pid,后者将子ns中的pid映射到父亲分配表中的对应pid。
在所有涉及pid的syscall操作中,得到的pid都将会是当前process对应的pidns中的pid。
Net Namespace
feature
- 隔离网络设备,将socket等挂在netns下。比如现在一把锁锁住的socket_set。同时已经在其他netns使用的设备不应该被其他netns发现。
- 实现veth设备,完成两个netns间的通信。简单实现的话,该设备应当和pipe类似,但需要主动向读端发出中断。
Cgroup Namespace
管理各个cgroup,在该命名空间下,各个cgroup树(或根目录)彼此间可以隔离开来,具体实现需要在cgroup实现完成后。
User Namespace
feature
- 前置feature是用户,用户组,和用户的权限控制(Dragonos的内核中暂时没有类似的功能,实现需要从0到1)。
- 控制用户的可见性,也需要向上级userns映射uid和gid。
Control Group
总览
各个子系统中会实现对应资源的子controller,该controller可能可以将资源调度事件委派到它的子control中,比如在task调度时,调度器同时调度子scheduler和task,子controller被调度后触发它自身的调度过程。
描述层次关系的cgroupcore会分别注册各个controller,该core对象会直接和cgoupns交互。
期望实现的功能列表
- cpu,cpu最大使用量及相关,见上述例子。
- memory,需要堆分配器的配合,分配页面的行为在内核初始化后需要监视器。
- io,建立全局的io读写行为池,添加sheduler。
- freezer。
Net和device相关
从参考的文档中,一种可能的实现方法是提供和linux cgroup v1相近的_net_prio_等,另一种就是另一个项目的ebpf了。需要根据进度考虑。
验证程序
该验证程序利用namespace和cgroup等实现的机制对应的syscall,提供一个小型的容器化环境,只有dragonos的runtime。可以在其中运行dragonos已经移植的程序。
需要注意各项资源是否分配正常,应当还需要一些检测手段,可以在容器的内部sysfs和procfs中读取,并与容器外互相印证。