http://man7.org/linux/man-pages/man2/setns.2.html

int setns(int fd, int nstype);

Given a file descriptor referring to a namespace, reassociate the calling thread with that namespace.

当前线程切到fd对应的namespace,并且这个线程上下文中创建的新线程也在这个namespace。

  • fd:要加入的 namespace 的文件描述符,一般为 /proc/[pid]/ns 下某个对应类型 namespace 的软链接;

  • nstype:调用进程想要加入的 namesapce 的类型,其类型对应上文的表格中的 7 种 Namespace 类型:

    • 0:允许加入任何类型的 namespace;
    • CLONE_NEWCGROUPfd 必须指向一个 cgroup 的 namespace;
    • CLONE_NEWIPCfd 必须指向一个 IPC 的 namespace;
    • CLONE_NEWNETfd 必须指向一个 network 的 namespace;
    • CLONE_NEWNSfd 必须指向一个 mount 的 namespace;
    • CLONE_NEWPIDfd 必须指向一个 pid 的 namespace;
    • CLONE_NEWUSERfd 必须指向一个 user 的 namespace;
    • CLONE_NEWUTSfd 必须指向一个 UTS 的 namespace;

/proc 目录与 Namespace

除了 3 个 API 之外,还需要关注 /proc 目录。

自 Linux 3.8 开始,用户就可以在 /proc/[pid]/ns 目录下看到指向不同 namespace 号的文件,如:

1
2
3
4
5
6
7
8
9
10
# ls -l /proc/$$/ns
total 0
lrwxrwxrwx 1 root root 0 Apr 14 13:26 cgroup -> cgroup:[4026531835]
lrwxrwxrwx 1 root root 0 Apr 14 13:26 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 Apr 14 13:26 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 Apr 14 13:26 net -> net:[4026531993]
lrwxrwxrwx 1 root root 0 Apr 14 13:26 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Apr 14 13:26 pid_for_children -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Apr 14 13:26 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Apr 14 13:26 uts -> uts:[4026531838]

每一个进程在其对应的 /proc/[pid]/ns 下都有其 namespace 信息,该目录下每一个文件都是一个软链接,setns() 可以通过打开对应进程下的 ns 目录下的软链接文件来加入到对应的 namespace 中。

该目录下的每个软链接的内容其实是一串字符,由 namespace 类型和 inode number 组成:

1
2
# readlink /proc/$$/ns/uts
uts:[4026531838]

且满足以下几个条件:

  • 若几个进程中对应 namespace 软链接内容一致,则这几个进程同属于同一个 namespace;

  • 即使 namespace 中的进程全部终结了,只要其软链接文件一直处于 open 状态,则 namespace 将一直存在;

参考:https://zhengyinyong.com/introduction-to-linux-namespace.html

setns 切换命名空间,/proc 目录与 Namespace的更多相关文章

  1. Linux中/proc目录下文件详解

    转载于:http://blog.chinaunix.net/uid-10449864-id-2956854.html Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统 ...

  2. Linux下/proc目录简介

    文章转载至:http://blog.csdn.net/zdwzzu2006/article/details/7747977 1. /proc目录Linux 内核提供了一种通过 /proc 文件系统,在 ...

  3. Linux下/proc目录简介(转)

    1. /proc目录Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文 ...

  4. Linux系统的/proc目录

    1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机 制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它 ...

  5. Linux下/proc目录的作用

    文章是摘抄过来,方便自己查阅! 1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在 ...

  6. linux /proc目录

    1. /proc目录Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文 ...

  7. linux /proc目录说明(访问内核数据结构,修改内核设置)

    1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以 ...

  8. /proc 目录详细说明

    /proc路径详细: Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以 ...

  9. Linux下的/proc目录介绍

    proc被称为虚拟文件系统,它是一个控制中心,可以通过更改其中某些文件改变内核运行状态, 它也是内核提空给我们的查询中心,用户可以通过它查看系统硬件及当前运行的进程信息. Linux中许多工具的数据来 ...

随机推荐

  1. JavaScript API 与 DOM

    一.API 1.API 的概念 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供引用程序与开发人员基于某软件或硬件得以访问 ...

  2. Synchronized与ReentrantLock区别总结

    这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍. 相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式 ...

  3. Jmeter如何测试接口

    现在对测试人员的要求越来越高,不仅仅要做好功能测试,对接口测试的需求也越来越多!所以也越来越多的同学问,怎样才能做好接口测试? 要真正的做好接口测试,并且弄懂如何测试接口,需要从如下几个方面去分析问题 ...

  4. Thinkphp5.1允许uni-app的H5跨域请求接口解决方法

    情景: uni-app使用vue框架开发混合APP,虽然APP或者小程序没有跨域,但希望就是写完这个既有H5,又有APP,小程序等,所以能通过后端解决跨域最好.但是不知道是vue的原因还是什么,在PH ...

  5. 一款APP的完整开发流程 (转载)

    来源:https://www.sohu.com/a/239089829_100063940 近年来,在市场和政策的双轮驱动下,我国服务外包产业快速发展,服务智能化趋势显现.随着企业核心业务外包活动的日 ...

  6. kubernetes集群证书过期之后--转发

    步骤 如果有多master,需要在每个master上进行以下操作. 需要进行以下步骤 重新生成证书 重新生成对应的配置文件 重启docker 和 kubelet 拷贝kubectl 客户端文件 [ro ...

  7. gitlab上下载项目

    第一步:下载安装git,在官网下载安装即可,没有账号的自己注册账号: 第二步:在左面空白处点击鼠标右键,点击Git Bash Here,出现对话框: 第三步:配置本地仓库的账号邮箱git: $ git ...

  8. gitlab修改IP地址及仓库地址

    将IP修改为192.168.10.100,操作方法 . 先修改本地的IP地址 vim /etc/sysconfig/network-scripts/ifcfg-eth0TYPE=EthernetBOO ...

  9. C++学习(8)—— 封装

    C++面向对象的三大特性:封装.继承.多态 C++认为万事万物都可以为对象,对象上有其属性和行为 具有相同性质的对象,可以抽象为类   1. 封装的意义 封装是C++面向对象三大特性之一 封装的意义: ...

  10. 图论 - 二分图的判断(dfs染色法)

    二分图的判断(dfs染色法) 如何判断一个图是否为二分图 普通染色法模板 C++ 代码模板如下 思想:先将当前点染色,然后再将该点相连的结点进行染另外一种颜色 下面附上自己画的一张图假设我们从第一个点 ...