你必须了解Linux的命名空间

本篇文章给大家带来了关于linux命名空间的相关知识,命名空间提供了虚拟化的一种轻量级形式,使得我们可以从不同的方面来查看运行系统的全局属性,希望对大家有帮助。

你必须了解Linux的命名空间

一、基本概念

  命名空间(Linux namespace)是linux内核针对实现容器虚拟化映入的一个特性。我们创建的每个容器都有自己的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样,命名空间保证了容器之间互不影响。

  Linux的命名空间机制提供了一种资源隔离的解决方案。PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace。Namespace是对全局系统资源的一种封装隔离,使得处于不同namespace的进程拥有独立的全局系统资源,改变一个namespace中的系统资源只会影响当前namespace里的进程,对其他namespace中的进程没有影响。

  传统上,在Linux以及其他衍生的UNIX变体中,许多资源是全局管理的。例如,系统中的所有进程按照惯例是通过PID标识的,这意味着内核必须管理一个全局的PID列表。而且,所有调用者通过uname系统调用返回的系统相关信息(包括系统名称和有关内核的一些信息)都是相同的。用户ID的管理方式类似,即各个用户是通过一个全局唯一的UID号标识。

  全局ID使得内核可以有选择地允许或拒绝某些特权。虽然UID为0的root用户基本上允许做任何事,但其他用户ID则会受到限制。例如UID为n的用户,不允许杀死属于用户m的进程( m≠ n)。但这不能防止用户看到彼此,即用户n可以看到另一个用户m也在计算机上活动。只要用户只能操纵他们自己的进程,这就没什么问题,因为没有理由不允许用户看到其他用户的进程。

  但有些情况下,这种效果可能是不想要的。如果提供Web主机的供应商打算向用户提供Linux计算机的全部访问权限,包括root权限在内。传统上,这需要为每个用户准备一台计算机,代价太高。使用KVM或VMWare提供的虚拟化环境是一种解决问题的方法,但资源分配做得不是非常好。计算机的各个用户都需要一个独立的内核,以及一份完全安装好的配套的用户层应用。

  命名空间提供了一种不同的解决方案,所需资源较少。在虚拟化的系统中,一台物理计算机可以运行多个内核,可能是并行的多个不同的操作系统。而命名空间则只使用一个内核在一台物理计算机上运作,前述的所有全局资源都通过命名空间抽象起来。这使得可以将一组进程放置到容器中,各个容器彼此隔离。隔离可以使容器的成员与其他容器毫无关系。但也可以通过允许容器进行一定的共享,来降低容器之间的分隔。例如,容器可以设置为使用自身的PID集合,但仍然与其他容器共享部分文件系统。

二、实现

  命名空间的实现需要两个部分:每个子系统的命名空间结构,将此前所有的全局组件包装到命名空间中;将给定进程关联到所属各个命名空间的机制。

  子系统此前的全局属性现在封装到命名空间中,每个进程关联到一个选定的命名空间。每个可以感知命名空间的内核子系统都必须提供一个数据结构,将所有通过命名空间形式提供的对象集中起来。 struct nsproxy用于汇集指向特定于子系统的命名空间包装器的指针。在文件nsproxy.h中有:

/* * A structure to contain pointers to all per-process * namespaces - fs (mount), uts, network, sysvipc, etc. * * The pid namespace is an exception -- it's accessed using * task_active_pid_ns.  The pid namespace here is the * namespace that children will use. * * 'count' is the number of tasks holding a reference. * The count for each namespace, then, will be the number * of nsproxies pointing to it, not the number of tasks. * * The nsproxy is shared by tasks which share all namespaces. * As soon as a single namespace is cloned or unshared, the * nsproxy is copied. */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_for_children;struct net      *net_ns;struct time_namespace *time_ns;struct time_namespace *time_ns_for_children;struct cgroup_namespace *cgroup_ns;};

  当前内核的以下范围可以感知到命名空间

  1、 UTS命名空间包含了运行内核的名称、版本、底层体系结构类型等信息。 UTS是UNIXTimesharing System的简称。

  2、保存在struct ipc_namespace中的所有与进程间通信( IPC)有关的信息。

  3、 已经装载的文件系统的视图,在struct mnt_namespace中给出。

  4、 有关进程ID的信息,由struct pid_namespace提供。

  5、 struct user_namespace保存的用于限制每个用户资源使用的信息。

  6、struct net_ns包含所有网络相关的命名空间参数。

  当我讨论相应的子系统时,会介绍各个命名空间容器的内容。在由于在创建新进程时可使用fork建立一个新的命名空间,因此必须提供控制该行为的适当的标志。每个命名空间都有一个对应的标志,在sched.h文件内:

#define CLONE_NEWCGROUP0x02000000/* New cgroup namespace */#define CLONE_NEWUTS0x04000000/* New utsname namespace */#define CLONE_NEWIPC0x08000000/* New ipc namespace */#define CLONE_NEWUSER0x10000000/* New user namespace */#define CLONE_NEWPID0x20000000/* New pid namespace */#define CLONE_NEWNET0x40000000/* New network namespace */

  不同类型的命名空间的作用:

  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:用于隔离主机名

  每个进程都关联到自身的命名空间视图,在任务定义的结构体task_struct中有如下定义:

struct task_struct {.../* 命名空间 */struct nsproxy *nsproxy;...}

  因为使用了指针,多个进程可以共享一组子命名空间。这样,修改给定的命名空间,对所有属于该命名空间的进程都是可见的。
  init_nsproxy定义了初始的全局命名空间,其中维护了指向各子系统初始的命名空间对象的指针。在kernel/nsproxy.c文件内有

struct nsproxy init_nsproxy = {.count= ATOMIC_INIT(1),.uts_ns= &init_uts_ns,#if defined(CONFIG_POSIX_MQUEUE) || defined(CONFIG_SYSVIPC).ipc_ns= &init_ipc_ns,#endif.mnt_ns= NULL,.pid_ns_for_children= &init_pid_ns,#ifdef CONFIG_NET.net_ns= &init_net,#endif#ifdef CONFIG_CGROUPS.cgroup_ns= &init_cgroup_ns,#endif#ifdef CONFIG_TIME_NS.time_ns= &init_time_ns,.time_ns_for_children= &init_time_ns,#endif};

三、UTS命名空间

  UTS命名空间几乎不需要特别的处理,因为它只需要简单量,没有层次组织。所有相关信息都汇集到下列结构的一个实例中。在utsname.h文件内:

struct uts_namespace {struct new_utsname name;struct user_namespace *user_ns;struct ucounts *ucounts;struct ns_common ns;} __randomize_layout;

  uts_namespace所提供的属性信息本身包含在struct new_utsname中:

struct oldold_utsname {char sysname[9];char nodename[9];char release[9];char version[9];char machine[9];};#define __NEW_UTS_LEN 64struct old_utsname {char sysname[65];char nodename[65];char release[65];char version[65];char machine[65];};struct new_utsname {char sysname[__NEW_UTS_LEN + 1];char nodename[__NEW_UTS_LEN + 1];char release[__NEW_UTS_LEN + 1];char version[__NEW_UTS_LEN + 1];char machine[__NEW_UTS_LEN + 1];char domainname[__NEW_UTS_LEN + 1];}

  各个字符串分别存储了系统的名称( Linux…)、内核发布版本、机器名,等等。使用uname工具可以取得这些属性的当前值,也可以在/proc/sys/kernel/中看到

z@z-virtual-machine:~$ cat /proc/sys/kernel/ostypeLinuxz@z-virtual-machine:~$ cat /proc/sys/kernel/osrelease5.3.0-40-generic

  初始设置保存在init_uts_ns中,在init/version.c文件内:

struct uts_namespace init_uts_ns = {.ns.count = REFCOUNT_INIT(2),.name = {.sysname= UTS_SYSNAME,.nodename= UTS_NODENAME,.release= UTS_RELEASE,.version= UTS_VERSION,.machine= UTS_MACHINE,.domainname= UTS_DOMAINNAME,},.user_ns = &init_user_ns,.ns.inum = PROC_UTS_INIT_INO,#ifdef CONFIG_UTS_NS.ns.ops = &utsns_operations,#endif};

相关推荐:《Linux视频教程》

以上就是你必须了解Linux的命名空间的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/151691.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月3日 13:24:24
下一篇 2025年12月3日 14:09:54

相关推荐

  • 如何通过区块链浏览器查询币种交易历史?

    区块链浏览器是查看加密货币交易历史和链上数据的重要工具,它可以显示每笔交易的时间、数量、发送和接收地址等信息。通过浏览器,投资者可以验证交易记录、分析资金流向以及评估币种活跃度。 新手用户可以在币安(Binance)或欧易OKX获取币种的区块链浏览器入口及交易数据,方便快速查看链上信息。 币安注册链…

    2025年12月9日
    000
  • 以太坊和比特币有什么不同?

    比特币主攻价值存储,%ignore_a_2%侧重可编程应用;前者采用PoW机制、总量固定,后者转向PoS、支持智能合约;2025年以太坊因DeFi与NFT爆发涨幅超比特币,生态更活跃,而比特币仍为避险首选。 以太坊和比特币有什么不同? 作为加密领域两大支柱,以太坊(ETH)和比特币(BTC)在定位、…

    2025年12月9日
    000
  • 什么是Layer-2解决方案?它如何提升区块链性能?

    layer-2解决方案是区块链网络上运行在主链(layer-1)之上的扩展协议,旨在提升交易处理速度、降低手续费并改善网络性能。通过将大量交易或计算移至layer-2,主链可保持安全性同时应对更高的交易量。 对于新手用户,建议在币安(Binance)或欧易OKX关注支持Layer-2网络的币种和交易…

    2025年12月9日
    000
  • 比特币为啥会一直涨,其背后的原理是什么?

    比特币持续上涨的核心在于供给紧缩与需求爆发的结构性失衡,叠加减半机制、机构入场、网络效应、技术迭代及法币信用危机下的避险需求,形成稀缺性与流动性的双引擎驱动。 比特币为啥会一直涨,其背后的原理是什么? 2025年8月,比特币价格突破12万美元大关,较2024年涨幅超50%。其持续上涨的核心逻辑是供给…

    2025年12月9日
    000
  • 比特币里的Token和AI的Token是一回事吗?

    Token是数字世界中的凭证,记录在区块链上,可代表价值、权利或资产。 简单来说,Token(中文常译为“通证”或“代币”)就像是数字世界里的一种凭证。它记录在一种叫做区块链的公开、不可篡改的账本上,可以代表任何有价值的东西,比如所有权、使用权、投票权,甚至是某种数字艺术品。 2025年虚拟货币主流…

    2025年12月9日
    000
  • 币圈一般在哪看行情 在哪看资讯

    对于加密货币投资者而言,及时获取精准的行情数据和前沿资讯是做出正确决策的关键。本文将为您梳理币圈人士常用的行情查看平台和资讯获取渠道,帮助您全面掌握市场动态,在投资路上抢占先机。 在哪里看行情:主流交易所App 交易所是加密货币交易的核心场所,其App通常是查看实时价格、深度图和交易量最直接、最方便…

    2025年12月9日
    000
  • 比特币有什么实际用途吗 比特币的实用价值

    比特币不仅是投机资产,更是全球化支付工具、抗通胀的“数字黄金”、普惠金融载体、资产自主保管方案及闪电网络支持的小额支付革命,其核心价值正被广泛认可。 许多人将比特币视为一种投机性资产,但其价值远不止于价格波动。作为第一个去中心化的数字货币,比特币凭借其独特的技术属性,在现实世界中扮演着越来越重要的角…

    2025年12月9日
    000
  • 怎么购买以太坊 以太坊ETH买入全流程指南

    想买入以太坊(eth)却不知从何下手?本文给出从开户到下单的完整路径,并指出常见问题与规避方式,跟着步骤做即可完成首次购入。 为兼顾安全与流动性,前半程建议在币安与欧易OKX查看实时深度、完成开户与下单;两平台工具完善、成交活跃,更便于新手执行。 币安注册链接与下载地址: 欧易OKX注册与下载地址:…

    2025年12月9日
    000
  • 山寨币季是什么?如何发现?山寨币季节周期推动因素分析

    概述山寨币季指的是比特币以外的加密货币(统称山寨币)整体表现显著优于比特币的市场阶段。这一时期通常伴随着比特币主导地位下降、山寨币交易活跃度上升以及市场风险偏好的增强。它标志着资金从比特币流向更具增长潜力的替代资产,是加密市场周期中的重要环节。识别这一阶段对希望优化投资策略、把握轮动机会的投资者至关…

    2025年12月9日
    000
  • 以太坊(ETH)财库黑马ETHZilla解析:蒂尔和EF深度加持 mNAV高达6

    目录 ethzilla是谁? ETHZilla独特其他ETH DAT之处 1、Peter Thiel持股ETHZilla近30% 2、Vitalik和以太坊基金会入局 3、聚焦DeFi和链上策略 结语 在以太坊财库概念持续升温的背景下,ETH价格强势突破4700美元,距离历史高点仅差150-200美…

    2025年12月9日 好文分享
    000
  • 比特币创历史新高后暴跌7000美元 三大原因详细分析

    比特币在创下历史新高后迅速下跌,主要是由于长期持有者获利了结、交易所衍生品市场高杠杆头寸被大规模清算,以及宏观经济数据带来的不确定性共同作用的结果。 2025年虚拟货币主流交易所: 币安:  欧易:  火币:  三大原因详细分析 原因一:触及高点后的获利了结 当一项资产的价格达到前所未有的高度时,通…

    2025年12月9日
    000
  • 比特币价格在哪看 比特币价格实时查看app

    想要实时掌握比特币价格波动,选择一款好用的查看工具至关重要。本文将为您推荐几款主流且功能强大的app,它们不仅提供精准的实时行情,还附带丰富的图表和数据分析功能,帮助您做出更明智的决策。 主流比特币价格查看App推荐 1. 币安 (Binance)  官网直达: 作为全球领先的数字资产交易平台,币安…

    2025年12月9日
    000
  • 免费行情软件网站app官方版 币圈行情网站app推荐

    对于加密货币投资者而言,及时获取准确的行情数据至关重要。本文将为您推荐几款市场上广受好评的免费币圈行情软件和网站,它们不仅数据全面,而且功能强大,能帮助您轻松掌握市场动态,做出更明智的投资决策。 主流交易所App(行情与交易一体) 交易所App是大多数投资者的首选,因为它们集行情查看、数据分析和交易…

    2025年12月9日
    000
  • 8月第三周将解锁的代币有哪些

    2025年8月第三周加密市场迎来超6.53亿美元代币解锁,涉及30余个项目,FTN、APT、ARB等大额释放引关注,其中ARB单笔解锁占流通量44.48%,CYBER解锁比例高达45.75%致抛压风险上升,叠加SOL、WLD等线性释放及Sapien、Reveel新项目TGE,市场短期承压,投资者需警…

    2025年12月9日
    000
  • 比特币创下新高,交易员发问:BTC价格是否在124,000美元见顶?

    目录 关键要点:链上数据:比特币价格尚未见顶其他技术指标显示比特币价格“可能已见顶” ‍ 近期比特币的技术信号出现分歧,部分指标显示市场过热,而链上数据则暗示上涨趋势仍未结束。 关键要点: 比特币在周四一度触及124,450美元的高点,随后小幅回落。多个技术形态和指标暗示124,000美元区域或为短…

    2025年12月9日 好文分享
    000
  • 币安交易所官网入口 币安最新版v3.2.0APP下载安装

    这里为您提供币安官网入口及最新版v3.2.0官方app下载链接,直接点击即可使用。 币安Binance官网入口地址: 币安Binance v3.2.0官方App下载链接: 币安交易所(Binance)是全球领先的数字资产交易平台之一,支持比特币(BTC)、以太坊(ETH)、狗狗币(DOGE)等数百种…

    2025年12月9日 好文分享
    000
  • Espresso(ESP币)是什么?有什么特别之处?ESP币价格预测和路线图介绍

    目录 Espresso(ESP)上市详情及发布日期关键上市信息Espresso(ESP)价格预测:做市商的影响关键做市商指标基于可比市场活动的价格预测恐惧与贪婪叙述:什么是Espresso (ESP):解释为何投影仪 (ESP) 脱颖而出Espresso(ESP)生态系统:其运作方式认识 Espre…

    2025年12月9日
    000
  • 什么是交易日记?怎么使用?一文详解交易日记

    目录 什么是交易日记?如何创建交易日记如何使用交易日记对交易者的重要性外汇交易日志的关键组成部分1. 交易详情:2. 日期和时间:3. 交易工具:4. 进出点:5. 持仓大小:6. 风险管理:维护交易日志的好处1. 决策改善:2. 识别模式和趋势:3. 情感意识与控制:4. 责任感:交易日志中常见的…

    2025年12月9日
    000
  • 币安交易所正规登录通道 Binance安全官网链接

    本文为您提供币安正规登录通道及binance安全官网链接,方便您快速进入并使用官方服务。 币安Binance安全官网登录入口: 币安Binance官方App下载链接: 币安交易所(Binance)是全球交易量领先的加密货币交易平台之一,支持比特币(BTC)、以太坊(ETH)、BNB等数百种数字资产的…

    2025年12月9日 好文分享
    000
  • OKX虚拟币交易平台官网入口一览(附APP下载地址)

    本文为您整理okx虚拟币交易平台官网入口及官方app下载地址,点击即可快速访问与安装。 OKX欧易官网入口链接: OKX欧易官方App下载地址: OKX交易所(欧易)是全球知名的虚拟币交易平台之一,支持比特币(BTC)、以太坊(ETH)、莱特币(LTC)等多种加密资产的现货、合约、理财及创新产品交易…

    2025年12月9日 好文分享
    000

发表回复

登录后才能评论
关注微信