Linux Namespace : IPC
IPC namespace 用来隔离 System V IPC 对象和 POSIX message queues。其中 System V IPC 对象包含共享内存、信号量和消息队列,笔者在《System V IPC 之共享内存》、《System V IPC 之信号量》和《System V IPC 之消息队列》三篇博文中对它们分别进行过介绍。本文我们将通过 demo 演示如何通过 IPC namespace 对 IPC 资源进行隔离,本文的演示环境为 ubuntu 16.04。
操作 IPC 资源的工具
Linux 系统中默认自带了操作 IPC 资源的命令行工具,如 ipcmk、ipcs 和 ipcrm 等。我们可以使用这些工具创建、查看和删除 IPC 资源。
ipcmk
ipcmk 命令用来创建 IPC资源:共享内存、信号量和消息队列。下面的命令用来创建包含 10 个信号量的信号量集:
$ ipcmk -S

ipcs
ipcs 命令显示当前系统中 IPC 资源的信息。默认会显示所有的 IPC 资源,包括共享内存、信号量和消息队列。可以通过命令行中的选项来控制显示的资源类型,比如通过应用 -s 选项,下面的命令只显示系统中 IPC 信号量的信息:
$ ipcs -s

ipcrm
ipcrm 命令用来删除系统中的 IPC 资源,此时必须指定资源的类型和标识。比如删除我们刚才创建的 IPC 信号量集:
$ ipcrm -s

与 namespace 相关的工具
unshare 命令
unshare 命令把当前进程加入到一个新建的 namespace 中,然后运行指定的程序(不指定目标程序则运行系统的默认 shell)。在前文《Linux Namespace: UTS》中我们介绍了一些与 namespace 相关的 API,比如 unshare 函数。unshare 函数的功能是把当前进程加入到一个新建的 namespace 中。比起我们自己写的小 demo,系统工具中已经内置了 unshare 命令行工具,本文将使用系统中的 unshare 命令进行相关的演示。对 unshare 命令的实现感兴趣的朋友可以参考其源代码,它也是通过调用 unshare 函数实现的。
下面的例子就是通过 unshare 命令让新建的 bash 进程属于新的 IPC namespace:
$ sudo unshare -i

nsenter 命令
nsenter 命令把当前进程加入到指定进程的 namespace 中,然后运行指定的程序(不指定目标程序则运行系统的默认 shell)。其实这个命令的核心功能也是通过我们在前文《Linux Namespace: UTS》中介绍的 setns 函数实现的。这个命令和 unshare 命令一样,也属于 linux 的 sys-utiles 工具,对其实现感兴趣的朋友可以参考其源代码。
我们接上面的例子,使用 nsenter 命令把一个 bash 进程加入到 4956 号进程的 IPC namespace 中:

此时当前 bash 进程的 IPC namespace 已经和 4956 号进程的 IPC namespace 是同一个了。
演示 IPC namespace 隔离
接下来让我们通过 IPC 信号量的隔离来了解如何隔离 IPC namespace。
首先我们打开两个 bash shell,为了方便区分,分别把它们称为为 shell1 和 shell2。先在 shell2 中执行 sudo unshare -i,然后分别执行 readlink /proc/$$/ns/ipc 命令:

图中左侧为 shell1,右侧为 shell2。可以看出它们的 IPC namespace 是不同的。
然后我们在 shell2 中创建 IPC 信号量集,并分别在两个 shell 中进行查看:

结果显示,shell1 中不能观察到 shell2 中创建的 IPC 信号量集,这是因为 shell1 和 shell2 此时分别在不同的 IPC namespace 中。
接下来我们在 shell1 中启动一个新的 bash 进程,并通过 nsenter 命令把它加入到 shell2 的 IPC namespace 中,然后再次查看 IPC 信号量信息:

这次 shell1 中显示的信号量信息和 shell2 中是一样的。
最后让我们看看此时 shell1 和 shell2 中当前进程的 IPC namespace:

此时这两个进程属于同一个 IPC namespace,这才是他们可以看到相同的 IPC 资源的根本原因。
总结
总体来看,在我们了解了 linux namespace 的一些基本概念后,IPC namespace 隔离的观察和理解还是比较简单的。下篇我们将介绍 Mount namespace 的相关内容。
参考:
Linux Namespace系列(03):IPC namespace (CLONE_NEWIPC)
Namespaces man page
Ipcmk man page
Ipcs man page
Ipcrm man page
Unshare man page
Nsenter man page
Linux Namespace : IPC的更多相关文章
- 理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境
本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- Docker之Linux Namespace
Linux Namespace 介绍 我们经常听到说Docker 是一个使用了Linux Namespace 和 Cgroups 的虚拟化工具,但是什么是Linux Namespace 它在Docke ...
- Docker基础技术:Linux Namespace(下)
在 Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中,主 ...
- Docker基础技术:Linux Namespace(上)
时下最热的技术莫过于Docker了,很多人都觉得Docker是个新技术,其实不然,Docker除了其编程语言用go比较新外,其实它还真不是个新东西,也就是个新瓶装旧酒的东西,所谓的The New “O ...
- Docker 基础技术:Linux Namespace(下)
导读 在Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中 ...
- Docker 基础技术之 Linux namespace 详解
Docker 是"新瓶装旧酒"的产物,依赖于 Linux 内核技术 chroot .namespace 和 cgroup.本篇先来看 namespace 技术. Docker 和虚 ...
- Docker 基础技术之 Linux namespace 源码分析
上篇我们从进程 clone 的角度,结合代码简单分析了 Linux 提供的 6 种 namespace,本篇从源码上进一步分析 Linux namespace,让你对 Docker namespace ...
- Linux Namespace : UTS
UTS namespace 用来隔离系统的 hostname 以及 NIS domain name.UTS 据称是 UNIX Time-sharing System 的缩写. hostname 与 N ...
- Linux Namespace : 简介
在初步的了解 docker 后,笔者期望通过理解 docker 背后的技术原理来深入的学习和使用 docker,接下来的几篇文章简单的介绍下 linux namespace 的概念以及基本用法. na ...
随机推荐
- 将 Azure 文件共享用于 Windows VM
可将 Azure 文件共享用作一种从 VM 中存储和访问文件的方式. 例如,你可以存储一个要与所有 VM 共享的脚本或应用程序配置文件. 本主题将介绍如何创建和装载 Azure 文件共享,以及如何上传 ...
- MySQL重做日志相关
Ⅰ.事务的实现 这里我们先抛出答案,通过答案再展开分析 特性 实现 A(原子性) redo C(一致性) undo I(隔离性) lock D(持久性) redo/undo 本节针对redo展开分 ...
- 欲善其功,必先利其器--Nodejs调试技术总结
调试技术与开发技术构成了软件开发的基石.目前Nodejs作为新型的Web Server开发栈倍受开发者关注.总的来说Nodejs的应用程序主要有两部分:JavaScript编写的js模块和C语言编译的 ...
- Unity Chan 2D Asset
Unity Chan 2D Asset 4月份時,UNITY CHAN 官方網站推出了3D大島こはく,之後也有更新1.11版,而在六月12日時,則釋出了2D版本素材,一樣可以在UNITY CHAN 官 ...
- python UDP套接字通信
UDPserver.py import socket #导入套接字模块 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # - socket.A ...
- 【待完成】[MapReduce_9] MapReduce 的 Shuffle 机制
0. 说明 待补充...
- Pair Programming 2
学生-社团匹配程序 项目流程: 1. 分析讨论 2. 分工合作 3. 代码规范 4. 编码实现 5. 模块结合 6. 测试修改 7. 数据样例 8. 心得体会 9. GitHub链接 结对队友:陈文举 ...
- [BJWC2011]元素
嘟嘟嘟 题中说选的数的编号亦或和不能为0,也就是在这个集合中,不能用不同的选取方案亦或出相同的值.由此联想到线性基的一个性质是,每一个数都能由线性基中特定的一些数亦或得到. 所以我们就是要求出这些数的 ...
- Actor模型和CSP模型的区别
引用至:http://www.jdon.com/concurrent/actor-csp.html Akka/Erlang的actor模型与Go语言的协程Goroutine与通道Channel代表的C ...
- P1160 队列安排 luogu洛谷
题目描述 一个学校里老师要将班上NNN个同学排成一列,同学被编号为1∼N1\sim N1∼N,他采取如下的方法: 先将111号同学安排进队列,这时队列中只有他一个人: 2−N2-N2−N号同学依次入列 ...