Linux操作系统中的Namespace是个什么鬼
|
实际上,clone() 是在 C 语言库中定义的一个封装(wrapper)函数,它负责建立新进程的堆栈并且调用对编程者隐藏的 clone() 系统调用。Clone() 其实是 linux 系统调用 fork() 的一种更通用的实现方式,它可以通过 flags 来控制使用多少功能。一共有 20 多种 CLONE_ 开头的 falg(标志位) 参数用来控制 clone 进程的方方面面(比如是否与父进程共享虚拟内存等),下面我们只介绍与 namespace 相关的 4 个参数:
在后续的文章中,我们主要通过 clone() 函数来创建并演示各种类型的 namespace。 setns函数 通过 setns() 函数可以将当前进程加入到已有的 namespace 中。setns() 在 C 语言库中的声明如下:
和 clone() 函数一样,C 语言库中的 setns() 函数也是对 setns() 系统调用的封装:
前面我们提到:可以通过挂载的方式把 namespace 保留下来。保留 namespace 的目的是为以后把进程加入这个 namespace 做准备。在 docker 中,使用 docker exec 命令在已经运行着的容器中执行新的命令就需要用到 setns() 函数。为了把新加入的 namespace 利用起来,还需要引入 execve() 系列的函数(笔者在 《Linux 创建子进程执行任务》一文中介绍过 execve() 系列的函数,有兴趣的同学可以前往了解),该函数可以执行用户的命令,比较常见的用法是调用 /bin/bash 并接受参数运行起一个 shell。 unshare函数和命令 通过 unshare 函数可以在原进程上进行 namespace 隔离。也就是创建并加入新的 namespace 。unshare() 在 C 语言库中的声明如下:
和前面两个函数一样,C 语言库中的 unshare() 函数也是对 unshare() 系统调用的封装。调用 unshare() 的主要作用就是:不启动新的进程就可以起到资源隔离的效果,相当于跳出原先的 namespace 进行操作。 系统还默认提供了一个叫 unshare 的命令,其实就是在调用 unshare() 系统调用。下面的 demo 使用 unshare 命令把当前进程的 user namespace 设置成了 root: 总结 namespace 是 linux 内核提供的特性,为虚拟化而生。随着 docker 的诞生引爆了容器技术,也把长期在后台默默奉献的 namespace 技术推到了大家的面前。笔者试图通过对 namespace 技术的学习和理解来加深对容器技术的认识,所以接下来会通过文章记录学习 namespace 的点点滴滴,希望能和同学们一起进步。 【编辑推荐】
点赞 0 (编辑:信阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何阻止程序在Windows 10中连接到Internet
- Windows 10错误distributedcom 10016:我该如何解决?
- Linux 里的 exFAT 是微软的“特洛伊木马”
- windows-server-2008 – 为什么任务管理器不显示来自Hyper-
- 如何实现Linux + Windows双系统启动
- 新提交记录暗示:Fuchsia 要支持 Java 语言了?
- 微软变了:Windows未来会成为Linux的一部分?
- 如何在Ubuntu 18.04 LTS中获取Linux 5.0内核
- 使您的手机应用程序在Windows 10中通过移动数据进行同步
- Windows 10电脑硬盘怎样合并分区
