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的更多相关文章

  1. 理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境

    本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  2. Docker之Linux Namespace

    Linux Namespace 介绍 我们经常听到说Docker 是一个使用了Linux Namespace 和 Cgroups 的虚拟化工具,但是什么是Linux Namespace 它在Docke ...

  3. Docker基础技术:Linux Namespace(下)

    在 Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中,主 ...

  4. Docker基础技术:Linux Namespace(上)

    时下最热的技术莫过于Docker了,很多人都觉得Docker是个新技术,其实不然,Docker除了其编程语言用go比较新外,其实它还真不是个新东西,也就是个新瓶装旧酒的东西,所谓的The New “O ...

  5. Docker 基础技术:Linux Namespace(下)

    导读 在Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中 ...

  6. Docker 基础技术之 Linux namespace 详解

    Docker 是"新瓶装旧酒"的产物,依赖于 Linux 内核技术 chroot .namespace 和 cgroup.本篇先来看 namespace 技术. Docker 和虚 ...

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

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

  8. Linux Namespace : UTS

    UTS namespace 用来隔离系统的 hostname 以及 NIS domain name.UTS 据称是 UNIX Time-sharing System 的缩写. hostname 与 N ...

  9. Linux Namespace : 简介

    在初步的了解 docker 后,笔者期望通过理解 docker 背后的技术原理来深入的学习和使用 docker,接下来的几篇文章简单的介绍下 linux namespace 的概念以及基本用法. na ...

随机推荐

  1. 洗礼灵魂,修炼python(55)--爬虫篇—知识补充—RFC 2616 http状态码

    不多说直接上状态码表: 状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽 ...

  2. SpringBoot整合Rabbitmq设置消息请求头

    String str = "{\"origin\":\"BBC\",\"origin_coupon_id\":51,\" ...

  3. Linux Regulator Framework(2)_regulator driver

    转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_driver.html 说实话,这篇好难懂啊... 1. 前言 本文从regulator d ...

  4. 用Python实现数据结构之二叉搜索树

    二叉搜索树 二叉搜索树是一种特殊的二叉树,它的特点是: 对于任意一个节点p,存储在p的左子树的中的所有节点中的值都小于p中的值 对于任意一个节点p,存储在p的右子树的中的所有节点中的值都大于p中的值 ...

  5. 关掉 ubuntu bug 报告功能

    想关掉这个: 通过服务加配置文件关掉

  6. windwos安装RabbitMQ

    目录 windows 安装RabbitMQ 安装erlang 安装rabbitmq 添加windows环境变量 检测rabbitmq状态 启动web管理插件 rabbitmq服务 windows 安装 ...

  7. Linux读写执行权限对目录和文件的影响

    提示:这里的用户指的是普通用户 读写执行权限对root无效 对于目录来说 1)只拥有读权限 可以ls 查看目录内容,不能切换进目录中去 也不能创建目录或文件 [support@node1 opt]$ ...

  8. Luogu P3462 [POI2007]ODW-Weights

    题目描述 While moving to a new compound the Byteotian Institute of Experimental Physics has encountered ...

  9. 莫比乌斯函数 51nod-1240(合数分解试除法)

    就是输出n时,莫比乌斯函数的值.直接将n唯一分解即可. 思路:筛出105以内的素数,因为109开方,105就差不多.当一个大数还没有被1000个素数分解,那么这个数基本上可以认为是素数(为合数为小概率 ...

  10. Linux监控命令整理(top,free,vmstat,iostat,mpstat,sar,netstat)

    1.1 top 1.1.1 命令说明 Top 命令能够实时监控系统的运行状态,并且可以按照cpu.内存和执行时间进行排序 1.1.2 参数说明 命令行启动参数: 用法: top -hv | -bcis ...