linux显示进程命名空间,Linux命名空间概述

Linux的命名空间机制提供了一种资源隔离的解决方案。PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace。Linux Namespace机制为实现基于容器的虚拟化技术提供了很好的基础,LXC(Linux containers)就是利用这一特性实现了资源的隔离。不同Container内的进程属于不同的Namespace,彼此透明,互不干扰。

Namespace是对全局系统资源的一种封装隔离,使得处于不同namespace的进程拥有独立的全局系统资源,改变一个namespace中的系统资源只会影响当前namespace里的进程,对其他namespace中的进程没有影响。

Linux查看进程的命名空间

2a14fe583cdf

linux_namespace.PNG

Linux内核支持的namespace类型

目前,Linux内核里面实现了7种不同类型的namespace。

名称 宏定义 隔离内容

Cgroup CLONE_NEWCGROUP Cgroup root directory (since Linux 4.6)

IPC CLONE_NEWIPC System V IPC, POSIX message queues (since Linux 2.6.19)

Network CLONE_NEWNET Network devices, stacks, ports, etc. (since Linux 2.6.24)

Mount CLONE_NEWNS Mount points (since Linux 2.4.19)

PID CLONE_NEWPID Process IDs (since Linux 2.6.24)

User CLONE_NEWUSER User and group IDs (started in Linux 2.6.23 and completed in Linux 3.8)

UTS CLONE_NEWUTS Hostname and NIS domain name (since Linux 2.6.19)

下面简要介绍一个以上不同类型的命名空间的作用:

IPC:用于隔离进程间通讯所需的资源( System V IPC, POSIX message queues),PID命名空间和IPC命名空间可以组合起来用,同一个IPC名字空间内的进程可以彼此看见,允许进行交互,不同空间进程无法交互

Network:Network Namespace为进程提供了一个完全独立的网络协议栈的视图。包括网络设备接口,IPv4和IPv6协议栈,IP路由表,防火墙规则,sockets等等。一个Network Namespace提供了一份独立的网络环境,就跟一个独立的系统一样。

Mount:每个进程都存在于一个mount Namespace里面,mount Namespace为进程提供了一个文件层次视图。如果不设定这个flag,子进程和父进程将共享一个mount Namespace,其后子进程调用mount或umount将会影响到所有该Namespace内的进程。如果子进程在一个独立的mount Namespace里面,就可以调用mount或umount建立一份新的文件层次视图。

PID::linux通过命名空间管理进程号,同一个进程,在不同的命名空间进程号不同!进程命名空间是一个父子结构,子空间对于父空间可见。

User:用于隔离用户

UTS:用于隔离主机名

命名空间相关的API

与命名空间相关的API主要有三个:clone,setns和unshare,这三个API都是针对一个进程来操作的。

clone

clone方法会创建一个新的子进程,然后让子进程加入新的namespace,而当前进程保持不变。

int clone(int (*child_func)(void *), void *child_stac, int flags, void *arg);

setns

setns方法用于将当前进程加入到已有的namespace中。

int setns(int fd, int nstype);

fd:

指向/proc/[pid]/ns/目录里相应namespace对应的文件,

表示要加入哪个namespace

nstype:

指定namespace的类型(上面的任意一个CLONE_NEW*):

1. 如果当前进程不能根据fd得到它的类型,如fd由其他进程创建,

并通过UNIX domain socket传给当前进程,

那么就需要通过nstype来指定fd指向的namespace的类型

2. 如果进程能根据fd得到namespace类型,比如这个fd是由当前进程打开的,

那么nstype设置为0即可

unshare

unshare方法使当前进程退出指定类型的namespace,并加入到新创建的namespace(相当于创建并加入新的namespace)

int unshare(int flags);

flags:

指定一个或者多个namespace的类型

总结

namespace的本质就是把原来所有进程全局共享的资源拆分成了很多个一组一组进程共享的资源

当一个namespace里面的所有进程都退出时,namespace也会被销毁,所以抛开进程谈namespace没有意义

UTS namespace就是进程的一个属性,属性值相同的一组进程就属于同一个namespace,跟这组进程之间有没有亲戚关系无关

UTS namespace没有嵌套关系,即不存在说一个namespace是另一个namespace的父namespace

参考文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值