linux中的namespace
本文将就namespace这个知识点,进行简单的归纳总结,力求通俗易通。在资料汇总的过程中,参考了许多网上的博客资料,在文章尾部给出相关链接。
namespace,命名空间,从名字上看,应该是类似于包含许多名字的空间,打个比方,三年一班的小明和三年二班的小明,虽说他们名字是一样的,但是所在班级不一样,那么,在全年级排行榜上面,即使出现两个名字一样的小明,也会通过各自的学号来区分。对于学校来说,每个班级就相当于是一个命名空间,这个空间的名称是班级号。班级号用于描述逻辑上的学生分组信息,至于什么学生分配到1班,什么学生分配到2班,那就由学校层面来统一调度。大致应该就是这么个意思,恩。
C++中的命名空间
命名空间这个概念不仅仅在kernel中有使用,在其他语言中也有所体现。例如在C++中,标准C++库中所包含的所有内容(包括常量、变量、结构、类和函数)都被定义在命名空间std中。我们可以定义有名命名空间,也可以定义无名命名空间,命名空间可以嵌套定义,
1: 有名的命名空间:
2:
3: namespace 命名空间名 {
4:
5: 声明序列可选
6:
7: }
8:
9: 无名的命名空间:
10:
11: namespace {
12:
13: 声明序列可选
14:
15: }
16:
在C++中,如果代码的最前面没有使用 using namespace std 的话,对于输入输出流,就必须指定所在的命名空间(std::cout <<),否则编译器会找不到他们的具体实现。可以这么说,命名空间是对全局作用域的细分。
Linux中的namespace
在Linux系统中,可以同时存在多用户多进程,那么对他们的运行协调管理,通过进程调度和进度管理可以解决,但是,整体资源是有限的,怎么把有限的资源(进程号、通信资源、网络资源等等)合理分配给各个用户所在的进程?Linux中提出了namespace机制,这是一种轻量级的虚拟化形式。再次之前,Linux中很多资源是全局管理的,例如,系统中所有进程,都是通过PID来标识的,就像每个学生的学号一样,在整个学校范围内,肯定是唯一标识这个学生的。用户的ID管理,各个用户通过全局为UID来标识,每个学校的校长也只有有一个,它的UID为0,权利最大,可以对学校内全部老师和学生发起命令。每个学生可以看到其他学生的活动,但是无权把他们赶出学校,这是可以理解的。这种集中统一的管理方式,很适合大规模人群的管理。
随着大数据、虚拟化的兴起,Linux为了提供更加精细的资源分配管理机制,给出了namespace机制解决方法。
命名空间建立系统的不同视图, 对于每一个命名空间,从用户看起来,应该像一台单独的Linux计算机一样,有自己的init进程(PID为0),其他进程的PID依次递增,A和B空间都有PID为0的init进程,子容器的进程映射到父容器的进程上,父容器可以知道每一个子容器的运行状态,而子容器与子容器之间是隔离的。
Linux中有chroot的系统调用,该方法将进程限制到文件系统的某一部分,是一种简单的命名空间机制。
在task_struct结构体中,有struct nsproxy *nsproxy 这个成员变量,
1: /*
2: * A structure to contain pointers to all per-process
3: * namespaces - fs (mount), uts, network, sysvipc, etc.
4: *
5: * 'count' is the number of tasks holding a reference.
6: * The count for each namespace, then, will be the number
7: * of nsproxies pointing to it, not the number of tasks.
8: *
9: * The nsproxy is shared by tasks which share all namespaces.
10: * As soon as a single namespace is cloned or unshared, the
11: * nsproxy is copied.
12: */
13: struct nsproxy {
14: atomic_t count;
15: spinlock_t nslock;
16: struct uts_namespace *uts_ns;
17: struct ipc_namespace *ipc_ns;
18: struct mnt_namespace *mnt_ns;
19: struct pid_namespace *pid_ns;
20: };
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
uts_ns:UTS为Unix Timesharing System的简称,包含内存名称、版本、底层体系结构等信息。
ipc_ns:保存所有与进程间通讯(IPC)有关的信息。
mnt_ns: 当前装载的文件系统
pid_ns: 有关进程ID的信息
在高级版本上,还有net_ns的网络信息,user_ns的资源配额的信息等。
下面以uts命名空间为例子,介绍如何创建用户空间。
从上面的框架图可以看出,所谓的子空间,就是父进程fork一个子进程出来,然后子进程与父进程不共享某些资源,那么,就可以说,这个子进程在它自己的那个命名空间内。
要达到这种效果,就必须对fork的行为进行精确控制,内核提供的如下参数来设置:
UTS命名空间没有层次结构,所有信息都汇集到如下结构:
,kref是引用计数器,用于跟踪内核中有多少地方使用uts_namespace的实例。它提供的属性信息如下:
,从名字上,可以得知uts包含系统名称、版本号、机器名称等等。使用uname -a可以查看这些信息。
系统初始默认值保持在init/version.c 中的init_uts_ns全局变量中,在系统初始化task时,配置init_task。
用户可以在fork时,传入CLONE_NEWUTS标准,创建新的UTS命名空间。执行此操作,会生成先前uts_namespace的一份副本,当前进程内部的nsproxy指向此副本,然后就可以修改了。父子进程对nx_prosy的修改不会相互影响。
由于最初的父命名空间需要掌握所有子命名空间的所有pid信息,所有,在各级层次的命名空间的fork中,pid的分配是需要统一协调控制,对于各级子命名空间中的task_struct来说,同一个pid在不同命名空间看到的是不一样的。
同一个进程可以属于多个namespace,多个进程可以使用同一个namespace,
参考链接:
linux中的namespace的更多相关文章
- 在Linux中运行Nancy应用程序
最近在研究如何将.NET应用程序移植到非Windows操作系统中运行,逐渐会写一些文章出来.目前还没有太深的研究,所以这些文章大多主要是记录我的一些实验. 这篇文章记录了我如何利用NancyFx编写一 ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- 【转载】在Linux中使用VS Code编译调试C++项目
原文:在Linux中使用VS Code编译调试C++项目 最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS ...
- linux中的strings命令简介2
摘自:http://blog.csdn.net/stpeace/article/details/46641069 linux中的strings命令简介 之前我们聊过linux strings的用法和用 ...
- 浅析linux中的fork、vfork和clone
各种大神的混合,做个笔记. http://blog.sina.com.cn/s/blog_7598036901019fcg.html http://blog.csdn.net/kennyrose/ar ...
- 在Linux中调试段错误(core dumped)
在Linux中调试段错误(core dumped) 在作比赛的时候经常遇到段错误, 但是一般都采用的是printf打印信息这种笨方法,而且定位bug比较慢,今天尝试利用gdb工具调试段错误. 段错误( ...
- 解析Linux中的VFS文件系统机制
转载:原文地址https://www.ibm.com/developerworks/cn/linux/l-vfs/ 1. 摘要 本文阐述 Linux 中的文件系统部分,源代码来自基于 IA32 的 2 ...
- Python学习之旅:使用Python实现Linux中的ls命令
一.写在前面 前几天在微信上看到这样一篇文章,链接为:https://mp.weixin.qq.com/s/rl6Sgv3uk_IpoFAx6cWa8w,在这篇文章中,有这样一段话,吸引了我的注意: ...
- php中命名空间namespace和use
对于面向对象编程而言,命名空间namespace和use的概念非常重要. 1.根命名空间是反斜线 \ ,有点类似linux中的根目录 / 的那种感觉,但使用var_dump()函数打印时其实是空字符串 ...
随机推荐
- Flex4+Spring3+Hibernate3+BlazeDS整合笔记
普通Java Web工程流行使用ssh框架,而当前台使用Flex制作的时候,后台就不需要用Struts了,通过使用BlazeDS远程方法调用即可. 首先,新建Java Web工程,然后添加Flex项目 ...
- 关于androidManifest.xml的概叙以及intent-filter的详细分析
AndroidManifest.xml配置文件对于Android应用开发来说是比较细但又很重要的基础知识,本文旨在总结该配置文件中常用到的几个属性,以便日后查阅,至于那些比较细的属性,主要是平时开发比 ...
- LeetCode4 Median of Two Sorted Arrays
题目: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...
- java和C#中 定义变量,加一个小括号是什么意思。。。
在群里灌水发现,有人这样定义字符串,感觉很好奇..又问了群友,群友说这样定义没问题.. String strtemp = ("test"); 我自己试了下,java和C#都可以,C ...
- IOS 设置定时器
IOS 设置定时器 自动滚动视图 定时发送坐标信息 即时显示 时钟 NSTimer *timer; - (void)start {//1second 调用一次 timer = [NSTimer sc ...
- Oracle基础 (十二)数学函数
数学函数: ABS(n):求绝对值 ),) FROM DUAL; --获取15的绝对值 结果:, BITAND(X,Y):返回X,Y进行位与(AND)的运算结果 ,), BITAND(,), BITA ...
- 关于automatic_Panoramic_Image_Stitching_using_Invariant_features 的阅读笔记(2)
接上一篇: http://www.cnblogs.com/letben/p/5446074.html#3538201 捆绑调整 (好开心有同学一起来看看这些问题,要不然就是我自己的话,我应该也不会看的 ...
- Java Lock
JVM中的另一种锁Lock的实现.与synchronized不同的是,Lock完全用Java写成,在java这个层面是无关JVM实现的.在java.util.concurrent.locks包中有很多 ...
- Android apk 的安装过程
Android应用安装有如下四种方式 1.系统应用安装――开机时完成,没有安装界面 2.网络下载应用安装――通过market应用完成,没有安装界面 3.ADB工具安装――没有安装界面. 4.第三方应用 ...
- 磁珠 磁环 双向二极管 TVS二极管
磁珠专用于抑制信号线.电源线上的高频噪声和尖峰干扰,还具有吸收静电脉冲的能力.磁珠是用来吸收超高频信号,像一些RF电路,PLL,振荡电路,含超高频存储器电路(DDR SDRAM,RAMBUS等)都需要 ...