当前位置: 首页 > news >正文

nsproxy

简单来说:nsproxy(Namespace Proxy)是 Linux 内核中用来“打包和管理”一个进程所拥有的所有 Namespace 的结构体。如果把进程比作一个“自然人”,那么nsproxy就是这个人的“身份证明大礼包”,里面装了他属于哪个国家(网络)、哪个家族(PID)、哪个共享文件区(Mount)的所有证明。


1. 为什么内核需要nsproxy

在 Linux 内核中,每一个进程都由一个巨大的结构体task_struct(也就是常说的进程控制块 / PCB)来表示。

早期 Linux 的 Namespace 种类很少,内核直接把 Namespace 指针塞在task_struct里面。但随着 Linux 支持的 Namespace 越来越多(目前有 PID、Network、Mount、IPC、UTS、User、Cgroup、Time 等 8 种以上),如果每个进程的task_struct都直接挂载 8 个不同的指针,会导致两个严重问题:

  1. 结构体过度臃肿:占用过多的内核内存。
  2. 复制和共享极其低效:在 Linux 中,很多父子进程或同一容器内的进程是共享某些 Namespace 的(比如同一个 Pod 内的容器共享 Network Namespace)。

为了解决这个问题,内核开发者做了一层抽象:把所有 Namespace 的指针收纳到一个独立的结构体中,这个结构体就叫struct nsproxy


2.nsproxy的内部结构

在 Linux 内核源码(include/linux/nsproxy.h)中,nsproxy的定义大致如下(简化版):

structnsproxy{atomic_tcount;// 引用计数,记录有多少个进程正在共享这个 nsproxystructuts_namespace*uts_ns;// 主机名与域名空间structipc_namespace*ipc_ns;// 进程间通信空间structmnt_namespace*mnt_ns;// 文件系统挂载点空间structpid_namespace*pid_ns_for_children;// 子进程的 PID 空间structnet_namespace*net_ns;// 网络协议栈空间structcgroup_namespace*cgroup_ns;// cgroup 拓扑空间structtime_namespace*time_ns;// 系统时间空间};

它的工作原理:

  • 解耦与共享:task_struct内部现在只需要保留一个指针指向nsproxy。如果两个进程属于同一个 Docker 容器,它们的task_struct->nsproxy指针就会指向同一个nsproxy实例
  • 引用计数(count):当一个新进程加入这些命名空间时,count加 1;当进程退出时,count减 1。只有当count减到 0 时,内核才会真正销毁这个nsproxy及其包含的各种 Namespace。

3.nsproxy在系统调用中的体现

你在使用 Docker 或进行容器底层开发时,常用的三个 Linux 系统调用,在内核里全是在对nsproxy进行增删改查:

1.clone()—— 创建新进程

当你启动一个新容器时,Docker 会调用clone()并传入控制参数(如CLONE_NEWNET | CLONE_NEWPID)。

  • 内核行为:内核发现你需要新的空间,于是会复制(Copy)父进程的nsproxy,创建一个新的nsproxy实例,并把 Network 和 PID 空间替换为新创建的,最后让新进程指向这个新的nsproxy

2.unshare()—— 孤立当前进程

允许当前进程主动脱离当前的某个 Namespace。

  • 内核行为:创建一个新的nsproxy,把指定的 Namespace 剥离出来替换掉,然后更新当前进程的指针。

3.setns()—— 加入已有空间

这就是docker exec(进入一个正在运行的容器)的底层原理。

  • 内核行为:找到目标容器进程的nsproxy,然后把当前bash进程的task_struct->nsproxy指针直接指向目标容器的nsproxy(或者其中的某几个 Namespace)。此时,你的bash就瞬间“穿越”到了容器内部。

总结

如果把 Linux 容器比作一栋大楼:

  • Namespace是大楼里划分出的一个个独立房间。
  • task_struct是在房间里工作的人。
  • nsproxy就是钥匙串。每个人手里不需要抓着一堆单独的房门钥匙,只需要拿着nsproxy这串钥匙,就能决定他能进入哪间办公室(Network)、哪间档案室(Mount)和哪间会议室(PID)。
http://www.gsyq.cn/news/1502214.html

相关文章:

  • 乐山市本地2026年最新黄金回收靠谱门店TOP排行榜+白银回收+铂金回收+彩金回收及联系方式+地址+电话+诚信店铺推荐 - 盛世金银回收
  • 鄂尔多斯市本地2026年最新黄金回收靠谱门店TOP排行榜+白银回收+铂金回收+彩金回收及联系方式+地址+电话+诚信店铺推荐 - 盛世金银回收
  • 秋冬服装如何稳赚?AI数据化运营抢占换季红利
  • 宜宾市2026年最新黄金回收+白银回收+铂金回收+彩金回收门店TOP排行榜+推荐及联系方式+地址+电话+靠谱店铺指南 - 大熊猫898989
  • 多行业落地:AI知识库与售前售后智能体一体化架构设计
  • 【办公效率工具】 Windows11 从零搭建 OpenClaw 详细步骤(包含安装包)
  • 还在手搭Spring Boot脚手架?飞算JavaAI智能引导30秒搞定
  • 水文测绘船远程监控物联网系统方案
  • 用Python生成Voronoi图:从算法原理到代码实战(附完整源码)
  • Xbox 战略主管承认低估内存危机,全力重新思考下一代 Helix 游戏机计划
  • C# WPF开发的STM32串口ISP烧录工具,含独立通信模块与可运行DEMO
  • 宜昌市2026年最新黄金回收+白银回收+铂金回收+彩金回收门店TOP排行榜+推荐及联系方式+地址+电话+靠谱店铺指南 - 大熊猫898989
  • 告别安装焦虑:手把手教你用Conda搞定PyRosetta 4(附学术证书申请与镜像源配置)
  • A股量化策略日报(2026年06月10日)
  • 实体店要不要做小程序?不盲目跟风,看懂 4 大实用价值再投入
  • 2026年6月央国企求职机构深度评测:5大平台实力解析与选择指南 - 品牌推荐
  • 河南粮无忧选购指南。 - myqiye
  • 基于OpenCV+PyTorch的手势识别控制套件,含训练/推理/视频预处理全流程脚本
  • 从eMMC到UFS 3.0:手把手带你用Wireshark抓包分析手机存储协议变迁
  • 辽源市本地2026年最新黄金回收靠谱门店TOP排行榜+白银回收+铂金回收+彩金回收及联系方式+地址+电话+诚信店铺推荐 - 盛世金银回收
  • 2026最新阳泉黄金回收价格表 避坑与商家推荐 - 余生黄金回收
  • 企业 AI 应用场景方案性价比高吗? - myqiye
  • 一键备份QQ空间历史说说的终极方案:永久珍藏你的数字记忆
  • 5步实现Windows三指拖拽:从MacBook用户到高效工作者的完美转换
  • 北斗B1C/B2a新频点PPP定位,为什么必须处理卫星硬件延迟?一个C++读取OSB文件的例子
  • Navicat Mac版无限试用重置终极指南:免费简单快速重置14天试用期
  • RStudio效率翻倍:巧用Wind/iFinD的‘超级命令’和插件,告别手动写API代码
  • 打工跳槽折腾多年,醒悟安稳大于折腾
  • 2026年6月附近网红火锅品牌推荐分析,美食/老火锅/烧菜火锅/火锅店/火锅/特色美食/社区火锅,火锅品牌推荐分析 - 品牌推荐师
  • PCIe如何从AI浪潮中获益,并借助扩展协议持续进化