Linux中虚拟化技术——Namespace
前言
最近在使用虚拟化容器的相关知识,容器技术确实改变了传统系统的部署和运维方式,方便进行敏捷开发与测试。在感叹之余,不仅对其后的技术有些好奇。进一步了解后发现其中利用了Linux的虚拟化技术——Namespace。
什么是虚拟化
虚拟化是指在一台服务器或主机上可以满足多个用户同时进行操作而互相不受影响。这个类似与我们平时的应用软件,但又有些不同,主要区别是应用软件所需的权限有限制,而我们虚拟化的平台是允许用户一些特权操作的,再有就是虚拟化平台的隔离是多方面的隔离,包括用户隔离、硬件资源隔离、网络隔离等。但其最终都需要Linux内核的支持。
Namespace的出现
Namespace的出现可以解决虚拟化过程中用户隔离的问题。它也是Linux内核中一个重要的功能,同时它也随Linux内核的升级而逐渐完善。正如其名在Namespace虚拟空间中,每个用户都相当与一个root(超级管理员)可以对系统进行设置和管理,而从系统的整体看,其也是整个系统中的一个进程,它们都共享系统内核和物理资源。这就是使用Namespace做虚拟化是轻量级的原因。
根据版本不同Linux内核对Namespace的支持也不太一样,但主要的Namespace有这些:
Namespace类型 | 系统调用参数 | 内核版本 |
---|---|---|
Mount Namespace | CLONE_NEWNS | 2.4.19 |
UTS Namespace | CLONE_NEWUTS | 2.6.19 |
IPC Namespace | CLONE_NEWIPC | 2.6.19 |
PID Namespce | CLONE_NEWPID | 2.6.24 |
Network Namespace | CLONE_NEWNET | 2.6.29 |
User Namespace | CLONE_NEWUSER | 3.8 |
其中Namespace的API主要使用了3个系统调用。
- clone()创建新进程,根据系统调用参数来判断哪些类型的Namespace被创建,而它们的子进程也会被包含到这些Namespace中。
- unshare()将进程移出某个Namespace。
- setns()将进程加入到某个Namespace中。
Mount Namespace
Mount Namespace 用来隔离各个进程看到的挂载点视图。在不同的Namespace空间中,看到的文件系统层次是不一样的。在Mount Namespace中调用mount()和unmount()只会对当前Namespace内的文件系统有影响,不会对全局的文件系统产生影响。
UTS Namespace
UTS Namespace主要隔离nodename和domainname两个系统标识。在UTS Namespace里面,每个Namespace允许有自己的hostname。
IPC Namespace
IPC Namespace用来隔离System V IPC和POSIX message queues。在每个IPC Namespace中都有自己的System V IPC和POSIX message queue。
PID Namespace
PID Namespace 是用来隔离进程ID的,同样一个进程在不同的PID Namespace里可以拥有不同的PID。
Network Namespace
Network Namespace是用来隔离网络设备、IP地址端口等网络栈的Namespace。Network Namespace 可以让容器拥有自己独立虚拟网络设备,而且容器内的应用可以绑定自己的端口,每个Namespace内的端口不会互相冲突。在宿主机上搭建网桥后,就能很方便地实现容器之间的通信,而且不同容器上可以使用相同的端口。
User Namespace
User Namespace主要是隔离用户的用户组ID。一个进程的User ID和Group ID在User Namespace内外可能是不同的。
总结
Docker等虚拟化容器就是利用了Linux内核的Namespace技术来实现用户隔离的,现在总结出大概知识点,具体的应用还需要具体的场景进行分析。