Linux namespace 简称 ns,在 2002 年 2.4.19 内核中被引入,发展到今天已经有 15 个年头了。

2010 年后国内云计算爆发,紧接着 2013 年 Docker 崛起,ns 才作为不可或缺的一部分被重视起来。

ns 本身其实比较简单,它是 Linux 内核的一种机制,给进程隔离和虚拟化内核资源用的。

不同的进程是共享内核资源的。好比说大家住在同一个小区,虽然到家后关起门来谁都不影响谁。但公共场所就没办法了,如果有人破坏环境,那么势必会影响到其他人。

内核资源在这里就像是公共场所。ns 就是把公共场所隔离开来,你扔烟头到地上只影响你自己,其他人都看不到。这里的隔离不是说把公共场所分成几块儿,每个人分一小块儿,而是每个人都有一个和原来一样大的公共场所,就像是每个人都有一个四维空间一样,是不是有点玄乎啊。不要紧,下面会结合几个小例子来说明一下 :D。

目前有七种 ns 类型:

Linux 初始化的时候为 init 进程(进程号为1)为每个 ns 类型创建一个实例。后面其他所有进程都可以创建新的 ns 或者加入已有的 ns。

这些 ns 实例在 /proc/[pid]/ns 下面,比如说 1 号进程的 ns:
Mount ns 隔离的是挂载点挂载的是文件系统。子进程创建时(clone 时使用 CLONE_NEWNS),父进程 ns 下的所有挂载点都拷贝到子进程中,Mount ns 隔离之后,Mount Point 的创建或删除都不会在 ns 之间传播(除非 mount 时使用了shared subtree) ,妈妈在也不用担心我的挂载了呢。

使用 Docker 启动一个 Container,可以查看它的挂载,有很多和 Container 所在的 Host 的不一样,因为它内部做了新的挂载,比如说 aufs 挂载到了根目录 / 下面:
还有 PID ns,分属不同 ns 的进程下可以有相同的 PID,比如说 Host 中 PID 为 1 的进程是 init,而 Container 内 PID 为 1 的进程是 bash(Docker 启动指定的命令)。
其他几个 ns 类型,可以参考 namespaces(7) - Linux manual page 。

我之前很好奇怎么查看在 Linux 一共有多少 ns 实例,所以就写了个简单 Python 脚本 https://gist.github.com/wanzixyz/53333b15d9290dd971527d61c4ee9f0c :

#!/usr/bin/env python
#coding=utf-8import os
import re#format: pid, [namespaces], cmdline
def _get_namespace(pid):path = '/proc/{0}/ns/'.format(pid)namespaces = []for ns in os.listdir(path):namespaces.append(os.readlink(path + ns))cmdline = open('/proc/{0}/cmdline'.format(pid)).read()if not cmdline:cmdline = open('/proc/{0}/comm'.format(pid)).read()return (pid, namespaces, cmdline)SBIN_INIT = _get_namespace(1)
OUTPUT = [SBIN_INIT]for pid in [elt for elt in os.listdir('/proc/') if re.match('\d+', elt)]:output = _get_namespace(pid)if output[1] != SBIN_INIT[1]:OUTPUT.append(output)for val in OUTPUT:print '{0:>10}    {1}    {2}'.format(val[0],' '.join(val[1]),' '.join(val[2].split('\x00'))[:-1])

运行后结果如下:
1 是 init 进程,21 是 kdevtmosfs,15320 和 29739 都是 Docker 启动的 Container。

之后我又很好奇,如何才能进入到 Container(其实不算是进入,只是加入 Container 的 ns,看到和 Container 一样的视图),于是就又写了一个脚本 https://gist.github.com/wanzixyz/8dd24aa8882bb983873274a221934cbc :

#!/usr/bin/env python
#coding=utf-8import argparse
import ctypes
import osCLONE_NEWNS =        0x00020000   # /* New mount namespace group */
CLONE_NEWCGROUP =    0x02000000    # /* New cgroup namespace */
CLONE_NEWUTS =       0x04000000    # /* New utsname namespace */
CLONE_NEWIPC =       0x08000000    # /* New ipc namespace */
CLONE_NEWUSER =      0x10000000    # /* New user namespace */
CLONE_NEWPID =       0x20000000    # /* New pid namespace */
CLONE_NEWNET =       0x40000000    # /* New network namespace */parser = argparse.ArgumentParser()
parser.add_argument('--pid', type = str, help = 'process id')
args = parser.parse_args()
if not args.pid:print 'plz input pid..'exit(1)#setns
libc = ctypes.CDLL('libc.so.6')
namespace = [('ipc', CLONE_NEWIPC),('uts', CLONE_NEWUTS),('net', CLONE_NEWNET),('pid', CLONE_NEWPID),('mnt', CLONE_NEWNS),
]
for ns_type, ns_flag in namespace:fd = os.open('/proc/{0}/ns/{1}'.format(args.pid, ns_type), os.O_RDONLY)ret = libc.setns(fd, ns_flag)os.close(fd)if ret == -1:print 'libc.setns failed'exit(1)#child exec shell
pid = os.fork()
if pid != 0: #fatheros.waitpid(pid, 0)
else: #childshell = os.getenv('SHELL')os.execl(shell, os.path.basename(shell))

这里进入进程 15320 看一下:

肿么样亲,是不是很简单了呢? :D

https://zhuanlan.zhihu.com/p/25576438

资源隔离之 Linux namespace相关推荐

  1. 容器云系列之Docker容器资源隔离

    本文简要介绍了Docker容器对CPU.内存和IO等系统资源限制. 2.Docker容器资源限制 2.1 Namespace资源隔离 Docker使用Linux namespace技术实现容器间的资源 ...

  2. Docker背后的内核知识之资源隔离

    文章目录 Docker 背后的内核知识-namespace 资源隔离 1.进行namespace API操作的4种方法 2.UTS namespace 3.IPC namespace 4.PID na ...

  3. Linux 操作系统原理 — Namespace 资源隔离

    目录 文章目录 目录 Linux Namespace UTS namespace PID namespace IPC namespace Mount namespace Network namespa ...

  4. linux namespace 隔离内核资源的方式 简介

    namespace 的概念 namespace 是 Linux 内核用来隔离内核资源的方式.通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相 ...

  5. Docker背后的内核知识——Namespace资源隔离

    Docker这么火,喜欢技术的朋友可能也会想,如果要自己实现一个资源隔离的容器,应该从哪些方面下手呢?也许你第一反应可能就是chroot命令,这条命令给用户最直观的感觉就是使用后根目录/的挂载点切换了 ...

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

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

  7. Docker背后的内核知识:命名空间资源隔离

    Docker背后的内核知识:命名空间资源隔离 Docker这么火,喜欢技术的朋友可能也会想,如果要自己实现一个资源隔离的容器,应该从哪些方面下手呢?也许你第一反应可能就是chroot命令,这条命令给用 ...

  8. Docker安全之用户资源隔离

    Docker安全之用户资源隔离 docker 字母哥 18小时前 75℃ 0评论 向您推荐 Dcoker入门与实践系列文章 欢迎加入QQ技术交流群:300139299 docker进行资源隔离的6种n ...

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

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

最新文章

  1. linux signal函数用法,linux信号机制之sigaction构造体浅析,signal 函数,信号捕捉.
  2. Linux网络编程基础(二)
  3. 快速搭建基于 Serverless 的 .NET Core 数据库应用
  4. ASP.NET使用log4Net日志组件教程(按日期与按日志大小切割)
  5. 流水线技术在高速数字电路设计中的应用
  6. 小学教师计算机说课,浙江温州小学计算机教师资格认证说课稿
  7. laravel php环境,Laravel 5框架学习之环境与配置
  8. oracle——服务器同时安装服务端和客户端冲突
  9. GITC 2014全球互联网技术大会正式开始
  10. java的if判读_java if判断
  11. somachine3.1安装
  12. c++邻接表实现BFS算法遍历
  13. maya2018 + VS2017 C++编译环境搭建
  14. 不怕被群主踢,安心分享小游戏续命,上分好办法!
  15. android 连笔记本无线上网,android手机通过笔记本的网络实现无线wifi上网
  16. Python爬虫入门教程: 半次元COS图爬取
  17. CSS3炫酷模糊发光文字动画js特效
  18. 基于TCP的简单服务器
  19. Zookeeper之基础知识
  20. 亮紫色晶体meso四(4-氨基苯基)卟啉TAPP/TAPPPt/TAPPCo/TAPPCd/TAPPZn/TAPPPd/TAPPCu/TAPPNi/TAPPFe/TAPPMn金属配合物-齐岳供应

热门文章

  1. php pdo操作数据库
  2. 解决:此错误(HTTP 500 内部服务器错误)意味着您正在访问的网站出现了服务器问题,此问题阻止了该网页的显示...
  3. 做毕设时遇到的一些问题,以及一些小技巧
  4. 编程方法学18:多维数组收尾
  5. Python学习笔记:Day1-2 开发环境搭建
  6. Linux下实用的查看内存和多核CPU状态命令
  7. /root/.bashrc与/etc/profile的异同
  8. android textwatcher 延时,Java-防止两次在android的textwatcher中运行
  9. 【Matlab】for循环进度条显示百分比进程和剩余时间
  10. 【Matlab】怎么判断两个字符串相等?