关于容器化的一点个人理解

前言

开源之夏容器化的申请书,写了,没交上,发出来,做个交流参考。应该有不少暴论的地方,各位多多批评。

项目实现

Namespace

总览

namespace会加入到dragonos中。由于它与内核各个模块紧密联系,启用后绝大部分行为都与ns相关,启动时也需要添加namespace的启动。

所有其他的namespace应当挂靠在user namespace下,这是因为user namespace具有管理其他namespace的capability。process control block将会增加一些指向对应的namespace的指针,具体的实现根据各个子系统进行修改。

考虑到开发时间,开发将会分别实现各个namespace,最后再在user namespace中进行整合。

在下列叙述中,使用ns代替单词namespace。同时,各个子部分的更改都将会伴随着对procfs和sysfs等的更改,因为会改变它们映射的方式。

直接关联的syscall

  1. clone,新进程,创建并加入新ns
  2. setns,已有进程,加入已有的ns
  3. unshare,已有的进程,创建并加入新的ns
  4. 各个子系统的对应的syscall也要发生对应的更改。具体参考下列叙述。

与procfs等fs的关联

  1. ns的相关内容将被映射到/proc/<pid>/ns/*下。需要更改register_pid方法,向其中添加ns的映射,同时,也需要对pidns进行更改。
  2. sysfs也需要绑定新的kobj的映射。

UTS Namespace

指定主机名,主要是几个字符串,需要对process/syscall.rs下的PosixOldUtsName进行些改造,并设立uts_ns来管理它,其中写死的uname会被一个全局的utcns实例代替。uname查询时需要到对应的utsns中得到。

Mount Namespace

需要实现的feature

  1. 文件系统目录隔离。即不同的mntns持有不同的inode tree。
  2. 传播。在新建挂载时,需要根据mount namespace的选项(MS_*),判断当前mount是否传播到peer group中。
  3. chroot。根目录将不再是全局的,改变为mntns相关的。借助mount namespace,各个进程可以具有不同的root节点,这需要对vfs的ROOT_INODE()进行更改,让其返回当前进程(或线程等)关联的ns的。同时,实现sys_chroot。

与MountFS的结合

  1. 在mountfs的inode中可以建立boardcast关系。
  2. 将DirEntry对象扩展到MountFS来判断可见性。

Pid Namespace

映射一个新的pid分配表到其父亲分配表,具有两个主要部件,pid分配器,和子pid ns映射。前者分配和回收pid,后者将子ns中的pid映射到父亲分配表中的对应pid。
在所有涉及pid的syscall操作中,得到的pid都将会是当前process对应的pidns中的pid。

Net Namespace

feature

  1. 隔离网络设备,将socket等挂在netns下。比如现在一把锁锁住的socket_set。同时已经在其他netns使用的设备不应该被其他netns发现。
  2. 实现veth设备,完成两个netns间的通信。简单实现的话,该设备应当和pipe类似,但需要主动向读端发出中断。

Cgroup Namespace

管理各个cgroup,在该命名空间下,各个cgroup树(或根目录)彼此间可以隔离开来,具体实现需要在cgroup实现完成后。

User Namespace

feature

  1. 前置feature是用户,用户组,和用户的权限控制(Dragonos的内核中暂时没有类似的功能,实现需要从0到1)。
  2. 控制用户的可见性,也需要向上级userns映射uid和gid。

Control Group

总览

各个子系统中会实现对应资源的子controller,该controller可能可以将资源调度事件委派到它的子control中,比如在task调度时,调度器同时调度子scheduler和task,子controller被调度后触发它自身的调度过程。
描述层次关系的cgroupcore会分别注册各个controller,该core对象会直接和cgoupns交互。

期望实现的功能列表

  1. cpu,cpu最大使用量及相关,见上述例子。
  2. memory,需要堆分配器的配合,分配页面的行为在内核初始化后需要监视器。
  3. io,建立全局的io读写行为池,添加sheduler。
  4. freezer。

Net和device相关

从参考的文档中,一种可能的实现方法是提供和linux cgroup v1相近的_net_prio_等,另一种就是另一个项目的ebpf了。需要根据进度考虑。

验证程序

该验证程序利用namespace和cgroup等实现的机制对应的syscall,提供一个小型的容器化环境,只有dragonos的runtime。可以在其中运行dragonos已经移植的程序。
需要注意各项资源是否分配正常,应当还需要一些检测手段,可以在容器的内部sysfs和procfs中读取,并与容器外互相印证。

2 个赞