一、linux namespace 介绍
1.1、概念
Linux Namespace是Linux内核提供的一种机制,它用于隔离不同进程的资源视图,使得每个进程都拥有独立的资源空间,从而实现进程之间的隔离和资源管理。
Linux Namespace的设计目标是为了解决多个进程之间资源冲突的问题,提供一种轻量级的虚拟化技术。通过使用Namespace,可以在一个物理主机上创建多个独立的虚拟环境,每个环境都有自己的进程、文件系统、网络和用户视图。其提供了一种抽象机制,将原本全局共享的资源隔离成不同的集合,集合中的成员独享其原本全局共享的资源。如下图:
进程 A 和进程 B 分别属于两个不同的 Namespace,那么进程 A 将可以使用 Linux 内核提供的所有 Namespace 资源:如独立的主机名,独立的文件系统,独立的进程编号等等。同样地,进程 B 也可以使用同类资源,但其资源与进程 A 使用的资源相互隔离,彼此无法感知。
从用户的角度来看,每一个命名空间应该像一台单独的 Linux计算机一样,有自己的 init进程 (PID为 1),其他进程的PID依次递增, A和B空间都有PID为l的init进程, 子命名空间的进程映 射到父命名空间的进程上,父命名空间可以知道每一个子命名空间的运行状态,而子命名空间与子命名空间之间是隔离的。
1.2、虚拟化相关概念
1.2.1、常见的进程级虚拟化技术:
-
chroot(Change Root)
:chroot
是一种将进程的根目录修改为指定目录的技术。它通过限制进程的文件系统访问范围,使得进程只能在指定的目录树中运行。这样可以实现一定程度的进程隔离。 -
Linux容器(Linux Containers,LXC)
:LXC
是一种操作系统级虚拟化技术,它使用Linux内核中的命名空间(namespaces)
和控制组(cgroups)
等特性,实现了对进程的隔离。通过创建和管理多个容器实例,每个容器都拥有自己的文件系统、网络和进程空间,可以实现进程级别的隔离和资源控制。 -
Docker
:Docker是基于LXC的一层封装,提供了更高级别的容器管理和部署工具。它通过使用镜像(Images)和容器(Containers)的概念,使得应用程序的打包、分发和部署更加方便。Docker在LXC的基础上添加了一些额外的功能和工具,使得容器的使用更加简单和高效。 -
systemd-nspawn
:systemd-nspawn
是Systemd
项目中的一个工具,它基于Linux命名空间和chroot,提供了一个简单的容器环境。它可以启动一个进程并将其隔离在一个独立的文件系统环境中,实现了进程的隔离和资源控制。
1.2.2、常见linux 虚拟化技术
完全虚拟化(Full Virtualization):
完全虚拟化技术通过在物理硬件上运行一个虚拟机监视器(Hypervisor)
,来模拟一个完整的虚拟硬件环境。在完全虚拟化中,虚拟机操作系统不需要进行修改,可以运行未经修改的操作系统。代表产品有:
KVM(Kernel-based Virtual Machine)
:KVM是一个开源的完全虚拟化解决方案,它基于Linux内核提供了虚拟化的能力。KVM使用QEMU(Quick Emulator)
作为虚拟机监视器,并通过硬件虚拟化扩展(如Intel的VT-x
和AMD的AMD-V
)提供硬件加速。
半虚拟化(Para-virtualization):
半虚拟化技术在虚拟机内部对操作系统进行修改,使其能够与虚拟化层进行通信和协作,从而提高性能和效率。代表产品有:
Xen
:Xen
是一个开源的半虚拟化解决方案,它可以在不修改操作系统的情况下运行虚拟机。Xen使用一种称为"Xen插入式内核"的方法,通过修改操作系统内核,使其与Hypervisor
进行通信,实现半虚拟化。
容器虚拟化(Containerization):
容器虚拟化技术通过在操作系统级别创建隔离的容器实例,实现应用程序和依赖的隔离。容器共享操作系统内核,因此比虚拟机更轻量级和高效。代表产品有:
- Docker:Docker是一种流行的容器化平台,它使用容器镜像(Images)来打包应用程序及其依赖,并通过Docker引擎在宿主机上运行容器实例。Docker提供了方便的构建、分发和部署工具,使得容器的使用变得简单和高效。
- LXC(Linux Containers):LXC是一种轻量级的容器化解决方案,它利用Linux内核中的命名空间(namespaces)和控制组(cgroups)等特性,实现了对进程的隔离。LXC提供了一个容器运行时环境,可以在其中运行独立的用户空间实例。
硬件辅助虚拟化(Hardware-assisted Virtualization):
硬件辅助虚拟化技术利用物理处理器中的虚拟化扩展,如Intel的VT-x和AMD的AMD-V,提供对虚拟化的硬件支持,提高虚拟机的性能和效率。上述的KVM和Xen也是硬件辅助虚拟化的解决方案。
轻量级虚拟化(Lightweight Virtualization):
轻量级虚拟化技术是一种特殊形式的虚拟化,它通过在操作系统级别利用命名空间(namespaces)和控制组(cgroups)等特性,实现对进程的隔离和资源控制。代表产品有:
- Docker:除了作为容器化平台,Docker也提供了一种轻量级的虚拟化方式。Docker容器可以在宿主机上以独立的进程运行,具有隔离的文件系统、网络和进程空间。
1.3、linux namespace 发展历史
Linux Namespace的发展历史可以追溯到2002年,最早是由Eric W. Biederman提出并实现。
以下是Linux Namespace的主要发展历程:
- 2002年:最早的Linux Namespace实现由Eric W. Biederman在2.4内核版本中引入,包括
Mount Namespace
和UTS Namespace
。 - 2006年:Eric W. Biederman和Serge E. Hallyn在2.6.24版本中引入
PID Namespace
,允许每个Namespace拥有独立的进程ID空间。 - 2008年:Eric W. Biederman和Serge E. Hallyn在2.6.29版本中引入
Network Namespace
,实现了独立的网络隔离。 - 2013年:Docker公司推出了Docker容器平台,基于Linux Namespace和Cgroups实现了轻量级的容器虚拟化技术,引发了容器技术的热潮。
- 2016年:Linux Kernel 4.6版本中引入了
IPC Namespace
和User Namespace
,分别实现了进程间通信和用户隔离。 - 2017年:Linux Kernel 4.11版本中引入了
CGROUP Namespace
,允许每个Namespace拥有独立的资源限制。
随着时间的推移,Linux Namespace逐渐成为Linux内核中的重要特性,为容器化技术的发展提供了基础。它提供了一种灵活且轻量级的隔离机制,使得可以在单个主机上创建多个独立的虚拟环境,实现了资源的隔离和管理。
1.4、linux namespace 作用
Linux Namespace的作用包括:
- 进程隔离:Linux Namespace可以将不同进程隔离开,每个进程在自己的Namespace中运行,不受其他进程的影响,具有独立的进程视图。
- 文件系统隔离:通过Mount Namespace,每个进程可以拥有自己的文件系统挂载点,实现文件系统的隔离。
- 网络隔离:通过Network Namespace,每个进程可以拥有独立的网络设备、IP地址、路由表和防火墙规则,实现网络的隔离。
- 进程间通信隔离:通过IPC Namespace,实现进程间通信(IPC)的隔离,使得不同的进程在不同的Namespace中无法直接通信。
- 用户和用户组隔离:通过User Namespace,每个进程可以拥有独立的用户和用户组视图,从而实现用户和用户组的隔离。
- 进程资源限制:通过PID Namespace和CGROUP Namespace,可以限制进程的资源使用,如CPU、内存、磁盘IO等,实现资源的管理和隔离。
通过使用Linux Namespace,可以在一个物理主机上创建多个独立的虚拟环境,每个环境都有自己的进程、文件系统、网络和资源限制,从而实现进程间的隔离和资源管理,提高系统的安全性和性能。
二、namespace 的主要函数
三、namespace 分类
四、namespace 声明周期
五、namespace API
参考文档
1、https://blog.csdn.net/y3over/article/details/128863060
2、https://www.cnblogs.com/sally-zhou/p/13398260.html
3、http://www.taodudu.cc/news/show-320037.html?action=onClick
4、http://www.360doc.com/content/21/0803/11/31115656_989326901.shtml