linux namespace 工具,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 10

528374d0922a8863ad186f412ff7c4be.png

ipcs

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

$ ipcs -s

7a12c8a37ad56c8d0d958906ae4a3f5b.png

ipcrm

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

$ ipcrm -s

b99c29f1640781db25e46a1e1bfe98b3.png

与 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

9095eb525016c3f795538907ff3d599e.png

nsenter 命令

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

我们接上面的例子,使用 nsenter 命令把一个 bash 进程加入到 4956 号进程的 IPC namespace 中:

81bd7a699732cd1f4ced17ddc1053534.png

此时当前 bash 进程的 IPC namespace 已经和 4956 号进程的 IPC namespace 是同一个了。

演示 IPC namespace 隔离

接下来让我们通过 IPC 信号量的隔离来了解如何隔离 IPC namespace。

首先我们打开两个 bash shell,为了方便区分,分别把它们称为为 shell1 和 shell2。先在 shell2 中执行 sudo unshare -i,然后分别执行 readlink /proc/$$/ns/ipc 命令:

c09aedcfdb3017b556eea46b6d580055.png

图中左侧为 shell1,右侧为 shell2。可以看出它们的 IPC namespace 是不同的。

然后我们在 shell2 中创建 IPC 信号量集,并分别在两个 shell 中进行查看:

1441bf125ded7c0bae1ff128704dc640.png

结果显示,shell1 中不能观察到 shell2 中创建的 IPC 信号量集,这是因为 shell1 和 shell2 此时分别在不同的 IPC namespace 中。

接下来我们在 shell1 中启动一个新的 bash 进程,并通过 nsenter 命令把它加入到 shell2 的 IPC namespace 中,然后再次查看 IPC 信号量信息:

c2f9c59a1e53f51bb9b4518e11dec793.png

这次 shell1 中显示的信号量信息和 shell2 中是一样的。

最后让我们看看此时 shell1 和 shell2 中当前进程的 IPC namespace:

992634402c596f75a6f3dd9194181c77.png

此时这两个进程属于同一个 IPC namespace,这才是他们可以看到相同的 IPC 资源的根本原因。

总结

总体来看,在我们了解了 linux namespace 的一些基本概念后,IPC namespace 隔离的观察和理解还是比较简单的。下篇我们将介绍  Mount namespace 的相关内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值