最近Docker技术越来越受到关注,作为Docker中很重要的一项技术,Namespace也就经常在Docker的简介里面看到。 在这里总结一下它的内部机制。也解决一下自己原来的一些疑惑。
首先,先提一下Namespace是什么。最早知道这个名词是在学习C++语言的时候。由于现在的系统越来越复杂,代码中不同的模块就可能使用相同变量,于是就出现了Namespace,来对全局作用域进行划分。
比如C++的标注库都定义在STD Namespace中,需要使用时,就可以指定STD Namespace。当我们写一个类,类函数也需要使用namespace来指明这是属于哪一个类的函数。
Linux Namespaces是一种轻量级的虚拟化形式。操作系统在内存,CPU上,已经使用了虚拟化的技术,让每个进程都认为是自己独占了内存和CPU。但像存储,磁盘,信号等,一些资源,操作系统并没有将其隔离开。
namespace则是将这类资源也隔离开来。使得进程只能看到自己的资源视图。这个功能加上Cgroup,就可以实现一个轻量级的虚拟机。这对于提高主机资源利用率很有用。如果说KVM这类虚拟机是为了隔离,而容器技术更多是为了共享。
对于内核来说,进程是由task_struct结构体来控制。所以Namespace肯定会和task_struct有关联。在task_struct中,定义了一个nsproxy的结构体指针。
struct task_struct {
......
/* namespaces */
struct nsproxy *nsproxy;
......
}
nsproxy是定义namespace的结构体。
struct nsproxy {
atomic_t count;
struct uts_namespace *uts_ns;
struct ipc_namespace *ipc_ns;
struct mnt_namespace *mnt_ns;
struct pid_namespace *pid_ns;
<strong>struct</strong> user_namespace *user_ns;
struct net *net_ns;
};
init_nsproxy是和task一起初始化的。除了mnt_ns 没有进行初始化,其余的namespace都进行了系统默认初始化。
如果要进程有独立的Namespace,可以使用系统调用clone().使用flag标记来设置
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg)
当然,这个函数并非系统调用,这是glibc的函数。内核中真正工作的是do_fork函数。 do_fork函数会调用copy_process函数,在进行flag检查之后,里面会调用copy_namespaces. 这个函数会给task初始化一个新的nsproxy,然后对nsproxy里面的每个namespace结构体进行创建。
int copy_namespaces(unsigned long flags, struct task_struct *tsk);
在刚开始用docker时,发现可以使用docker exec 来进入一个运行中的容器,对其操作。 如果是Cgroup,只需要找到对应挂在目录,echo进程pid到tasks里即可。但Namespace现在还没有这种设计。 另外,要进入一个已知的namespace还需要一个标识。不然,进入哪个Namespace呢。
/proc/[pid]/ns
这个时候,Linux一切皆文件的设计就体现出了它的优势。我们可以直接通过proc中的ns文件来获取这个Namespa的标示。Cgroup的设置也能通过proc中的文件看出。
int setns(int fd, int nstype);
Linux内核的namespace机制分析 Namespaces in operation, part 1: namespaces overview Docker基础技术:Linux Namespace(上) Docker基础技术:Linux Namespace(下)
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有