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

【docker】namespace底层机制

Linux 的 Namespace 机制是实现容器化(如 Docker、LXC 等)的核心技术之一,它通过隔离系统资源(如进程、网络、文件系统等)为进程提供独立的运行环境。其底层机制涉及内核数据结构、系统调用和进程管理。以下是其核心实现原理的详细分析:


Namespace 的类型

Linux 支持多种类型的 Namespace,每种类型隔离不同的资源:

  • PID Namespace:隔离进程 ID。
  • Mount Namespace:隔离文件系统挂载点。
  • UTS Namespace:隔离主机名和域名。
  • IPC Namespace:隔离进程间通信(消息队列、共享内存等)。
  • Network Namespace:隔离网络设备、协议栈、端口等。
  • User Namespace:隔离用户和用户组 ID(支持权限隔离)。
  • Cgroup Namespace(Linux 4.6+):隔离 Cgroup 根目录视图。
  • Time Namespace(Linux 5.6+):隔离系统时间。

Namespace 生命周期

  • 引用计数:每个 Namespace 结构体通过引用计数(atomic_t count)管理生命周期。
    • 当最后一个引用该 Namespace 的进程退出时,Namespace 被销毁。
  • 持久化:通过挂载 /proc/<pid>/ns/ 下的符号链接,可以将 Namespace 文件描述符保持打开状态,防止其自动释放。

具体实现示例

(1) PID Namespace
  • 隔离机制:每个 PID Namespace 有独立的进程 ID 空间,进程在不同 Namespace 中可拥有不同的 PID。
  • 层级结构:PID Namespace 是层次化的,子 Namespace 可见父 Namespace 的进程,但父 Namespace 无法看到子 Namespace 的进程。
  • proc 文件系统:在 PID Namespace 中,/proc 仅显示当前 Namespace 可见的进程。
(2) Network Namespace
  • 隔离资源:网络设备、IP 地址、路由表、防火墙规则等。
  • 实现方式
    • 每个 Network Namespace 有自己的 struct net 结构体。
    • 通过 veth 虚拟设备连接不同 Namespace。
(3) User Namespace
  • 权限隔离:允许非特权用户在 User Namespace 内拥有完整权限(如 root),但在外部仍为非特权用户。
  • Capabilities:进程在 User Namespace 内可拥有特定的权能(Capabilities)。

与 VFS 和 Cgroups 的交互

  • Mount Namespace:通过 VFS(虚拟文件系统)的挂载点树实现隔离,每个 Namespace 维护独立的挂载视图。
  • Cgroup Namespace:隔离 Cgroup 文件系统的视图,使容器内的进程只能看到自身的 Cgroup 层级。

用户态工具

  • unshare 命令:直接调用 unshare() 系统调用创建新 Namespace。
  • nsenter 命令:进入指定进程的 Namespace。
  • ip netns:管理 Network Namespace。

性能与安全性

  • 低开销:Namespace 是轻量级的,主要依赖内核数据结构隔离。
  • 安全边界:User Namespace 是容器安全的关键,需结合 Capabilities 和 Seccomp 进一步限制权限。

总结

Linux Namespace 的底层机制通过内核数据结构的隔离、引用计数管理和系统调用协作,实现了资源的轻量级虚拟化。这种机制为容器化技术提供了基础,使多个进程能够在同一主机上运行且互不干扰。理解其实现细节有助于优化容器性能、排查隔离问题及设计更安全的运行时环境。


底层扩展

内核数据结构

(1) task_struct 结构体

每个进程(或线程)的内核描述符 task_struct 中有一个字段 nsproxy,指向一个 struct nsproxy 对象,该对象管理进程所属的所有 Namespace:

struct task_struct {// ...struct nsproxy *nsproxy;// ...
};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 cgroup_namespace *cgroup_ns;struct time_namespace *time_ns;// ...
};
  • 每个类型的 Namespace 对应一个独立的内核结构体(如 uts_namespacepid_namespace)。
  • 进程通过 nsproxy 共享或隔离资源视图。
(2) Namespace 的创建与继承
  • 创建新 Namespace:通过 clone()unshare() 系统调用时指定 CLONE_NEW* 标志(如 CLONE_NEWPID),内核会复制或新建对应的 Namespace 结构体。
  • 继承机制:默认情况下,子进程继承父进程的 Namespace;通过 clone()flags 参数可控制是否共享或创建新 Namespace。

关键系统调用

(1) clone()

创建新进程时指定 Namespace:

int clone(int (*fn)(void *), void *stack, int flags, void *arg, ...);
  • flags 参数指定要创建的 Namespace 类型(如 CLONE_NEWPID 创建新 PID Namespace)。
  • 内核会为新进程分配新的 nsproxy 结构,并初始化对应的 Namespace。
(2) unshare()

将当前进程从某个共享的 Namespace 中分离,创建新的 Namespace:

int unshare(int flags);
  • 例如:unshare(CLONE_NEWNET) 会让当前进程进入一个新的 Network Namespace。
(3) setns()

将进程加入一个已存在的 Namespace:

int setns(int fd, int nstype);
  • fd 是目标 Namespace 的文件描述符(通常通过 /proc/<pid>/ns/ 目录获取)。

相关文章:

【docker】namespace底层机制

Linux 的 Namespace 机制是实现容器化&#xff08;如 Docker、LXC 等&#xff09;的核心技术之一&#xff0c;它通过隔离系统资源&#xff08;如进程、网络、文件系统等&#xff09;为进程提供独立的运行环境。其底层机制涉及内核数据结构、系统调用和进程管理。以下是其核心实…...

【每天认识一个漏洞】url重定向

&#x1f31d;博客主页&#xff1a;菜鸟小羊 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 常见应用场景 主要是业务逻辑中需要进行跳转的地方。比如登录处、注册处、访问用户信息、订单信息、加入购物车、分享、收…...

端口映射/内网穿透方式及问题解决:warning: remote port forwarding failed for listen port

文章目录 需求&#xff1a;A机器是内网机器&#xff0c;B机器是公网服务器&#xff0c;想要从公网&#xff0c;访问A机器的端口方式&#xff1a;端口映射&#xff0c;内网穿透&#xff0c;使用ssh打洞端口&#xff1a;遇到问题&#xff1a;命令执行成功&#xff0c;但是端口转发…...

Polardb开发者大会

这是第二次参加这个大会 还有不少老朋友 好多年没有这种经历了–大会讲的我不是很懂 10几年前参会&#xff0c;那时候自己不懂。后来就慢慢懂了。这些年参会都虽然还在不断学习&#xff0c;但是没觉得自己差距很大了。 这次出来很不一样&#xff0c;一堆新的技能&#xff0c;这…...

从二维随机变量到多维随机变量

二维随机变量 设 X X X和 Y Y Y是定义在同一样本空间 Ω \varOmega Ω上的两个随机变量&#xff0c;称由它们组成的向量 ( X , Y ) (X, Y) (X,Y)为二维随机变量&#xff0c;亦称为二维随机向量&#xff0c;其中称 X X X和 Y Y Y是二维随机变量的分量。 采用多个随机变量去描述…...

Vulnhub靶场 Kioptrix: Level 1.3 (#4) 练习

目录 0x00 环境准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用0x04 总结 0x00 环境准备 下载&#xff1a;https://download.vulnhub.com/kioptrix/Kioptrix4_vmware.rar 解压后得到的是vmdk文件。在vm中新建虚拟机&#xff0c;稍后安装操作系统&#xff0c;系统选…...

权重生成图像

简介 前面提到的许多生成模型都有保存了生成器的权重,本章主要介绍如何使用训练好的权重文件通过生成器生成图像。 但是如何使用权重生成图像呢? 一、参数配置 ima_size 为图像尺寸,这个需要跟你模型训练的时候resize的时候一样。 latent_dim为噪声维度,一般的设置都是…...

实时时钟(RTC)/日历芯片PCF8563的I2C读写驱动(2):功能介绍

0 参考资料 PCF8563数据手册&#xff08;第 11 版——2015 年 10 月 26 日&#xff09;.pdf 1 功能介绍 1.1 实时时钟&#xff08;RTC&#xff09;/日历 &#xff08;1&#xff09;PCF8563支持实时时钟&#xff08;RTC&#xff09;&#xff0c;提供时、分、秒信息。对应寄存器…...

猿大师播放器:HTML内嵌VLC播放RTSP视频流,无需转码,300ms级延迟,碾压服务器转码方案

在智慧城市、工业安全、应急指挥等关键领域&#xff0c;实时视频监控已成为守护生命与财产的核心防线‌。然而&#xff0c;行业普遍面临三大矛盾&#xff1a; ‌实时性要求与高延迟矛盾‌&#xff1a;火灾蔓延速度达1米/秒&#xff0c;化工泄漏扩散仅需数秒&#xff0c;传统方…...

牛客刷题自留-深度学习

1、当在卷积神经网络中加入池化层(pooling layer)时&#xff0c;平移变换的不变性会被保留&#xff0c;是吗&#xff1f; 正常答案: C A 不知道 B 看情况 C 是 D 否 平移变换不变性的概念 平移变换不变性指的是当输入图像发生小范围的平移时&#xff0c;模型的输出结果不会发…...

AI 时代下,操作系统如何进化与重构?

AI 时代下&#xff0c;操作系统如何进化与重构&#xff1f; AI时代服务器操作系统技术挑战2024 龙蜥操作系统大会最关注的是哪些议题分享与讨论&#xff1f;对于操作系统未来的发展趋势&#xff0c;有哪些观察和建议 2024 龙蜥操作系统大会&#xff08;OpenAnolis Conference&a…...

Hadoop最新版本hadoop-3.4.1搭建伪分布式集群以及相关报错解决

一&#xff1a;概述 Hadoop 是一个开源的分布式计算框架&#xff0c;广泛应用于大数据处理。伪分布式集群是 Hadoop 的一种部署模式&#xff0c;它可以在单台机器上模拟集群环境&#xff0c;适合初学者进行学习和实验。本文将详细介绍如何在单台机器上搭建 Hadoop 3.4.1 的伪分…...

Android SDK与NDK的区别

Android SDK&#xff08;Software Development Kit&#xff09;与NDK&#xff08;Native Development Kit&#xff09;在Android应用开发中各自扮演着重要角色&#xff0c;它们之间存在显著的区别。以下是Android SDK与NDK的主要区别&#xff1a; 一、定义与用途 Android SDK…...

【保姆级视频教程(二)】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测!

【2025全站首发】YOLOv12训练数据集构建&#xff1a;标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测&#xff01; 文章目录 1. 数据集准备1.1 标签格式转换1.2 数据集划分1.3 yaml配置文件创建 2. 训练验证 1. 数据集准备 示例数据集下载链接&#xff1a;P…...

smolagents学习笔记系列(八)Examples - Master you knowledge base with agentic RAG

这篇文章锁定官网教程中 Examples 章节中的 Master you knowledge base with agentic RAG 文章&#xff0c;主要介绍了如何将 agent 和 RAG 结合使用。 官网链接&#xff1a;https://huggingface.co/docs/smolagents/v1.9.2/en/examples/rag&#xff1b; Agentic RAG 在之前的…...

满血版DeepSeek R1使用体验

硅基流动的满血版DeepSeek&#xff0c;通过CheeryStudio可以轻松访问&#xff0c;告别DeepSeek官网服务器繁忙&#xff0c;https://cloud.siliconflow.cn/i/ewlWR6A9 即可注册 https://cloud.siliconflow.cn/i/ewlWR6A9https://cloud.siliconflow.cn/i/ewlWR6A9 一、硅基流动平…...

Java类中的this操作

在Java中,`this` 是一个关键字,用于引用当前对象的实例。它通常在类的方法或构造器中使用,主要有以下几种用途: 1. 区分成员变量和局部变量 当成员变量与局部变量同名时,使用 `this` 可以明确引用当前对象的成员变量。 public class Person { private String name; …...

LeetCode刷题---双指针---532

数组中的 k-diff 数对 532. 数组中的 k-diff 数对 - 力扣&#xff08;LeetCode&#xff09; 题目 给你一个整数数组 nums 和一个整数 k&#xff0c;请你在数组中找出 不同的 k-diff 数对&#xff0c;并返回不同的 k-diff 数对 的数目。 k-diff 数对定义为一个整数对 (nums[…...

cpp单调栈模板

题目如下 如果利用暴力解法&#xff0c;时间复杂度是O&#xff08;n^2&#xff09; 只能过60%的数据 AC解法&#xff1a; 利用单调栈的算法&#xff0c;单调栈里存的是之前遍历过的元素的下标&#xff0c;如果满足while的条件就将栈顶元素记录&#xff0c;然后将其弹出&#x…...

PyCharm 的使用 + PyCharm快捷键 + 切换中文界面

2025 - 02 - 27 - 第 62 篇 Author: 郑龙浩 / 仟濹 【PyCharm的使用】 文章目录 如何使用Pycharm1 新建工程&#xff0c;新建 .py 文件&#xff0c;运行2 常用快捷键3 其他快捷键 - DeepSeek 总结如下**代码编辑****导航与定位****查找与替换****运行与调试****代码重构****其…...

FUXA工业监控平台架构深度解析:基于Web的SCADA/HMI系统技术实现与性能优化

FUXA工业监控平台架构深度解析&#xff1a;基于Web的SCADA/HMI系统技术实现与性能优化 【免费下载链接】FUXA Web-based Process Visualization (SCADA/HMI/Dashboard) software 项目地址: https://gitcode.com/gh_mirrors/fu/FUXA FUXA是一款现代化的Web-based Process…...

Horizon UAG配置踩坑实录:为什么你的连接服务器状态总是红色?

Horizon UAG配置实战&#xff1a;从红色警报到绿色畅通的完整指南 当你盯着Horizon UAG管理界面那个刺眼的红色连接状态时&#xff0c;那种挫败感我深有体会。作为企业虚拟桌面架构的关键组件&#xff0c;UAG网关服务器的配置问题可能导致整个远程办公系统瘫痪。本文将带你深入…...

ADS1232IPWR如何把24位Σ-Δ ADC和PGA装进紧凑封装

1. 核心定位&#xff1a;24位Σ-Δ ADC&#xff0c;专为桥式传感器优化ADS1232IPWR是TI ADS123x系列的一员&#xff0c;是一颗精密24位Σ-Δ型模数转换器。它的“本职工作”非常明确&#xff1a;为桥式传感器应用提供完整的前端解决方案&#xff0c;包括电子秤、应变计和压力传…...

一条命令搞定OpenClaw部署?PPClaw的便利背后,你得先看清这些代价

先说结论PPClaw通过云端沙箱和命令行工具&#xff0c;确实能大幅降低OpenClaw的初始部署门槛&#xff0c;尤其适合快速验证场景。这种便利性背后&#xff0c;意味着你将依赖PPIO的特定环境&#xff0c;可能面临供应商锁定和长期成本不可预测的风险。对于需要深度定制或大规模生…...

如何关闭Data Guard保护模式_降级为Max Performance以恢复主库读写

必须先确认保护模式和数据库角色&#xff0c;仅MAXIMUM AVAILABILITY或MAXIMUM PROTECTION需降级&#xff1b;执行前须停同步、确保主库OPEN且备库无MRP进程&#xff1b;降级后若仍不可写&#xff0c;需排查STANDBY_FILE_MANAGEMENT、归档目标状态及FORCE LOGGING等隐含依赖。确…...

OpenCode问题解决:常见安装配置错误与快速排查方法

OpenCode问题解决&#xff1a;常见安装配置错误与快速排查方法 1. 引言 OpenCode作为一款开源的AI编程助手框架&#xff0c;凭借其终端优先、多模型支持和隐私安全等特性&#xff0c;已经成为开发者社区的热门工具。然而在实际安装和使用过程中&#xff0c;不少开发者会遇到各…...

突破性AI语音转换实战指南:RVC从入门到精通的完整路径

突破性AI语音转换实战指南&#xff1a;RVC从入门到精通的完整路径 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Convers…...

Unity UI圆角效果实战:从Shader原理到高级应用完整指南

Unity UI圆角效果实战&#xff1a;从Shader原理到高级应用完整指南 【免费下载链接】Unity-UI-Rounded-Corners These components and shaders allow you to add rounded corners to UI elements! 项目地址: https://gitcode.com/gh_mirrors/un/Unity-UI-Rounded-Corners …...

Claude Code安装和接入deepseek笔记

序言 Claude Code安装不需要注册Claude账号&#xff0c;因为https://claude.com/ 不对国内大陆地区提供服务&#xff0c;正常访问无法注册账号。不注册Claude账号只是无法使用 Claude Code提供的大模型&#xff0c;正好我也想接入deepseek来使用&#xff0c;因此在接入自己的大…...

CSL编辑器实战指南:3种学术场景下的高效引用样式管理方案

CSL编辑器实战指南&#xff1a;3种学术场景下的高效引用样式管理方案 【免费下载链接】csl-editor cslEditorLib - A HTML 5 library for searching and editing CSL styles 项目地址: https://gitcode.com/gh_mirrors/csl/csl-editor CSL编辑器是一款基于HTML5的引用样…...