作为开源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