lsns -t net和ip netns list的区别

ip netns list:显示你通过ip netns add所添加的网络命名空间名,是从/var/run/netns来获取

lsns:可以访问本机的所有命名空间的信息。
想要查看特定命名空间可以通过: lsns -t type(命名空间类型)。
ls -t net,它是从/proc/pid/ns获取到命名空间信息,所以他只能看到正在运行的进程的所属命名空间,所以不管ip netns add添加了多少命名空间,只要里面没有正在运行的进程 ,lsns都不显示该命名空间。

验证1:
在命名空间中,写一个简易的睡眠程序,并启动起来

[root@localhost zh]# ip netns exec ns1 bash
[root@localhost zh]# ./main

  //然后另开一个bash
[root@localhost ns]# lsns -t net
NS TYPE NPROCS   PID USER  COMMAND
4026531956 net     213     1 root  /usr/lib/systemd/systemd --switched-root --system --des
4026532504 net       2 22634 root  bash
4026532568 net       1  6649 rtkit /usr/libexec/rtkit-daemon
4026532735 net       2 22853 root  bash

可以用 ip netns identify +pid 来看进程所属的网络命名空间

[root@localhost ns]# ip netns identify 22634
ns1
[root@localhost ns]# ip netns identify 22853
ns3

//正确的结果

验证2: 命名空间必须有正在运行的进程,这个说法不对

因为:
ip netns add ns1 //创建名叫ns1的网络命名空间
ip netns exec ns1 bash //进入ns1命名空间,并把bash的id和ns1命名空间绑定起来,lsns -t net查看到的是bash的id,并不是命名空间正在运行的进程,所以ns1中没有正在运行的进程,lsns也可以显示。

[root@localhost zh]# ps
 PID TTY          TIME CMD
28408 pts/0    00:00:00 su
28423 pts/0    00:00:00 bash
28977 pts/0    00:00:00 ps
[root@localhost zh]# ip netns exec ns1 bash
[root@localhost zh]# ps
PID TTY          TIME CMD
28408 pts/0    00:00:00 su
28423 pts/0    00:00:00 bash
28985 pts/0    00:00:00 bash//ns1中的bash
29044 pts/0    00:00:00 ps
[root@localhost zh]# ./main
//用“ps -elf”查看main的pid,在另一个shell
4 S root      29065(pid)  28985(ppid)  0  80   0 -  1053 hrtime 11:01 pts/0    00:00:00 ./main

[root@localhost zh]# lsns -t net
    NS        TYPE   NPROCS   PID USER  COMMAND
    4026531956 net     208     1 root  /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    4026532504 net       2 28985 root  bash
    4026532568 net       1  6649 rtkit /usr/libexec/rtkit-daemon

你可能感兴趣的:(lsns -t net和ip netns list的区别)