1.Linux Namespace

namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共 用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个 进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,目前主要通过 以下8种技术实现容器运行空间的相互隔离.

目前,Linux已经支持8种全局资源的虚拟化(每种资源都是随着Linux内核版本的迭代而逐渐加入的,因此有些内核版本可能不具备某种namespace):

  • cgroup namespace:该namespace可单独管理自己的cgroup

  • ipc namespace:该namespace有自己的IPC,比如共享内存、信号量等

  • network namespace:该namespace有自己的网络资源,包括网络协议栈、网络设备、路由表、防火墙、端口等

  • mount namespace:该namespace有自己的挂载信息,即拥有独立的目录层次

  • pid namespace:该namespace有自己的进程号,使得namespace中的进程PID单独编号,比如可以PID=1

  • time namespace:该namespace有自己的启动时间点信息和单调时间,比如可设置某个namespace的开机时间点为1年前启动,再比如不同的namespace创建后可能流逝的时间不一样

  • user namespace:该namespace有自己的用户权限管理机制(比如独立的UID/GID),使得namespace更安全

  • uts namespace:该namepsace有自己的主机信息,包括主机名(hostname)、NIS domain name

2.1mount namespace

提供磁盘挂载点和文件系统的隔 离: a.每个容器都要有独立的根文件 系统有独立的用户空间,以实 现在容器里面启动服务并且使 用容器的运行环境,即一个宿 主机是ubuntu的服务器,可以 在里面启动一个centos运行环 境的容器并且在容器里面启动 一个Nginx服务,此Nginx运行 时使用的运行环境就是centos 系统目录的运行环境,即在容 器里面是不能直接访问宿主机 的文件系统。 b. 宿主机是使用了chroot技术把 容器锁定到一个指定的运行目录里面并作为容器的根运行环境。

2.2ipc namespace

提供进程间通信的隔离,IPC namespce隔离进程间通信资源(同一个IPC namespace的进程可实现内 存等资源共享,但是不同的 IPC namespace则严格隔离).
2.3uts namespace
    主机名隔离,UTS namespace(UNIX Timesharing System包含了运行 内核的名称、版本、底层体系结
构类型等信息)用于系统标识, 其中包含了hostname 和域名 domainname ,它使得一个容
器拥有属于自己hostname标 识,这个主机名标识独立于宿主 机系统和其上的其他容器。
2.4pid namespace
    进程隔离,Linux系统中,有一个PID为1的进程(init/systemd)是其他所有进程的父进程,那么在每个容器内也要有一个父进程来管理其下属的子进程,那么多个容器的进程通PID namespace进程隔离(比如PID编号重复、器内的主进程生成与回收子进程等)。
2.5network namespace
网络隔离,每一个容器都类似于虚拟机一样有自己的网卡、监听端口、TCP/IP协议栈等,docker使用network namespace启动一个vethX接口,这样你的容器将拥有它自己的桥接ip地址,通常是docker0,而docker0 实质就是Linux的虚拟网桥,网 桥是在OSI七层模型的数据链 路层的网络设备,通过mac地址对网络进行划分,并且在不同网络直接传递数据。
2.6 user namesapce
用户隔离,各个容器内可能会出现重名的用户和用户组名称,或重复的用户UID或者GID,那么怎么隔离各个容器内的用户空间呢?

     User Namespace允许在各个宿 主机的各个容器空间内创建相同的 用户名以及相同的用户UID和
GID,只是会把用户的作用范围限 制在每个容器内,即A容器和B容 器可以有相同的用户名称和ID的账 户,但是此用户的有效范围仅是当 前容器内,不能访问另外一个容器 内的文件系统,即相互隔离、互不 影响。
3.namespace 主要api

clone()

系统调用 clone() 创建一个新的进程,它会根据参数中的 CLONE_NEW* 设置,逐个实现对应的配置功能。当然这个系统调用也实现了一些与 namespace 无关的功能。对低于 Linux 3.8 版本内核的系统而言,大多数情况下, 需要具备 CAP_SYS_ADMIN 的 capability。

unshare()

系统调用 unshare()  将进程分配至新的 namespace ,同样,它也会根据参数中的 CLONE_NEW* 设置来调整实现对应的配置功能。对低于 Linux 3.8 的系统而言,大多数情况,需要具备 CAP_SYS_ADMIN 的 capability。

setns()

系统调用 setns() 将进程移动到某一已存在的 namespace,这会导致 /proc/[pid]/ns 对应的目录中内容的变更。进程创建的子进程可以通过调用 unshare() 和 setns() 来调整所属的 namespace。这通常是需要具备 CAP_SYS_ADMIN 的 capability 的。

4.部分重点目录

4.1./proc/[pid]/ns/ 目录

每个进程都有一个 /proc/[pid]/ns/ 子目录,目录中的内容会受到 setns() 系统调用的影响。只要目录中的文件被打开,对应的 namespace 就不能被销毁。系统可以通过调用 setns() 来变更这些文件内容。

  • Linux 3.7 及更早期的版本 - 文件是以硬链接方式存在的;

  • Linux 3.8 开始 - 文件以软连接的方式存在;

如果两个进程的 namespace 相同,那么它们这个目录内的内容应该是一样的。

以下是该目录下文件的详细说明:

文件名称 起始版本 描述
/proc/[pid]/ns/cgroup Linux 4.6 进程的 cgroup namespace
/proc/[pid]/ns/ipc Linux 3.0 进程的 IPC namespace
/proc/[pid]/ns/mnt Linux 3.8 进程的 mount namespace
/proc/[pid]/ns/net Linux 3.0 进程的 network namespace
/proc/[pid]/ns/pid Linux 3.8 进程的 PID namespace在进程的整个生命周期里是不变的
/proc/[pid]/ns/pid_for_children Linux 4.12 进程创建子进程的 PID namespace这个文件与 /proc/[pid]/ns/pid 不一定一致。
/proc/[pid]/ns/time Linux 5.6 进程的 time namespace
/proc/[pid]/ns/time_for_children Linux 5.6 进程创建子进程的 time namespace
/proc/[pid]/ns/user Linux 3.8 进程的 user namespace
/proc/[pid]/ns/uts Linux 3.0 进程的 UTS namespace

4.2./pro/sys/user 目录

/proc/sys/user 目录下的文件记录了各 namespace 的相关限制。当达到限制,相关调用会报错 error ENOSPC 。

文件名称 限制内容说明
max_cgroup_namespaces 在 user namespace 中的每个用户可以创建的最大 cgroup namespaces 数
max_ipc_namespaces 在 user namespace 中的每个用户可以创建的最大 ipc namespaces 数
max_mnt_namespaces 在 user namespace 中的每个用户可以创建的最大 mount namespaces 数
max_net_namespaces 在 user namespace 中的每个用户可以创建的最大 network namespaces 数
max_pid_namespaces 在 user namespace 中的每个用户可以创建的最大 PID namespaces 数
max_time_namespaces Linux 5.7在 user namespace 中的每个用户可以创建的最大 time namespaces 数
max_user_namespaces 在 user namespace 中的每个用户可以创建的最大 user namespaces 数
max_uts_namespaces 在 user namespace 中的每个用户可以创建的最大 uts namespaces 数

5.namespace 的生命周期

正常的 namespace 的生命周期与最后一个进程的终止和离开相关。

但有一些情况,即使最后一个进程已经退出了,namespace 仍不能被销毁。这里来稍微聊下这些特殊的情况:

  • /proc/[pid]/ns/* 中的文件被打开或者 mount ,即使最后一个进程退出,也不能被销毁;

  • namespace 存在分层,子 namespace 仍存在 ,即使最后一个进程退出,也不能被销毁;

  • 一个 user namespace 拥有一些非 user namespace (比如拥有 PID namespace 等其他的 namespace 存在),即使最后一个进程退出,也不能被销毁;

  • 对于 PID namespace 而言,如果与 /proc/[pid]/ns/pid_for_children  存在关联关系时,即使最后一个进程退出,也不能被销毁;

当然除此之外还有一些其他的情况,基本都是存在被占用或未被释放。

linux namespace的概述相关推荐

  1. Linux namespace概述

    操作系统通过虚拟内存技术,使得每个用户进程都认为自己拥有所有的物理内存,这是操作系统对内存的虚拟化.操作系统通过分时调度系统,每个进程都能被[公平地]调度执行,即每个进程都能获取到CPU,使得每个进程 ...

  2. 【网址收藏】linux namespace和cgroup

    namespace 包含了Linux目前常用的6个namespace的介绍 Linux Namespace系列(01):Namespace概述 Linux Namespace系列(02):UTS na ...

  3. 自动驾驶QNX,Linux,Autosar概述

    自动驾驶QNX,Linux,Autosar概述 QNX是一个分布式.嵌入式.可规模扩展的实时操作系统.遵循POSIX.1 (程序接口)和POSIX.2 (Shell和工具).部分遵循POSIX.1b( ...

  4. Docker基础技术:Linux Namespace【上】

    点点收获: //之前发现Coolshell上好久不更新了, 博主果然去搞大业去了,只恨这几篇文章看到太晚了啊~太厉害了. 1.  clone(), unshare(), setns()初识; 主要是š ...

  5. 资源隔离之 Linux namespace

    Linux namespace 简称 ns,在 2002 年 2.4.19 内核中被引入,发展到今天已经有 15 个年头了. 2010 年后国内云计算爆发,紧接着 2013 年 Docker 崛起,n ...

  6. Linux下进程间通信概述

    1. Linux下进程间通信概述 P83-P84 将第一页和第二页合并起来讲了 引言:前面我们学习了一下进程,我们知道多,进程间的地址空间相对独立.进程与进程间不能像线程间通过全局变量通信. 如果想进 ...

  7. c++ namespace和linux namespace

    一.c++中的namespace 在C++语言中,命名空间使用namespace来声明,并使用{ }来界定命名空间的作用域.命名空间可以是全局的,也可以位于另一命名空间之中:但不能在类和代码块之中.按 ...

  8. Docker 基础技术之 Linux namespace 源码分析

    上篇我们从进程 clone 的角度,结合代码简单分析了 Linux 提供的 6 种 namespace,本篇从源码上进一步分析 Linux namespace,让你对 Docker namespace ...

  9. linux namespace 工具,Linux Namespace : 简介

    文章简单的介绍下 linux namespace 的概念以及基本用法. namespace 是 Linux 内核用来隔离内核资源的方式.通过 namespace 可以让一些进程只能看到与自己相关的一部 ...

最新文章

  1. php程序设计依赖注入_PHP控制反转和依赖注入
  2. loadrunner socket协议问题归纳(5)
  3. aspnet_Users中LastActiveDate的问题
  4. 圈钱跑路 发行自己的ERC20 Token
  5. FIFO的verilog代码
  6. 布鲁克大学计算机科学,布鲁克大学计算机科学本科.pdf
  7. python基础学习笔记——异常处理
  8. Windows SharePoint Services To Be Open Source With 2007 Microsoft Office Release
  9. 设计素材模板|艺术感中国风海报
  10. 单目相机与激光标定相关文章与代码(草稿)
  11. java图片循环_java – 如何实现无限图像循环?
  12. 实战撤回对方QQ消息+防止别人撤回消息插件演示附软件
  13. 使用slickedit调试开源代码
  14. 哈密顿图、哈密顿回路
  15. python 人脸识别活体检测_人脸识别 -- 活体检测(张嘴摇头识别)
  16. python星号怎么输入_如何将密码显示为星号
  17. 代码覆盖率、功能覆盖率分析
  18. 干货分搞私投以技术面试
  19. 为新开的餐厅设计网站html,18个以餐饮美食为主题的优秀网页设计
  20. 把数组里的字符串转换成数字或者把数字转换成字符串

热门文章

  1. CentOS如何设置DHCP为静态IP地址
  2. sqlserver里,case when和cast函数一起使用
  3. fasttext文本分类、训练词向量、词向量迁移
  4. CAD看图软件手机端有哪些功能呢?
  5. 优秀技术Leader应具备的六项能力!
  6. 旅行必备的地图,三分钟看懂方位图~
  7. 联想微型计算机c455怎么拆开,联想c455电脑怎么拆em
  8. 从源码角度理解ConstraintLayout#onMeasure对child的measure调用次数
  9. vue外卖二十:商家详情-评价列表:评价列表接口模拟-vuex获取完整数据链流程、滑动better-scroll
  10. 卧槽!​我的Python竟然会跳舞!