Linux内核实现名称空间的创建
ip netns命令
可以借助ip netns命令来完成对 Network Namespace 的各种操作。ip netns命令来自于iproute安装包,一般系统会默认安装,如果没有的话,请自行安装
[root@localhost ~]# rpm -qa|grep iproute
iproute-5.12.0-4.el8.x86_64
[root@localhost ~]# systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
docker.socket
[root@localhost ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled;>
Active: inactive (dead) since Thu 2022-04-28 22:17:30 CST; 2s ago
Docs: https://docs.docker.com
Process: 1307 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/r>
Main PID: 1307 (code=exited, status=0/SUCCESS)
Apr 28 14:57:26 localhost.localdomain dockerd[1307]: time="2022-04->
Apr 28 14:57:26 localhost.localdomain dockerd[1307]: time="2022-04->
Apr 28 14:57:26 localhost.localdomain dockerd[1307]: time="2022-04->
Apr 28 14:57:26 localhost.localdomain systemd[1]: Started Docker Ap>
Apr 28 14:57:26 localhost.localdomain dockerd[1307]: time="2022-04->
Apr 28 22:17:30 localhost.localdomain systemd[1]: Stopping Docker A>
Apr 28 22:17:30 localhost.localdomain dockerd[1307]: time="2022-04->
Apr 28 22:17:30 localhost.localdomain dockerd[1307]: time="2022-04->
Apr 28 22:17:30 localhost.localdomain systemd[1]: docker.service: S>
Apr 28 22:17:30 localhost.localdomain systemd[1]: Stopped Docker Ap>
lines 1-17/17 (END)
注意:ip netns命令修改网络配置时需要 sudo 权限。
可以通过ip netns命令完成对Network Namespace 的相关操作,可以通过ip netns help查看命令帮助信息:
[root@localhost ~]# ip netns help
Usage: ip netns list //查看
ip netns add NAME //添加名称空间
ip netns attach NAME PID //进入
ip netns set NAME NETNSID //设置名字
ip [-all] netns delete [NAME] //删除
ip netns identify [PID]
ip netns pids NAME
ip [-all] netns exec [NAME] cmd ... //进入
ip netns monitor //监控
ip netns list-id [target-nsid POSITIVE-INT] [nsid POSITIVE-INT]
NETNSID := auto | POSITIVE-INT
[root@localhost ~]#
默认情况下,Linux系统中是没有任何 Network Namespace的,所以ip netns list命令不会返回任何信息。
创建Network Namespace
通过命令创建一个名为ns0的命名空间:
[root@localhost ~]# ip netns list //列出当前有哪些名称空间
[root@localhost ~]# ip netns add ns0 //添加一个ns0的名称空间
[root@localhost ~]# ip netns list
ns0
新创建的 Network Namespace 会出现在/var/run/netns/目录下。如果相同名字的 namespace 已经存在,命令会报Cannot create namespace file “/var/run/netns/ns0”: File exists的错误。
[root@localhost ~]# ls /var/run/netns/
ns0
[root@localhost ~]# ip netns add ns0
Cannot create namespace file "/var/run/netns/ns0": File exists
对于每个 Network Namespace 来说,它会有自己独立的网卡、路由表、ARP 表、iptables 等和网络相关的资源。
操作Network Namespace
ip命令提供了ip netns exec
子命令可以在对应的 Network Namespace 中执行命令。
查看新创建 Network Namespace 的网卡信息
[root@localhost ~]# ip netns exec ns0 ip a
1: lo: <LOOPB