iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux操作系统中Namespace的作用是什么
  • 494
分享到

Linux操作系统中Namespace的作用是什么

2023-06-16 08:06:52 494人浏览 泡泡鱼
摘要

这期内容当中小编将会给大家带来有关linux操作系统中Namespace的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。namespace的概念namespace 是 Linux 内核用来隔离内

这期内容当中小编将会给大家带来有关linux操作系统中Namespace的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

namespace的概念

namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace  可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个  namespace 中。

Linux操作系统中Namespace的作用是什么

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

namespace的用途

可能绝大多数的使用者和我一样,是在使用 Docker 后才开始了解 linux 的 namespace 技术的。实际上,Linux 内核实现  namespace 的一个主要目的就是实现轻量级虚拟化(容器)服务。在同一个 namespace  下的进程可以感知彼此的变化,而对外界的进程一无所知。这样就可以让容器中的进程产生错觉,认为自己置身于一个独立的系统中,从而达到隔离的目的。也就是说 linux  内核提供的 namespace 技术为 docker 等容器技术的出现和发展提供了基础条件。

我们可以从 docker 实现者的角度考虑该如何实现一个资源隔离的容器。比如是不是可以通过 chroot  命令切换根目录的挂载点,从而隔离文件系统。为了在分布式的环境下进行通信和定位,容器必须要有独立的  IP、端口和路由等,这就需要对网络进行隔离。同时容器还需要一个独立的主机名以便在网络中标识自己。接下来还需要进程间的通信、用户权限等的隔离。运行在容器中的应用需要有进程号(PID),自然也需要与宿主机中的  PID 进行隔离。也就是说这六种隔离能力是实现一个容器的基础,让我们看看 linux 内核的 namespace 特性为我们提供了什么样的隔离能力:

Linux操作系统中Namespace的作用是什么

上表中的前六种 namespace 正是实现容器必须的隔离技术,至于新近提供的 Cgroup namespace 目前还没有被 docker  采用。相信在不久的将来各种容器也会添加对 Cgroup namespace 的支持。

namespace的发展历史

Linux 在很早的版本中就实现了部分的 namespace,比如内核 2.4 就实现了 mount namespace。大多数的 namespace  支持是在内核 2.6 中完成的,比如 IPC、Network、PID、和 UTS。还有个别的 namespace 比较特殊,比如 User,从内核 2.6  就开始实现了,但在内核 3.8 中才宣布完成。同时,随着 Linux 自身的发展以及容器技术持续发展带来的需求,也会有新的 namespace  被支持,比如在内核 4.6 中就添加了 Cgroup namespace。

Linux 提供了多个 api 用来操作 namespace,它们是 clone()、setns() 和 unshare()  函数,为了确定隔离的到底是哪项 namespace,在使用这些 API  时,通常需要指定一些调用参数:CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS  和 CLONE_NEWCGROUP。如果要同时隔离多个 namespace,可以使用 | (按位或)组合这些参数。同时我们还可以通过 /proc  下面的一些文件来操作 namespace。下面就让让我们看看这些接口的简要用法。

查看进程所属的namespace

从版本号为 3.8 的内核开始,/proc/[pid]/ns 目录下会包含进程所属的 namespace 信息,使用下面的命令可以查看当前进程所属的  namespace 信息:

$ ll /proc/$$/ns

Linux操作系统中Namespace的作用是什么

首先,这些 namespace 文件都是链接文件。链接文件的内容的格式为 xxx:[inode number]。其中的 xxx 为 namespace  的类型,inode number 则用来标识一个 namespace,我们也可以把它理解为 namespace 的 ID。如果两个进程的某个 namespace  文件指向同一个链接文件,说明其相关资源在同一个 namespace 中。

其次,在 /proc/[pid]/ns 里放置这些链接文件的另外一个作用是,一旦这些链接文件被打开,只要打开的文件描述符(fd)存在,那么就算该  namespace 下的所有进程都已结束,这个 namespace 也会一直存在,后续的进程还可以再加入进来。

除了打开文件的方式,我们还可以通过文件挂载的方式阻止 namespace 被删除。比如我们可以把当前进程中的 uts 挂载到 ~/uts 文件:

$ touch ~/uts $ sudo mount --bind /proc/$$/ns/uts ~/uts

使用 stat 命令检查下结果:

Linux操作系统中Namespace的作用是什么

很神奇吧,~/uts 的 inode 和链接文件中的 inode number 是一样的,它们是同一个文件。

clone函数

我们可以通过 clone() 在创建新进程的同时创建 namespace。clone() 在 C 语言库中的声明如下:

 #define _GNU_SOURCE #include <sched.h> int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);

实际上,clone() 是在 C 语言库中定义的一个封装(wrapper)函数,它负责建立新进程的堆栈并且调用对编程者隐藏的 clone()  系统调用。Clone() 其实是 linux 系统调用 fork() 的一种更通用的实现方式,它可以通过 flags 来控制使用多少功能。一共有 20 多种  CLONE_ 开头的 falg(标志位) 参数用来控制 clone 进程的方方面面(比如是否与父进程共享虚拟内存等),下面我们只介绍与 namespace  相关的 4 个参数:

  • fn:指定一个由新进程执行的函数。当这个函数返回时,子进程终止。该函数返回一个整数,表示子进程的退出代码。

  • child_stack:传入子进程使用的栈空间,也就是把用户态堆栈指针赋给子进程的 esp 寄存器。调用进程(指调用 clone()  的进程)应该总是为子进程分配新的堆栈。

  • flags:表示使用哪些 CLONE_ 开头的标志位,与 namespace  相关的有CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS  和 CLONE_NEWCGROUP。

  • arg:指向传递给 fn() 函数的参数。

在后续的文章中,我们主要通过 clone() 函数来创建并演示各种类型的 namespace。

setns函数

通过 setns() 函数可以将当前进程加入到已有的 namespace 中。setns() 在 C 语言库中的声明如下:

#define _GNU_SOURCE #include <sched.h> int setns(int fd, int nstype);

和 clone() 函数一样,C 语言库中的 setns() 函数也是对 setns() 系统调用的封装:

  • fd:表示要加入 namespace 的文件描述符。它是一个指向 /proc/[pid]/ns  目录中文件的文件描述符,可以通过直接打开该目录下的链接文件或者打开一个挂载了该目录下链接文件的文件得到。

  • nstype:参数 nstype 让调用者可以检查 fd 指向的 namespace 类型是否符合实际要求。若把该参数设置为 0 表示不检查。

前面我们提到:可以通过挂载的方式把 namespace 保留下来。保留 namespace 的目的是为以后把进程加入这个 namespace 做准备。在  docker 中,使用 docker exec 命令在已经运行着的容器中执行新的命令就需要用到 setns() 函数。为了把新加入的 namespace  利用起来,还需要引入 execve() 系列的函数(笔者在 《Linux 创建子进程执行任务》一文中介绍过 execve()  系列的函数,有兴趣的同学可以前往了解),该函数可以执行用户的命令,比较常见的用法是调用 /bin/bash 并接受参数运行起一个 shell

unshare函数和命令

通过 unshare 函数可以在原进程上进行 namespace 隔离。也就是创建并加入新的 namespace 。unshare() 在 C  语言库中的声明如下:

#define _GNU_SOURCE #include <sched.h> int unshare(int flags);

和前面两个函数一样,C 语言库中的 unshare() 函数也是对 unshare() 系统调用的封装。调用 unshare()  的主要作用就是:不启动新的进程就可以起到资源隔离的效果,相当于跳出原先的 namespace 进行操作。

系统还默认提供了一个叫 unshare 的命令,其实就是在调用 unshare() 系统调用。下面的 demo 使用 unshare 命令把当前进程的  user namespace 设置成了 root:

Linux操作系统中Namespace的作用是什么

上述就是小编为大家分享的Linux操作系统中Namespace的作用是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网操作系统频道。

--结束END--

本文标题: Linux操作系统中Namespace的作用是什么

本文链接: https://www.lsjlt.com/news/282909.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux操作系统中Namespace的作用是什么
    这期内容当中小编将会给大家带来有关Linux操作系统中Namespace的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。namespace的概念namespace 是 Linux 内核用来隔离内...
    99+
    2023-06-16
  • 什么是Linux操作系统
    这篇文章主要讲解了“什么是Linux操作系统”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是Linux操作系统”吧!如果你正在学习Linux操作系统,不知从哪里入手,可以参考下面给出的9...
    99+
    2023-06-10
  • mybatis中namespace的作用是什么
    在MyBatis中,namespace的作用是将SQL语句映射到对应的Java接口或者映射文件上。通过namespace可以将SQL...
    99+
    2024-03-04
    mybatis
  • Linux操作系统中的块设备是什么
    这篇文章主要介绍了Linux操作系统中的块设备是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux操作系统中的块设备是什么文章都会有所收获,下面我们一起来看看吧。在Windows操作系统下磁盘设备似乎...
    99+
    2023-06-16
  • Linux操作系统中rpm有什么用
    这篇文章将为大家详细讲解有关Linux操作系统中rpm有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、 安装rpm包rpm 软件包通常具有类似foo-1.0-1.i386.rpm 的文件名。其中...
    99+
    2023-06-13
  • Linux操作系统中的六种功能是什么
    这篇文章主要介绍“Linux操作系统中的六种功能是什么”,在日常操作中,相信很多人在Linux操作系统中的六种功能是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux操作系统中的六种功能是什么”的疑...
    99+
    2023-06-26
  • 操作系统科普:操作系统到底是什么?
    1. 操作系统的概念 操作系统是计算机系统中最基本的软件,负责管理计算机硬件和软件资源,并为用户提供各种服务。操作系统是计算机系统正常运行的基础,也是用户与计算机系统交互的桥梁。 2. 操作系统的功能 操作系统的功能主要包括以下几个方面...
    99+
    2024-02-05
    操作系统 计算机系统 硬件 软件 资源 服务 Windows Linux macOS Android iOS
  • Linux操作系统单用户模式是什么
    本篇内容介绍了“Linux操作系统单用户模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!做为一个Linux爱好者,每天都渴望得到新的...
    99+
    2023-06-10
  • ubuntu是什么操作系统
    Ubuntu是一个基于Linux内核和Debian发行版的免费开源操作系统。它由南非的开发者Mark Shuttleworth创建,...
    99+
    2024-03-02
    ubuntu
  • Linux操作系统
    在我们的生活中除了常见的Windows系统和MAC系统之外,Linux也是非常常用,现在很多人都想要掌握Linux技术,加入该行列之中,成为专业的技术人员。那么Linux需要杀毒软件吗为大家简单的介绍一下。  Linux系统需要杀毒软件吗一...
    99+
    2023-06-05
  • ubuntu是不是linux操作系统
    本文小编为大家详细介绍“ubuntu是不是linux操作系统”,内容详细,步骤清晰,细节处理妥当,希望这篇“ubuntu是不是linux操作系统”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。ubuntu是一个li...
    99+
    2023-06-29
  • Linux操作系统中Shell程序设计是什么样的
    这篇文章将为大家详细讲解有关Linux操作系统中Shell程序设计是什么样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Shell是种命令解释程序,也可以看作是一种命令语言的解释器。 用户...
    99+
    2023-06-05
  • linux系统中su命令的作用是什么
    linux系统中su命令的作用是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。当我们以root执行su时,su命令会以当前shell进程为父进程来创建一个新的shell进程...
    99+
    2023-06-07
  • linux系统中根目录的作用是什么
    在Linux系统中,根目录(/)是文件系统的顶级目录,它是整个文件系统的起点和基础。根目录的作用如下:1. 文件系统的起点:根目录是...
    99+
    2023-09-29
    linux
  • Linux系统中inode节点的作用是什么
    今天就跟大家聊聊有关Linux系统中inode节点的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、inode是什么?理解inode,要从文件储存说起。文件储存在硬盘上,...
    99+
    2023-06-13
  • Linux服务器操作系统的缺点是什么
    缺乏广泛的商业支持:相比于其他操作系统,Linux的商业支持相对较少,因此在遇到问题时可能需要依赖社区支持或自行解决。 学习...
    99+
    2024-04-24
    服务器 Linux
  • Linux服务器操作系统的优点是什么
    免费开源:Linux是一个免费开源的操作系统,用户不需要支付任何费用就可以使用和修改它。 稳定性:Linux服务器操作系统通...
    99+
    2024-04-24
    服务器 Linux
  • UNIX操作系统指的是什么
    这篇文章的内容主要围绕UNIX操作系统指的是什么进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!学习 Linux 之前,不得不提及 UNIX。UNIX...
    99+
    2023-06-28
  • 什么是操作系统病毒
    操作系统病毒是电脑病毒之一,它会用自己的程序加入操作系统或感染用户电脑取代部分操作系统进行工作,根据病毒自身的特点和被替代的操作系统中合法程序模块对操作系统进行破坏。具有很强的破坏力,会导致整个系统瘫痪。...
    99+
    2024-04-02
  • Linux操作系统&&Linux20+常用入门操作
    目录 1. 前世今生 1.1. Linux发展史 1.2. 开源 1.3. 发行版本 2. OS/操作系统  3. 指令操作  00 man 01 adduser 02 passwd 03 userdel NAME 04 su - NAME...
    99+
    2023-09-01
    linux unix 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作