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 隔离原理
- UTS namespace ,隔离主机名和域名,每个docker 容器都可以有独立的域名和主机名,在网络上可以被视为单独的一个机器,而不是宿主机的一个进程
- IPC namespace, 进程间通信,(inter-process comminucation) ,涉及的ipc资源包括常见的信号量、消息队列和共享内存。 同一个IPC namespace 下的进程彼此可见,不同IPC namespace下的进程则互相不可见。
- 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】