linux namespace详解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
lyr@DESKTOP-FSVN6C0:~$ lsns # 查看 linux系统多有哪些namespace
        NS TYPE   NPROCS PID USER COMMAND
4026531835 cgroup      2  12 lyr  -bash
4026531837 user        2  12 lyr  -bash
4026531992 net         2  12 lyr  -bash
4026532188 mnt         2  12 lyr  -bash
4026532189 uts         2  12 lyr  -bash
4026532190 ipc         2  12 lyr  -bash
4026532191 pid         2  12 lyr  -bash
lyr@DESKTOP-FSVN6C0:~$
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
lyr@DESKTOP-FSVN6C0:~$ sudo ls -la  /proc/10/ns/
[sudo] password for lyr:
Sorry, try again.
[sudo] password for lyr:
total 0
dr-x--x--x 2 root root 0 Mar 17 00:09 .
dr-xr-xr-x 9 root root 0 Mar 17 00:09 ..
lrwxrwxrwx 1 root root 0 Mar 17 00:09 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Mar 17 00:09 ipc -> 'ipc:[4026532190]'
lrwxrwxrwx 1 root root 0 Mar 17 00:09 mnt -> 'mnt:[4026532188]'
lrwxrwxrwx 1 root root 0 Mar 17 00:09 net -> 'net:[4026531992]'
lrwxrwxrwx 1 root root 0 Mar 17 00:09 pid -> 'pid:[4026532191]'
lrwxrwxrwx 1 root root 0 Mar 17 00:12 pid_for_children -> 'pid:[4026532191]'
lrwxrwxrwx 1 root root 0 Mar 17 00:09 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Mar 17 00:09 uts -> 'uts:[4026532189]'

进入namespace 查看 ip

1
nsenter -t 1 -n ip addr

unshare 命令

1
unshare - run program with some namespaces unshared from parent(使用与父程序不共享的名称空间运行程序)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
root@DESKTOP-FSVN6C0:/home/lyr# unshare -fn sleep 60
root@DESKTOP-FSVN6C0:/home/lyr#

# 同时运行下面--
root@DESKTOP-FSVN6C0:/home/lyr# nsenter -t 800 -n ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0

namespace 隔离原理

  1. UTS namespace ,隔离主机名和域名,每个docker 容器都可以有独立的域名和主机名,在网络上可以被视为单独的一个机器,而不是宿主机的一个进程
  2. IPC namespace, 进程间通信,(inter-process comminucation) ,涉及的ipc资源包括常见的信号量、消息队列和共享内存。 同一个IPC namespace 下的进程彼此可见,不同IPC namespace下的进程则互相不可见。
  3. PID namespace , 两个不同namespace 的进程可以有相同的pid, 操作系统维护着一个 root namespace, 进程内核为所有的pid namespace 维护一个树状结构,最顶层的是系统初始化创建的root namespace, 创建新的 pid namespace 被称为 child namespace (树的子节点)

通过这种方式,不同的pid namespace 会形成一个层级体系。所属父节点可以看到子节点中的进程,冰可以通过信号等方式对子节点中的进程产生影响。反过来缺不能看到父节点 pid namespace中的任何内容。

1
2
3

sudo unshare --fork --pid --mmount-proc bash
ps aux

unshare 与 clone很新鲜,不过 UNshare 不需要启动新的进程,而是运行在原先的进程上。

1
2
3
4
5
6
[root@VM-0-7-centos ~]# sudo unshare --fork --pid --mount-proc bash
[root@VM-0-7-centos ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  1.0  0.1 117088  3484 pts/0    S    12:37   0:00 bash
root       115  0.0  0.0 155452  1852 pts/0    R+   12:37   0:00 ps aux
[root@VM-0-7-centos ~]#

我们通过 unshare 命令 就可以隔离系统进程了【这是一个单独 的namespace】