《深入理解OpenStack Neutron》—2.2 namespace
2.2 namespace
namespace是Linux虚拟网络的一个重要概念。传统的Linux的许多资源是全局的,比如进程ID资源。而namespace的目的首先就是将这些资源做资源隔离。Linux可以在一个Host内创建许多namespace,于是那些原本是Linux全局的资源,就变成了namespace范围内的“全局”资源,而且不同namespace的资源互相不可见、彼此透明。
Linux具体将哪些全局资源做了隔离呢?看Linux相应的代码最直接、最直观:
// nsproxy.h
struct nsproxy {
atomic_t count;
struct uts_namespace *uts_ns;
struct ipc_namespace *ipc_ns;
struct mnt_namespace *mnt_ns;
struct pid_namespace *pid_ns;
struct user_namespace *user_ns;
struct net *net_ns;
};
以上6个资源,就是Linux namespace所隔离的资源,其基本含义如表2-1所示。
表2-1 Linux namespace隔离的资源
从资源隔离的角度,Linux namespace的示意图如图2-2所示。
图2-2 Linux namespace示意图
图2-2表明,每个namespace里面将原本是全局资源的进行了隔离,彼此互相不可见。同时在Linux的Host或者VM中,当然也会有一套相关的资源。
单纯从网络的视角来看,一个namespace提供了一份独立的网络协议栈(网络设备接口、IPv4、IPv6、IP路由、防火墙规则、sockets等)。一个设备(Linux Device)只能位于一个namespace中,不同namespace中的设备可以利用veth pair进行桥接(veth pair会在2.3节进行介绍)。
Linux操作namespace的命令是ip netns。这个命令行的帮助如下:
ip netns help
Usage: ip netns list
ip netns add NAME
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
我们首先创建一个namespace:
# 首先查看一下当前的 namespace 列表
ip netns list
# 因为当前没有 namespace,所以上面的命令行没有任何返回
#创建一个 namespace,名字是 ns_test
ip netns add ns_test
# 再查看一下当前的 namespace 列表,发现有一个 namespace: ns_test
ip netns list
ns_test #这个是 ip netns list 的返回值
当我们创建一个namespace以后,我们可以把原来创建的虚拟设备tap_test迁移到这个namespace里去,命令行如下:
ip link set tap_test netns ns_test
这个时候,我们在原来的host/vm里面再执行ip link list命令,就会发现这个设备tap_test消失了(因为搬迁到namespace ns_test里去了)。
那么,我们如何查看或者操作namespace里面的设备呢?其命令行格式为:
ip [-all] netns exec [NAME] cmd ... // cmd为想要操作的命令行
比如我们要管理ns_test里面的设备,执行命令如下:
(1)在ns_test里执行ip link list
ip netns exec ns_test ip link list
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: tap_test: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group
default qlen 1000
link/ether aa:bb:84:9f:a5:0c brd ff:ff:ff:ff:ff:ff
(2)在ns_test里执行ifconf?ig -a
ip netns exec ns_test ifconfig -a
lo: flags=8<LOOPBACK> mtu 65536
......
tap_test: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether aa:bb:84:9f:a5:0c txqueuelen 1000 (Ethernet)
......
(3)绑定IP地址
ip netns exec ns_test ifconfig tap_test 192.168.50.1/24 up
(4)查看IP地址
ip netns exec ns_test ifconfig -a
lo: flags=8<LOOPBACK> mtu 65536
loop txqueuelen 1 (Local Loopback)
......
tap_test: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.50.1 netmask 255.255.255.0 broadcast 192.168.50.255
ether aa:bb:84:9f:a5:0c txqueuelen 1000 (Ethernet)
......
namespace先介绍到这里,在后面的相关测试用例中,我们还会继续介绍。
- 点赞
- 收藏
- 关注作者
评论(0)