"criu dump重要步骤十"

  "进程备份步骤收尾阶段"

Posted by Xu on July 3, 2017

CRIU,DUMP备份重要步骤十

通过五~九步骤对单节点进程信息备份进行解析,完成了整个备份过程中最复杂也是最耗时的一步操作,通过对进程树每个节点的遍历及备份保存实现对整个进程树的备份保存。这一段源码阅读经历让我更加深刻理解linux内核的原理,构建了对linux文件系统初步的微观认识。我想这对于我以后深入了解linux内核会很有帮助。

今天我们进入第二个阶段(备份阶段)的第二~六个重要步骤:对mnt_namespace命名空间的备份:dump_mnt_namespaces…

  int dump_mnt_namespaces(void)
{
	struct ns_id *nsid;

	if (!(root_ns_mask & CLONE_NEWNS))
		return 0;

	for (nsid = ns_ids; nsid != NULL; nsid = nsid->next) {
		if (nsid->nd != &mnt_ns_desc || nsid->type == NS_CRIU)
			continue;

		if ((nsid->type == NS_OTHER) && check_mnt_id()) {
			pr_err("Nested mount namespaces are not supported "
				"without mnt_id in fdinfo\n");
			return -1;
		}
        //首先以保存命名空间信息的全局变量ns_ids为入口遍历匹配得到mnt命名空间的信息,然后进行dump_mnt_ns备份,该备份操作就是遍历nsid->mnt.mntinfo_list将每一个mount_info节点的信息写入镜像保存,该mnt.mntinfo_list是在命名空间信息收集阶段collect_mnt_namespaces收集mnt命名空间的信息到该链表中保存的,如今写入镜像文件保存即可
		if (dump_mnt_ns(nsid, nsid->mnt.mntinfo_list))
			return -1;
	}

	return 0;
}

对文件锁信息的备份:同样也是根据前面收集文件锁的的过程中收集到的信息存放到全局变量file_lock_list,再依据该全局变量将每个文件锁信息写入镜像保存

对进程树的备份:遍历每一个进程树节点将之前收集到的线程等信息写入镜像结构体保存到镜像文件

对Cgroup信息的备份:即遍历之前收集Cgroup信息阶段保存到全局变量cg_sets链表和cgroups控制器链表写入镜像文件保存

至此,进程备份操作的重要步骤的源码已经全部解析完毕,接下来,进入实验阶段,尝试恢复进程,总结实验中出现的问题。