搜索
写经验 领红包
 > 娱乐

liuxamespace详解(liuxamespace包含哪些类型)

导语:Linux Namespace 介绍(概念篇)

我们经常听到,Docker是一个使用了Linux Namespace和Cgroups的虚拟化工具。但是,什么是Linux Namespace,它在Docker内是怎么被使用的?说到这里,很多人就会迷茫。下面来的几篇文章就来介绍一下Linux Namespace以及它们是如何在容器中使用的。

Linux Namespace是Kernel的一个功能,它可以隔离一系列的系统资源,比如PID、User ID、Network等。一般看到这里,很多人会想到一个命令chroot,就像chroot允许把当前目录变成根目录一样(被隔离开来),Namespace 也可以在一些资源上,将进程隔离起来,这些资源包括进程树、网络接口、挂载点等。

比如,一家公司向外界出售自己的计算资源。公司有一台性能还不错的服务器,每个用户买到一个tomcat实例用来运行他们自己的应用。有些调皮的客户可能不小心进入了别人的tomcat实例,修改或关闭了其中的某些资源,这样就会导致各个客户之间的互相干扰。也许你会说,我们可以限制不同用户的权限,让用户只能访问自己名下的tomcat实例,但是,有些操作可能需要系统级别的权限,比如root权限。我们不可能给每个用户都授予root权限,也不可能给每个用户都提供一台全新的物理主机让他们互相隔离。因此,Linux Namespace在这里就派上了用场。使用Namespace,就可以做到UID级别的隔离,也就是说,可以以UID为n的用户,虚拟化出来一个Namespace,在这个Namespace里面,用户是具有root权限的。但是,在真实的物理机器上,他还是那个以UID为n的用户,这样就解决了用户之间隔离的问题。当然这只是Namespace其中的一个简单功能。

去了User Namespace,PID也是可以被虚拟的。命名空间建立系统的不同视图,从用户的角度来看,每一个命名空间应该像一台独立的Linux计算机一样,有自己的init进程(PID为1),其他进程的PID一次递增,A和B空间都有PID为1的init进程,子命名空间的进程映射到父命名空间的进程上,父命名空间可以知道每一个子命名空间的运行状态,而子命名空间与子命名空间之间是隔离的。从下图所示的PID映射关系图中可以看到,进程3在父命名空间中的PID为3,但是在子命名空间内,它的PID就是1。也就是说用户从子命名空间A内看进程3就像init进程一样,以为这个进程是自己的初始化进程,但是从整个host来看,它其实只是3号进程虚拟化出来的一个空间而已。

当前Linux一共实现了6种不同类型的Namespace。

Namespace类型

系统调用参数

内核版本

Mount Namespace

CLONE_NEWNS

2.4.19

UTS Namespace

CLONE_NEWUTS

2.6.19

IPC Namespace

CLONE_NEWIPC

2.6.19

PID Namespace

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()将进程加入到Namesapce中。

本文内容由小冰整理编辑!