《深入理解OpenStack Neutron》—2.2 namespace

举报
华章计算机 发表于 2019/05/30 11:01:45 2019/05/30
【摘要】 本书摘自《深入理解OpenStack Neutron》一书中的第2章,第2.2节,作者是李宗标。

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隔离的资源

image.png


从资源隔离的角度,Linux namespace的示意图如图2-2所示。

image.png

图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先介绍到这里,在后面的相关测试用例中,我们还会继续介绍。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。