环境信息
Linux 的 namespace 的作用是 ”隔离内核资源“,目前主要实现了以下 namespace
mount namespace
- 文件系统挂载点
UTS namespace
- 主机名
IPC namespace
- POSIX 进程间通信消息队列
PID namespace
- 进程 pid 数字空间
network namespace
- network
user namespace
- user ID 数字空间
cgroup
- 资源使用控制
其中,除了 network namespace
,其他 namespace 的操作需要使用 C 语言调用系统 API 实现。network namespace
的增删改查功能已经集成到了 Linux 的 ip
工具集的 netns
子命令中
Linux 里面的 namespace 给处在其中的进程造成 2 个错觉:
- 它是系统里面唯一的进程
- 它独享系统的所有资源
默认情况下,Linux 里面的所有进程处在和宿主机相同的 namespace ,即初始 namespace 里,默认享有全局系统资源。
想要查看某个进程都在哪些 namespace 中,可以找到进程 ID (PID),通过查看以下内容或者 namespace 信息
$ ps -elf | grep nginx 4 S root 32679 32659 0 80 0 - 2248 sigsus Apr07 ? 00:00:00 nginx: master process nginx -g daemon off;
$ ll /proc/32679/ns/ total 0 lrwxrwxrwx 1 root root 0 Apr 19 13:51 cgroup -> cgroup:[4026531835] lrwxrwxrwx 1 root root 0 Apr 19 13:51 ipc -> ipc:[4026534784] lrwxrwxrwx 1 root root 0 Apr 19 13:51 mnt -> mnt:[4026534583] lrwxrwxrwx 1 root root 0 Apr 19 13:51 net -> net:[4026534787] lrwxrwxrwx 1 root root 0 Apr 19 13:51 pid -> pid:[4026534878] lrwxrwxrwx 1 root root 0 Apr 19 13:51 pid_for_children -> pid:[4026534878] lrwxrwxrwx 1 root root 0 Apr 19 13:51 user -> user:[4026531837] lrwxrwxrwx 1 root root 0 Apr 19 13:51 uts -> uts:[4026534877]
|
通过以上命令,可以看到 nginx
进程所属的 namespace,要查看系统初始 namespace ,可以查看 PID 为 1 的进程的 namespace 信息
$ ll /proc/1/ns/ total 0 lrwxrwxrwx 1 root root 0 Apr 19 13:53 cgroup -> cgroup:[4026531835] lrwxrwxrwx 1 root root 0 Apr 19 13:53 ipc -> ipc:[4026531839] lrwxrwxrwx 1 root root 0 Apr 19 13:53 mnt -> mnt:[4026531840] lrwxrwxrwx 1 root root 0 Apr 19 13:53 net -> net:[4026531992] lrwxrwxrwx 1 root root 0 Apr 19 13:53 pid -> pid:[4026531836] lrwxrwxrwx 1 root root 0 Apr 19 13:53 pid_for_children -> pid:[4026531836] lrwxrwxrwx 1 root root 0 Apr 19 13:53 user -> user:[4026531837] lrwxrwxrwx 1 root root 0 Apr 19 13:53 uts -> uts:[4026531838]
|
链接文件的内容的格式为 ns 类型: [inode number]。这里的 inode number
则用来标识一个 namespace,我们也可以把它理解为 namespace 的 ID。如果两个进程的某个 namespace 文件指向同一个链接文件,说明其相关资源在同一个 namespace 中。 [1]
脚注