Docker基础 Linux内核命名空间之(2) ipc namespace

作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。

在本文中我们将会使用unshare命令来演示Linux内核的IPC Namespace是如何动作的。

Namespace的历史

Namespace并不是Linux才推出的东西,早在很久之前,Unix上就有类似的东西,而HPUX和Solaris商用的Conatiner更是以前就有推出。而在Linux的2.6之后的版本Namespace就逐步的被加了进来。

Linux Namespace的6大类型

项番 类型 功能说明
No.1 MNT Namespace 提供磁盘挂载点和文件系统的隔离能力
No.2 IPC Namespace 提供进程间通信的隔离能力
No.3 Net Namespace 提供网络隔离能力
No.4 UTS Namespace 提供主机名隔离能力
No.5 PID Namespace 提供进程隔离能力
No.6 User Namespace 提供用户隔离能力

Ubuntu版本

root@ubuntu:~# uname -a
Linux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
root@ubuntu:~#
  • 1
  • 2
  • 3

事前确认

确认当前进程PID

root@ubuntu:~# echo $$
32968
root@ubuntu:~#
  • 1
  • 2
  • 3

确认当前进程的各个namespace

root@ubuntu:~# ls -l /proc/$$/ns
total 0
lrwxrwxrwx 1 root root 0 Sep 15 10:23 cgroup -> cgroup:[4026531835]
lrwxrwxrwx 1 root root 0 Sep 15 10:23 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 Sep 15 10:23 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 Sep 15 10:23 net -> net:[4026531957]
lrwxrwxrwx 1 root root 0 Sep 15 10:23 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Sep 15 10:23 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Sep 15 10:23 uts -> uts:[4026531838]
root@ubuntu:~#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

内容说明

项番 内容说明
No.1 linux会在/proc下创建所对应的进程相关的信息,ns则为Namespace的信息
No.2 $$为当前进程PID,/proc/$$/ns下的Namespace的个数回随着Linux内核的高低不同显示的个数不同,因为Linux所支持的Namespace不是一次到位的
No.3 ipc:[4026531839],不同的Namespace都有不同的编号,比如32968的ipc的namespace的编号就是4026531839
No.4 关于Cgroup会单独在后面进行说明

事前确认

确认到当前bash中用于进程通信的共享内存和信号量的信息都有内容,只有消息队列是空的

root@ubuntu:~# echo $$
32968
root@ubuntu:~# ipcs

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 0          root       644        80         2
0x00000000 32769      root       644        16384      2
0x00000000 65538      root       644        280        2
0x3c81b7f5 131075     admin01    666        4096       0

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x000000a7 98304      root       600        1
0x3c81b7f6 163841     admin01    666        1

root@ubuntu:~#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

使用unshare隔离ipc namespace

root@ubuntu:~# echo $$
32968
root@ubuntu:~# unshare --ipc /bin/bash
root@ubuntu:~#
  • 1
  • 2
  • 3
  • 4

好像没有任何变化,其实这个已经不是刚才我们的32968进程了,而是一个新的进程,通过确认$$就能确认

root@ubuntu:~# echo $$
33614
root@ubuntu:~#
  • 1
  • 2
  • 3

再来确认一下,33614和32968两个进程的关系,我们能清楚地看到这是父子关系的两个进程,虽然都是bash

admin01@ubuntu:~$ ps -ef |grep 32968 |grep -v grep
root      32968  32967  0 10:16 pts/0    00:00:00 -su
root      33614  32968  0 11:47 pts/0    00:00:00 /bin/bash
admin01@ubuntu:~$ pstree 32968
bashqqqbash
admin01@ubuntu:~$
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

确认

在被隔离了ipc namespace的bash中确认ipc状况。

root@ubuntu:~# echo $$
33614
root@ubuntu:~# ipcs

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status

------ Semaphore Arrays --------
key        semid      owner      perms      nsems

root@ubuntu:~#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在此被隔离的ipc namespace中创建一个消息队列

root@ubuntu:~# echo $$
33614
root@ubuntu:~# ipcmk --queue
Message queue id: 0
root@ubuntu:~# ipcs

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages
0xb0fa6341 0          root       644        0            0

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status

------ Semaphore Arrays --------
key        semid      owner      perms      nsems

root@ubuntu:~#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

另起一个终端,然后确认是否能够看到刚刚创建的消息队列

[email protected]:~$ ipcs

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 0          root       644        80         2
0x00000000 32769      root       644        16384      2
0x00000000 65538      root       644        280        2
0x3c81b7f5 131075     admin01    666        4096       0

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x000000a7 98304      root       600        1
0x3c81b7f6 163841     admin01    666        1

[email protected]:~$
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

结果是看不到,所以在被隔离的namespace中创建的内容外部也看不到也得到了验证。

新ipc Namespace编号

/proc/$$/ns下面会列出当前的namespace信息,我们来看看一下这个使用unshare隔离了ipc namespace的信息

root@ubuntu:~# ls -l /proc/33614/ns
total 0
lrwxrwxrwx 1 root root 0 Sep 15 11:59 cgroup -> cgroup:[4026531835]
lrwxrwxrwx 1 root root 0 Sep 15 11:48 ipc -> ipc:[4026532506]
lrwxrwxrwx 1 root root 0 Sep 15 11:48 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 Sep 15 11:48 net -> net:[4026531957]
lrwxrwxrwx 1 root root 0 Sep 15 11:48 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Sep 15 11:48 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Sep 15 11:48 uts -> uts:[4026531838]
root@ubuntu:~#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

与之前进行比较,我们可以清晰地发现,除了ipc的namespace编号之外,其余都没有改变。

其他相关

内容 URL
在CentOS7上使用LXC管理容器 http://blog.csdn.net/liumiaocn/article/details/52348219
如何使用RHEL/CentOS 7安装创建和管理LXC (Linux Containers) http://blog.csdn.net/liumiaocn/article/details/52337479

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/firsttry/p/10294411.html

时间: 2024-08-29 21:07:51

Docker基础 Linux内核命名空间之(2) ipc namespace的相关文章

Docker基础 Linux内核之Cgroups(2)

作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分.物有本末,事有终始.知所先后,则近道矣.理解Linux的这两大特性将有助于我们更深入的理解Docker. 在本文中我们将会简要介绍一下如何在CentOS上利用Cgroups限制CPU的使用率. Cgroups的历史 Cgroups是Control Groups的缩写, 它是Linux 内核的一个特征,在2.6.24被引入. Cgroups用于提供对Linux的进程组进行资源上的

docker (linux 内核升级)

docker 目前一般是部署在linux7以上系统.其要求linux系统内核在3.8或更高的版本.查看版本命令:uname -a 当一般linux系统是7以下,其内核版本都是2点几. uname -r 2.6.32-358.11.1.el6.x86_64 内核升级: 1.导入public key rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 1.2下载源码包 去 http://www.kernel.org 首页,下载源码包

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

1. 基础知识:Linux namespace 的概念 Linux 内核从版本 2.4.19 开始陆续引入了 namespace 的概念.其目的是将某个特定的全局系统资源(global system resource)通过抽象方法使得namespace 中的进程看起来拥有它们自己的隔离的全局系统资源实例(The purpose of each namespace is to wrap a particular global system resource in an abstraction th

Docker基础技术:Linux Namespace(上)

导读 时下最热的技术莫过于Docker了,很多人都觉得Docker是个新技术,其实不然,Docker除了其编程语言用go比较新外,其实它还真不是个新东西,也就是个新瓶装旧酒的东西,所谓的The New “Old Stuff”.Docker和Docker衍生的东西用到了很多很酷的技术,我会用几篇 文章来把这些技术给大家做个介绍,希望通过这些文章大家可以自己打造一个山寨版的docker.先从Linux Namespace开始. 简介 Linux Namespace是Linux提供的一种内核级别环境隔

Docker 基础技术:Linux Namespace(下)

导读 在Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中,主要想向大家介绍Linux的User和Network的Namespace User Namespace User Namespace主要是用了CLONE_NEWUSER的参数,使用了这个参数后,内部看到的UID和GID已经与外部不同了.默认情况下容器没有的UID,系统自动设置上了最大的UID655

Docker基础技术:Linux Namespace(下)

在 Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中,主要想向大家介绍Linux的User和Network的Namespace. 好,下面我们就介绍一下还剩下的这两个Namespace. User Namespace User Namespace主要是用了CLONE_NEWUSER的参数.使用了这个参数后,内部看到的UID和GID已经与外部不同了,默认显

Docker 基础技术之 Linux namespace 详解

Docker 是"新瓶装旧酒"的产物,依赖于 Linux 内核技术 chroot .namespace 和 cgroup.本篇先来看 namespace 技术. Docker 和虚拟机技术一样,从操作系统级上实现了资源的隔离,它本质上是宿主机上的进程(容器进程),所以资源隔离主要就是指进程资源的隔离.实现资源隔离的核心技术就是 Linux namespace.这技术和很多语言的命名空间的设计思想是一致的(如 C++ 的 namespace). 隔离意味着可以抽象出多个轻量级的内核(容器

Docker背后的内核知识:命名空间资源隔离

完整的请看这里:http://linux.cn/article-5057-1.html 下面我只摘抄一部分!!! Linux内核中提供了六种命名空间(namespace)隔离的系统调用,如下. Namespace                          系统调用参数                             隔离内容     UTS CLONE_NEWUTS 主机名与域名 IPC CLONE_NEWIPC 信号量,消息队列和共享内存 PID CLONE_NEWPID 进程

20155301 滕树晨linux基础——linux进程间通信(IPC)机制总结

20155301 滕树晨linux基础--linux进程间通信(IPC)机制总结 共享内存 共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,由IPC为进程创建的一个特殊地址范围,它将出现在该进程的地址空间(这里的地址空间具体是哪个地方?)中.其他进程可以将同一段共享内存连接到自己的地址空间中.所有进程都可以访问共享内存中的地址,就好像它们是malloc分配的一样.如果一个进程向共享内存中写入了数据,所做的改动将立刻被其他进程看到 共享内存是IPC最快捷的方式,因为共享内存方式的通信没