环境信息
Linux 的 namespace 的作用是 隔离内核资 ,目前主要实现了以下 namespace
mount namespace
- 文件系统挂载点
UTS namespace
- 主机名
IPC namespace
- POSIX 进程间通信消息队列
PID namespace
- 进程 pid 数字空间
network namespace
- network
user namespace
- user ID 数字空间
cgroup
- 资源使用控制
time
- 隔离时钟(Clock)
其中,除了 network namespace
,其他 namespace 的操作需要使用 C 语言调用系统 API 实现。network namespace
的增删改查功能已经集成到了 Linux 的 ip
工具集的 netns
子命令中
Linux 里面的 namespace 给处在其中的进程造成 2 个错觉:
- 它是系统里面唯一的进程
- 它独享系统的所有资源
默认情况下,Linux 里面的所有进程处在和宿主机相同的 namespace ,即初始 namespace 里,默认享有全局系统资源。
lsns
命令可以查看当前系统上存在哪些 Namespace
# lsns NS TYPE NPROCS PID USER COMMAND 4026531834 time 251 1 root /lib/systemd/systemd --system --deserialize 52 4026531835 cgroup 224 1 root /lib/systemd/systemd --system --deserialize 52 4026531836 pid 224 1 root /lib/systemd/systemd --system --deserialize 52 4026531837 user 686 1 root /lib/systemd/systemd --system --deserialize 52 4026531838 uts 221 1 root /lib/systemd/systemd --system --deserialize 52 4026531839 ipc 224 1 root /lib/systemd/systemd --system --deserialize 52 4026531840 net 229 1 root /lib/systemd/systemd --system --deserialize 52 4026531841 mnt 213 1 root /lib/systemd/systemd --system --deserialize 52 4026531862 mnt 1 61 root kdevtmpfs 4026532219 mnt 1 1426338 root /lib/systemd/systemd-udevd 4026532220 uts 1 1426338 root /lib/systemd/systemd-udevd 4026532230 mnt 1 2124756 root /lib/systemd/systemd-logind 4026532231 uts 1 2124756 root /lib/systemd/systemd-logind 4026532232 mnt 1 1426274 systemd-timesync /lib/systemd/systemd-timesyncd 4026532233 mnt 1 1426257 root /usr/sbin/irqbalance --foreground 4026532326 mnt 1 2134793 root /usr/sbin/NetworkManager --no-daemon 4026532593 cgroup 7 937225 root python manage.py runserver 0.0.0.0:8080 4026532603 mnt 1 1416468 472 grafana server --homepath=/usr/share/grafana --config=/etc/grafana/grafana.ini --packaging=docker cfg:defau 4026532604 uts 1 1416468 472 grafana server --homepath=/usr/share/grafana --config=/etc/grafana/grafana.ini --packaging=docker cfg:defau 4026532605 ipc 1 1416468 472 grafana server --homepath=/usr/share/grafana --config=/etc/grafana/grafana.ini --packaging=docker cfg:defau 4026532606 pid 1 1416468 472 grafana server --homepath=/usr/share/grafana --config=/etc/grafana/grafana.ini --packaging=docker cfg:defau 4026532607 net 1 1416468 472 grafana server --homepath=/usr/share/grafana --config=/etc/grafana/grafana.ini --packaging=docker cfg:defau 4026532664 cgroup 1 1416468 472 grafana server --homepath=/usr/share/grafana --config=/etc/grafana/grafana.ini --packaging=docker cfg:defau 4026532665 mnt 1 1416534 1001 /opt/bitnami/blackbox-exporter/bin/blackbox_exporter --config.file=/etc/blackbox/blackbox.yml 4026532666 uts 1 1416534 1001 /opt/bitnami/blackbox-exporter/bin/blackbox_exporter --config.file=/etc/blackbox/blackbox.yml 4026532667 ipc 1 1416534 1001 /opt/bitnami/blackbox-exporter/bin/blackbox_exporter --config.file=/etc/blackbox/blackbox.yml 4026532668 pid 1 1416534 1001 /opt/bitnami/blackbox-exporter/bin/blackbox_exporter --config.file=/etc/blackbox/blackbox.yml 4026532669 net 1 1416534 1001 /opt/bitnami/blackbox-exporter/bin/blackbox_exporter --config.file=/etc/blackbox/blackbox.yml
|
想要查看某个进程都在哪些 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]
脚注