当前位置: 首页 > 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.jsqmd.com/news/990466/

相关文章:

  • 从1个列表到1亿个元素:用Python生成器省下760MB内存的实战选择指南
  • 三步搭建你的Steam饰品交易智能助手:24小时监控四大平台挂刀比例
  • 鄂尔多斯市本地2026年最新黄金回收靠谱门店TOP排行榜+白银回收+铂金回收+彩金回收及联系方式+地址+电话+诚信店铺推荐 - 盛世金银回收
  • 阳泉市2026年最新黄金回收+白银回收+铂金回收+彩金回收门店TOP排行榜+推荐及联系方式+地址+电话+靠谱店铺指南 - 大熊猫898989
  • Citra模拟器终极指南:如何快速安装和配置3DS游戏模拟器
  • 2026年精密齿轮厂家选购参考指南:高精密齿轮、非标定制齿轮、螺旋伞齿、研磨磨齿齿轮工程优质厂商汇总 - 海棠依旧大
  • 乐山市本地2026年最新黄金回收靠谱门店TOP排行榜+白银回收+铂金回收+彩金回收及联系方式+地址+电话+诚信店铺推荐 - 盛世金银回收
  • 长春市闲置黄金安全变现全攻略与商家对比 - 润富黄金回收
  • 终极Voyager指南:5分钟掌握Laravel后台管理系统定制
  • 秋冬服装如何稳赚?AI数据化运营抢占换季红利
  • 丽江市本地2026年最新黄金回收靠谱门店TOP排行榜+白银回收+铂金回收+彩金回收及联系方式+地址+电话+诚信店铺推荐 - 盛世金银回收
  • 宜宾市2026年最新黄金回收+白银回收+铂金回收+彩金回收门店TOP排行榜+推荐及联系方式+地址+电话+靠谱店铺指南 - 大熊猫898989
  • 多行业落地:AI知识库与售前售后智能体一体化架构设计
  • 如何高效备份Bandcamp音乐收藏:Python脚本完整指南
  • 鄂州市本地2026年最新黄金回收靠谱门店TOP排行榜+白银回收+铂金回收+彩金回收及联系方式+地址+电话+诚信店铺推荐 - 盛世金银回收
  • 2026人像抠图保姆级教程:免费工具推荐,3步搞定发丝级抠图
  • 【办公效率工具】 Windows11 从零搭建 OpenClaw 详细步骤(包含安装包)
  • 水文测绘船远程监控物联网系统方案
  • 还在手搭Spring Boot脚手架?飞算JavaAI智能引导30秒搞定
  • 用Python生成Voronoi图:从算法原理到代码实战(附完整源码)
  • 丽水市本地2026年最新黄金回收靠谱门店TOP排行榜+白银回收+铂金回收+彩金回收及联系方式+地址+电话+诚信店铺推荐 - 盛世金银回收
  • 宜昌市2026年最新黄金回收+白银回收+铂金回收+彩金回收门店TOP排行榜+推荐及联系方式+地址+电话+靠谱店铺指南 - 大熊猫898989
  • 【分享】WiFi万能钥匙极速版最新版⭐纯净无广告 一键连无线网⭐
  • C# WPF开发的STM32串口ISP烧录工具,含独立通信模块与可运行DEMO
  • py每日spider案例之无损music搜索接口
  • 防城港市本地2026年最新黄金回收靠谱门店TOP排行榜+白银回收+铂金回收+彩金回收及联系方式+地址+电话+诚信店铺推荐 - 盛世金银回收
  • Xbox 战略主管承认低估内存危机,全力重新思考下一代 Helix 游戏机计划
  • 告别安装焦虑:手把手教你用Conda搞定PyRosetta 4(附学术证书申请与镜像源配置)
  • A股量化策略日报(2026年06月10日)
  • 互联网大厂 Java 求职面试:燕双非的搞笑技术问答