最近Docker技术越来越受到关注,作为Docker中很重要的一项技术,Namespace也就经常在Docker的简介里面看到。

在这里总结一下它的内部机制。也解决一下自己原来的一些疑惑。

Namespace是什么:

C++中的Namespace:

首先,先提一下Namespace是什么。最早知道这个名词是在学习C++语言的时候。由于现在的系统越来越复杂,代码中不同的模块就可能使用相同变量,于是就出现了Namespace,来对全局作用域进行划分

比如C++的标注库都定义在STD Namespace中,需要使用时,就可以指定STD Namespace。当我们写一个类,类函数也需要使用namespace来指明这是属于哪一个类的函数。

Linux的Namespasce:

Linux Namespaces是一种轻量级的虚拟化形式。操作系统在内存,CPU上,已经使用了虚拟化的技术,让每个进程都认为是自己独占了内存和CPU。但像存储,磁盘,信号等,一些资源,操作系统并没有将其隔离开。

namespace则是将这类资源也隔离开来。使得进程只能看到自己的资源视图。这个功能加上Cgroup,就可以实现一个轻量级的虚拟机。这对于提高主机资源利用率很有用。如果说KVM这类虚拟机是为了隔离,而容器技术更多是为了共享。

Namespace原理:

对于内核来说,进程是由task_struct结构体来控制。所以Namespace肯定会和task_struct有关联。在task_struct中,定义了一个nsproxy的结构体指针。

nsproxy结构体:

1 struct task_struct {
2 ……..
3 /* namespaces */
4          struct nsproxy *nsproxy;
5 …….
6 }

nsproxy则是定义namespace的结构体。

01 /* 'count' 是task引用namspace的计数,这是通过nsproxy指向的计数。
02  * nsproxy被共用所有namespace的tasks所共享。只要一个namespace被clone或者不被使用,那么nsproxy就会被copy。
03 */
04 struct nsproxy {
05          atomic_t count;
06          struct uts_namespace *uts_ns;     //
07          struct ipc_namespace *ipc_ns;
08          struct mnt_namespace *mnt_ns;
09          struct pid_namespace *pid_ns;
10          <strong>struct</strong> user_namespace *user_ns;
11          struct net             *net_ns;
12 };

  1. uts_namespace结构体主要是包含了运行内核的名称、版本、底层体系结构类型等信息。UTS是UNIX Timesharing System的简称。
  2. *ipc_namespace指向保存在struct ipc_namespace中的所有与进程间通信(IPC)有关的信息。
  3. *mnt_namespace指向的是已经装载的文件系统的视图,在struct mnt_namespace中给出。
  4. *pid_ns_for_children指向有关进程ID的信息,由struct pid_namespace提供。
  5. user_ns 这个在新的3.8内核中实现。
  6. struct net_ns包含所有网络相关的命名空间参数。

默认nsproxy:

init_nsproxy是和task一起初始化的。除了mnt_ns 没有进行初始化,其余的namespace都进行了系统默认初始化。

创建新的Namspace:

如果要进程有独立的Namespace,可以使用系统调用clone().使用flag标记来设置

1 int clone(int (*fn)(void *), void *child_stack, int flags, void *arg)
  1. fn 是指向函数的指针。
  2. child_stack是运行的栈。需要传尾指针,因为栈是反着的。
  3. flag 就是设置namespace的地方。
  4. arg 是函数运行的参数。

当然,这个函数并非系统调用,这是glibc的函数。内核中真正工作的是do_fork函数。

do_fork函数会调用copy_process函数,在进行flag检查之后,里面会调用copy_namespaces.

这个函数会给task初始化一个新的nsproxy,然后对nsproxy里面的每个namespace结构体进行创建。

1 int copy_namespaces(unsigned long flags, struct task_struct *tsk);

进入存在的Namespace:

在刚开始用docker时,发现可以使用docker exec 来进入一个运行中的容器,对其操作。

如果是Cgroup,只需要找到对应挂在目录,echo进程pid到tasks里即可。但Namespace现在还没有这种设计。

另外,要进入一个已知的namespace还需要一个标识。不然,进入哪个Namespace呢。

1 /proc/[pid]/ns

这个时候,Linux一切皆文件的设计就体现出了它的优势。我们可以直接通过proc中的ns文件来获取这个Namespa的标示。Cgroup的设置也能通过proc中的文件看出。

1 int setns(int fd, int nstype);
  • 参数fd表示我们要加入的namespace的文件描述符。
  • nstype是用于校验的,传入0就是不校验。

setns之后,就可以通过exec系列的函数来运行需要的程序了。for会继承其父进程的Namespace。

参考:

http://blog.chinaunix.net/uid-20788636-id-4479145.html

Docker基础技术:Linux Namespace(上)

Docker基础技术:Linux Namespace(下)

http://lwn.net/Articles/531114/

转载请注明:旅途@KryptosX » Linux Namespace机制简介

Linux Namespace机制简介相关推荐

  1. Linux启动跟windows启动,Windows,Linux启动机制简介

    前言 本文内容只集中在操作系统启动原理的讲解上,不涉及启动的技术细节,因为这些细节都可以通过网络或者相关代码了解.只有了解了启动原理,才能在分析和解决有关启动的问题时具有针对性,不会有无从下手的感觉. ...

  2. linux upstart机制简介及封装应用

    前言 对于使用linux的同学,敲大段的命令都已经是家长便饭了.但有些时候用命令也不是那么方便,比如启动一个后台程序, sh ./app & 执行启动命令很简单,如果想停止这个应用或者重启这个 ...

  3. linux通信机制总结

    目录 1. Linux通信机制分类简介 2. Inter-Process Communication (IPC) mechanisms: 进程间通信机制0x1: 信号量(Signals)0x2: 管道 ...

  4. Linux内核的namespace机制分析

    1.  Linux内核namespace机制 Linux Namespaces机制提供一种资源隔离方案.PID,IPC,Network等系统资源不再是全局性的,而是属于某个特定的Namespace.每 ...

  5. linux 命名空间Namespace机制【转】

    原文:http://blog.csdn.net/preterhuman_peak/article/details/40857117 Linux Namespaces机制提供一种资源隔离方案.PID,I ...

  6. linux的namespace机制

    Linux的namespace机制是一种用于实现进程隔离和资源隔离的核心特性.它允许在同一个系统上运行的进程具有独立的视图和资源环境,互相之间相互隔离,从而增强了系统的安全性.可靠性和可扩展性.下面是 ...

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

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

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

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

  9. linux 创建 tmpfs 分区,【Linux】tmpfs简介及增加方式

    一. 什么是tmpfs? tmpfs是一种基于内存的文件系统,它和虚拟磁盘ramdisk比较类似,但不完全相同,和ramdisk一样,tmpfs可以使用RAM,但它也可以使用swap分区来存储.而且传 ...

最新文章

  1. 201621123057 《Java程序设计》第12周学习总结
  2. 堆排序算法实现思想个人理解
  3. centos7.3允许mysql远程连接_Centos7.3 安装Mysql和远程登录到Mysql-Go语言中文社区
  4. 数据安全架构设计与实战~如何加密结构化数据
  5. 乐高机器人亮剑_2500名选手大比拼 全球机器人广州从化“亮剑”
  6. redhat9.0配置apache 出现乱码
  7. QML 可以多选ComboBox的实现
  8. ykhmi是什么触摸屏软件_触摸屏如何读写变频器参数?如何控制变频器?实操步骤及方法分享...
  9. 烽火HG680-R-MSO9280-河南电信_湖北联通免费刷机固件及说明
  10. 向量 点乘 叉乘求导总结
  11. 阻抗,特征阻抗与等效阻抗
  12. 手动写一个搜索引擎(超详细)
  13. php怎样规定密码混合,PHP产生随机字串,可用来自动生成密码 默认长度6位 字母和数字混合...
  14. 图像去雾毕业论文准备01-python中time标准库
  15. 2021-08-11
  16. reactive函数实现响应式数据
  17. RxSwift 的简单使用
  18. Sharding-JDBC 基础
  19. 局域网访问提示无法访问检查拼写_win10访问局域网出现“请检查名称的拼写”如何解决...
  20. 【E文件解析】Java实现E文件解析为对象

热门文章

  1. linux 格式化 lvm2,LVM2
  2. 面试前,不要这么准备了,简直愚蠢到极点
  3. 单结晶体管的导电特性_二极管的导电特性
  4. php redis 日志模式,Redis的PHP客户端
  5. html相同标签替换,html替换把多有标签替换成p标签
  6. nedc和epa续航里程什么意思_电动汽车续航能力NEDC、EPA、WTLP什么意思?哪个最硬核?...
  7. 怎么保存php格式,把php代码保存到php文件实现方法
  8. setup the printer on ubuntu for uniofsurrey
  9. Installing SuiteSparse
  10. vue render 渲染html,详解vue渲染函数render的使用