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

Linux内核中的命名空间详解

Linux内核中的命名空间详解引言命名空间Namespace是Linux内核中实现资源隔离的重要机制它为容器技术提供了基础支持。通过命名空间不同的进程可以看到不同的系统视图实现了进程间的隔离。本文将深入探讨Linux内核中的命名空间机制包括其原理、类型和应用。命名空间的基本概念1. 命名空间的定义命名空间是一种将系统资源隔离的机制使得不同命名空间中的进程看到的系统资源是不同的。2. 命名空间的优势隔离性不同命名空间中的进程相互隔离轻量级相比虚拟机命名空间开销小灵活性可以为不同的进程组提供不同的资源视图安全性提高系统安全性3. 命名空间的类型命名空间类型系统调用参数隔离的资源MountCLONE_NEWNS挂载点UTSCLONE_NEWUTS主机名和域名IPCCLONE_NEWIPC进程间通信PIDCLONE_NEWPID进程IDNetworkCLONE_NEWNET网络设备、协议栈UserCLONE_NEWUSER用户和组IDCgroupCLONE_NEWCGROUPcgroup根目录命名空间的API1. 创建命名空间#define _GNU_SOURCE #include sched.h #include stdio.h #include stdlib.h #include unistd.h int child_func(void *arg) { printf(Child process PID: %d\n, getpid()); // 执行子进程逻辑 return 0; } int main() { char *stack malloc(1024 * 1024); if (!stack) { perror(malloc); return 1; } // 创建新的PID命名空间 pid_t pid clone(child_func, stack 1024 * 1024, CLONE_NEWPID | SIGCHLD, NULL); if (pid 0) { perror(clone); return 1; } printf(Parent process PID: %d, Child PID: %d\n, getpid(), pid); wait(NULL); free(stack); return 0; }2. 进入命名空间#include sched.h #include fcntl.h #include unistd.h int main() { // 打开命名空间文件 int fd open(/proc/1/ns/pid, O_RDONLY); if (fd 0) { perror(open); return 1; } // 进入命名空间 if (setns(fd, CLONE_NEWPID) 0) { perror(setns); close(fd); return 1; } close(fd); printf(Entered PID namespace\n); return 0; }3. 查看命名空间# 查看进程的命名空间 ls -l /proc/$$/ns/ # 查看命名空间的inode号 ls -i /proc/$$/ns/* # 挂载命名空间 mount --bind /proc/1/ns/pid /mnt/pid命名空间的实现1. 命名空间的结构#include linux/nsproxy.h 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; struct net *net_ns; struct cgroup_namespace *cgroup_ns; }; struct task_struct { struct nsproxy *nsproxy; // 其他字段... };2. 命名空间的创建// 复制命名空间 struct nsproxy *copy_namespaces(unsigned long flags, struct task_struct *tsk) { struct nsproxy *new_nsp; new_nsp create_new_namespaces(flags, tsk, tsk-ns_capable, NULL); if (!new_nsp) return ERR_PTR(-ENOMEM); return new_nsp; }3. 命名空间的切换// 切换命名空间 int setns(int fd, int nstype) { struct fd f; int err; f fdget(fd); if (!f.file) return -EBADF; err security_setns(f.file, nstype); if (!err) err ns_file_to_ns(f.file, nstype); fdput(f); return err; }各种命名空间的详细说明1. Mount命名空间Mount命名空间隔离文件系统挂载点。# 创建新的mount命名空间 unshare --mount # 在新的mount命名空间中挂载 mount -t tmpfs tmpfs /mnt # 验证隔离 mount2. UTS命名空间UTS命名空间隔离主机名和域名。# 创建新的UTS命名空间 unshare --uts # 修改主机名 sethostname container # 验证 hostname3. IPC命名空间IPC命名空间隔离进程间通信资源。# 创建新的IPC命名空间 unshare --ipc # 查看IPC资源 ipcs4. PID命名空间PID命名空间隔离进程ID。# 创建新的PID命名空间 unshare --pid --fork # 查看PID ps aux # 进程在新命名空间中PID为15. Network命名空间Network命名空间隔离网络设备、协议栈等。# 创建新的network命名空间 ip netns add ns1 # 在命名空间中执行命令 ip netns exec ns1 ip link list # 配置网络 ip link add veth0 type veth peer name veth1 ip link set veth1 netns ns1 ip addr add 10.0.0.1/24 dev veth0 ip netns exec ns1 ip addr add 10.0.0.2/24 dev veth1 ip link set veth0 up ip netns exec ns1 ip link set veth1 up6. User命名空间User命名空间隔离用户和组ID。# 创建新的user命名空间 unshare --user # 查看用户ID id # 映射用户ID echo 0 1000 1 /proc/self/uid_map echo 0 1000 1 /proc/self/gid_map7. Cgroup命名空间Cgroup命名空间隔离cgroup根目录。# 创建新的cgroup命名空间 unshare --cgroup # 查看cgroup挂载 mount | grep cgroup命名空间的应用1. 容器技术Docker、Podman等容器技术使用命名空间实现隔离。# 运行一个容器 docker run -it --name test ubuntu bash # 查看容器的命名空间 docker inspect --format {{ .State.Pid }} test ls -l /proc/$(docker inspect --format {{ .State.Pid }} test)/ns/2. 网络隔离使用Network命名空间实现网络隔离。# 创建网络命名空间 ip netns add ns1 ip netns add ns2 # 创建veth对 ip link add veth1 type veth peer name veth2 ip link add veth3 type veth peer name veth4 # 分配veth到命名空间 ip link set veth1 netns ns1 ip link set veth3 netns ns2 # 配置IP ip netns exec ns1 ip addr add 10.0.1.1/24 dev veth1 ip netns exec ns2 ip addr add 10.0.2.1/24 dev veth3 # 启动接口 ip netns exec ns1 ip link set veth1 up ip netns exec ns2 ip link set veth3 up3. 安全隔离使用User命名空间提高安全性。# 以普通用户创建user命名空间 unshare --user --map-root-user # 现在是命名空间中的root用户 id # 但在主机上仍然是普通用户 cat /proc/self/uid_map命名空间的性能影响1. 性能考虑创建开销命名空间的创建开销很小运行时开销几乎没有运行时开销资源使用共享系统资源节省内存2. 性能测试# 测试命名空间创建时间 time unshare --pid --fork true # 测试命名空间切换时间 time nsenter --pid/proc/1/ns/pid true3. 优化策略重用命名空间减少创建开销合理使用命名空间只使用必要的命名空间避免嵌套过深过多的命名空间嵌套会增加复杂性实际案例分析1. 简单容器实现#define _GNU_SOURCE #include sched.h #include stdio.h #include stdlib.h #include unistd.h #include sys/mount.h int container(void *arg) { // 挂载proc文件系统 mount(proc, /proc, proc, 0, NULL); // 修改主机名 sethostname(container, 9); // 执行shell execl(/bin/bash, bash, NULL); return 0; } int main() { char *stack malloc(1024 * 1024); if (!stack) { perror(malloc); return 1; } // 创建多个命名空间 int flags CLONE_NEWNS | CLONE_NEWUTS | CLONE_NEWPID | CLONE_NEWNET | SIGCHLD; pid_t pid clone(container, stack 1024 * 1024, flags, NULL); if (pid 0) { perror(clone); return 1; } wait(NULL); free(stack); return 0; }2. 网络命名空间应用#!/bin/bash # 创建网络命名空间 ip netns add client ip netns add server # 创建veth对 ip link add veth-client type veth peer name veth-server # 分配到命名空间 ip link set veth-client netns client ip link set veth-server netns server # 配置IP ip netns exec client ip addr add 192.168.1.1/24 dev veth-client ip netns exec server ip addr add 192.168.1.2/24 dev veth-server # 启动接口 ip netns exec client ip link set veth-client up ip netns exec server ip link set veth-server up # 测试连接 ip netns exec client ping -c 3 192.168.1.23. 用户命名空间应用#!/bin/bash # 创建用户命名空间并映射用户ID unshare --user --map-root-user bash -c echo 0 1000 1 /proc/self/uid_map; echo 0 1000 1 /proc/self/gid_map; id # 在命名空间中运行服务 unshare --user --map-root-user bash -c echo 0 1000 1 /proc/self/uid_map; echo 0 1000 1 /proc/self/gid_map; python3 -m http.server 8080结论命名空间是Linux内核中实现资源隔离的重要机制它为容器技术提供了基础支持。通过不同类型的命名空间Linux实现了进程、网络、文件系统等资源的隔离使得容器能够在一个安全、隔离的环境中运行。理解命名空间的原理和使用方法对于容器开发、系统安全和资源管理都有重要意义。随着容器技术的不断发展命名空间的应用也将更加广泛。

相关文章:

Linux内核中的命名空间详解

Linux内核中的命名空间详解 引言 命名空间(Namespace)是Linux内核中实现资源隔离的重要机制,它为容器技术提供了基础支持。通过命名空间,不同的进程可以看到不同的系统视图,实现了进程间的隔离。本文将深入探讨Linux内…...

手把手调参:解决OpenCV光流法追踪“跟丢”和“鬼影”的实战指南

手把手调参:解决OpenCV光流法追踪“跟丢”和“鬼影”的实战指南 去年在开发一套工业质检系统时,我们遇到了一个棘手问题:传送带上的零件因为表面反光和快速移动,导致光流追踪频繁丢失目标。经过两周的密集调参和算法优化&#xff…...

Linux内核中的热插拔详解

Linux内核中的热插拔详解 引言 热插拔(Hotplug)是Linux内核中的一项重要功能,它允许在系统运行时动态添加或移除硬件设备,无需重启系统。热插拔技术大大提高了系统的灵活性和可用性,广泛应用于服务器、工作站和嵌入式系…...

从玩具四轴到工业机械臂:无刷电机120度与180度导通角该怎么选?实战经验分享

从玩具四轴到工业机械臂:无刷电机120度与180度导通角该怎么选?实战经验分享 当你在设计一台需要精确控制的无人机或工业机械臂时,无刷电机的驱动策略选择往往成为决定项目成败的关键因素之一。我曾见过一个团队花费数月时间优化机械臂算法&am…...

LangGraph架构深度解析:如何构建企业级状态化智能体工作流

LangGraph架构深度解析:如何构建企业级状态化智能体工作流 【免费下载链接】langgraph Build resilient language agents as graphs. 项目地址: https://gitcode.com/GitHub_Trending/la/langgraph LangGraph是一个基于Pregel算法的低层级编排框架&#xff0…...

根据WFWORKITEM 表的< PROCESSDEFNAME>字段关联WFPROCESSDEFPROPERTIES表获取对应app_code

问题描述&#xff1a; 根据WFWORKITEM 表的< PROCESSDEFNAME>字段关联WFPROCESSDEFPROPERTIES表获取对应app_code 解答: 因为WFPROCESSDEFPROPERTIES表在同一个<tenant_id>&#xff08;租户&#xff09;的<PROCESSDEFNAME>值是唯一的&#xff0c; 所以可…...

Linux I/O 演进史:从管道到零拷贝,一篇串起个服务端核心原语于

前言 在使用 kubectl get $KIND -o yaml 查看 k8s 资源时&#xff0c;输出结果中包含大量由集群自动生成的元数据&#xff08;如 managedFields、resourceVersion、uid 等&#xff09;。这些信息在实际复用 yaml 清单时需要手动清理&#xff0c;增加了额外的工作量。 使用 kube…...

RIGOL DS2302A-S数字示波器:高性能信号分析的终极解决方案

1. 为什么工程师都爱用RIGOL DS2302A-S&#xff1f; 第一次接触RIGOL DS2302A-S是在调试一块高速PCB板时&#xff0c;当时手头的示波器死活抓不到那个诡异的时钟抖动。同事把他的DS2302A-S推过来&#xff0c;300MHz带宽配合2GSa/s采样率&#xff0c;瞬间就让那个藏在噪声里的3n…...

Windows注册表深度解析:核心结构与关键应用场景

1. Windows注册表的核心结构解析 第一次打开注册表编辑器时&#xff0c;那个树状结构的界面可能会让人望而生畏。但当你理解它的设计逻辑后&#xff0c;会发现这个"系统大管家"其实很有条理。注册表的核心是五大根键&#xff08;Root Key&#xff09;&#xff0c;每个…...

科哥Face Fusion镜像:UI界面自定义修改,实现边框特效的保姆级教程

科哥Face Fusion镜像&#xff1a;UI界面自定义修改&#xff0c;实现边框特效的保姆级教程 1. 从基础融合到创意特效的升级之路 如果你已经体验过科哥Face Fusion镜像的基础人脸融合功能&#xff0c;可能会好奇&#xff1a;这个强大的工具能否进一步个性化&#xff1f;比如为合…...

Piggy_Packages V2026.1 帮助文档(九)模式评估

获取Piggy_Packages 还没有Piggy_Packages的同学&#xff0c;请参考这篇帖子获取&#xff1a; Piggy_Packages V2026.1 帮助文档&#xff08;一&#xff09;开箱即用 模型评估工具&#xff08;MET&#xff09;是一种常用的对WRF预报结果进行评估的工具。今天我们来学习一项它…...

深入探讨Android Framework开发工程师:职责、技术与面试指南

引言 Android Framework开发工程师是移动操作系统领域的核心角色,负责构建和维护Android系统的底层框架。该岗位要求深入理解系统架构,解决性能瓶颈,并确保应用稳定性。随着Android生态的快速发展,掌握Framework开发技术成为高级工程师的必备技能。本文基于标准职位描述,…...

我试了四种去除 Gemini 水印的方法,整理成一篇实用对比驹

认识Pass层级结构 Pass范围从上到下一共分为5个层级&#xff1a; 模块层级&#xff1a;单个.ll或.bc文件 调用图层级&#xff1a;函数调用的关系。 函数层级&#xff1a;单个函数。 基本块层级&#xff1a;单个代码块。例如C语言中{}括起来的最小代码。 指令层级&#xff1a;单…...

基于蓝牙BLE芯片的无人机识别参考方案

蓝牙BLE芯片的底层能力&#xff0c;主要集中在射频信号处理、基带算法、网络协议栈以及低功耗全局优化几个方面。以市面上典型的方案为例&#xff0c;采用青稞RISC-V处理器内核作为计算核心&#xff0c;同时集成了USB、防水级触摸感应、NFC、段式LCD等多种外设接口。这意味着它…...

【大模型工程化生死线】:版本失控=线上崩盘?3步构建军工级回滚机制

第一章&#xff1a;大模型工程化版本管理与回滚机制 2026奇点智能技术大会(https://ml-summit.org) 大模型工程化中的版本管理远超传统软件的 Git commit 粒度&#xff0c;需同时追踪模型权重、Tokenizer 配置、训练超参、推理服务镜像及依赖环境快照。单一 SHA 哈希已无法承载…...

如何在 Go 中构建支持持久化存储的权威 DNS 服务器

本文介绍如何基于 miekg/dns 库实现具备持久化能力的权威 dns 服务器&#xff0c;涵盖原生 zone 文件支持、外部存储集成方案&#xff08;如 etcd&#xff09;&#xff0c;以及实际部署注意事项。 本文介绍如何基于 miekg/dns 库实现具备持久化能力的权威 dns 服务器&…...

GLM-4.1V-9B-Base效果展示:中文菜单图片→菜品识别→价格/辣度/推荐指数

GLM-4.1V-9B-Base效果展示&#xff1a;中文菜单图片→菜品识别→价格/辣度/推荐指数 1. 模型介绍 GLM-4.1V-9B-Base是智谱开源的一款视觉多模态理解模型&#xff0c;专门针对中文场景下的图像理解任务进行了优化。不同于普通的图像识别模型&#xff0c;它能够结合视觉内容和自…...

重新思考输入边界:QKeyMapper如何颠覆Windows平台输入设备协作范式

重新思考输入边界&#xff1a;QKeyMapper如何颠覆Windows平台输入设备协作范式 【免费下载链接】QKeyMapper [按键映射工具] QKeyMapper&#xff0c;Qt开发Win10&Win11可用&#xff0c;不修改注册表、不需重新启动系统&#xff0c;可立即生效和停止。支持游戏手柄映射到键鼠…...

LLM服务SLA跌破99.2%?(GPU资源利用率不足31%真相曝光)——弹性伸缩动态水位算法实战手册

第一章&#xff1a;LLM服务SLA跌破99.2%&#xff1f;——GPU资源利用率不足31%的系统性归因 2026奇点智能技术大会(https://ml-summit.org) 当大模型推理服务的端到端SLA连续三小时低于99.2%&#xff0c;而监控平台却显示A100集群平均GPU利用率长期徘徊在28%–31%之间时&#…...

江西市口碑好的专业中专学校哪家权威

江西市口碑好的专业中专学校哪家权威在江西省&#xff0c;选择一所口碑好且权威的专业中专学校对于学生未来的职业发展至关重要。赣州现代科技职业学校作为赣州市的一所知名职业高中&#xff0c;在教学质量、实训设施以及就业保障等方面都表现出色&#xff0c;是众多学子和家长…...

为什么92%的AI原生应用无法精准归因故障?曝光3个被忽视的OpenTelemetry SDK陷阱、2个LLM Token级Span拆分反模式

第一章&#xff1a;AI原生软件研发链路追踪系统搭建 2026奇点智能技术大会(https://ml-summit.org) AI原生软件的研发过程高度依赖模型版本、数据集快照、训练参数、推理服务部署状态及用户反馈信号的强关联性。传统APM工具难以刻画从Prompt工程→微调训练→RAG索引更新→LLM网…...

OpenCore Legacy Patcher终极指南:4步解决老Mac显卡驱动与系统升级问题

OpenCore Legacy Patcher终极指南&#xff1a;4步解决老Mac显卡驱动与系统升级问题 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否还在为老款Mac无法升…...

语言介绍、软件安装、项目创建、输出语句、注释

C# 语言简绍C#是什么&#xff1f;1.C# 编程是基于 C 和 C 编程语言衍生出来的面向对象的编程语言2.C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。C#与C和C的对比1.C#是由C和C衍生出来的面向对象的编程语言。2.它在继承C和C强大功能的同时去…...

混合型MMC多电平整流侧仿真研究:电压电流双闭环控制与环流抑制策略的实现

混合型MMC多电平&#xff0c;整流侧仿真&#xff0c;加入了电压电流双闭环&#xff0c;环流抑制&#xff0c;子模块电容电压均压控制&#xff0c;采用载波移相调制 PS&#xff1a;仿真搭建不易&#xff0c;仅一个仿真最近在实验室熬了几个通宵&#xff0c;终于搞定了混合型MMC多…...

TEKLauncher:5分钟解决方舟MOD冲突,让游戏体验提升300%的终极方案

TEKLauncher&#xff1a;5分钟解决方舟MOD冲突&#xff0c;让游戏体验提升300%的终极方案 【免费下载链接】TEKLauncher Launcher for ARK: Survival Evolved 项目地址: https://gitcode.com/gh_mirrors/te/TEKLauncher 你是否曾经花费数小时下载和安装《方舟&#xff1…...

Flutter图片宽高获取实战:本地与网络图片处理指南

1. Flutter图片宽高获取的核心场景 在移动应用开发中&#xff0c;图片处理是个高频需求。特别是在IM聊天应用里&#xff0c;用户发送的图片需要根据原始尺寸进行等比缩放&#xff0c;否则就会出现变形或者显示不全的问题。我做过一个社交项目&#xff0c;用户上传的图片尺寸千奇…...

PIDtoolbox:工业控制系统PID参数优化的专业级黑盒分析工具

PIDtoolbox&#xff1a;工业控制系统PID参数优化的专业级黑盒分析工具 【免费下载链接】PIDtoolbox PIDtoolbox is a set of graphical tools for analyzing blackbox log data 项目地址: https://gitcode.com/gh_mirrors/pi/PIDtoolbox 在工业自动化、无人机飞控和机器…...

保姆级教程:在RTX 4090上复现TVCG2024顶会论文PGSR(3D高斯表面重建)

在RTX 4090上实战复现PGSR&#xff1a;3D高斯表面重建的完整工程指南 当3D高斯抛雪球&#xff08;3DGS&#xff09;遇上几何约束&#xff0c;会碰撞出怎样的火花&#xff1f;ZJU-3DV团队发表在TVCG2024的PGSR论文&#xff0c;通过平面化高斯表示和几何正则化&#xff0c;在保持…...

如何轻松下载PS3游戏更新补丁:终极免费工具指南

如何轻松下载PS3游戏更新补丁&#xff1a;终极免费工具指南 【免费下载链接】PS3GameUpdateDownloader downloader for ps3 game updates (.pkg files) from official sony servers written in python 项目地址: https://gitcode.com/gh_mirrors/ps/PS3GameUpdateDownloader …...

【LATEX】IEEE期刊排版技巧:用minipage替代subfigure解决caption格式冲突

1. IEEE期刊LaTeX排版中的caption格式问题 第一次给IEEE期刊投稿时&#xff0c;我被caption格式问题折磨得够呛。记得当时凌晨三点&#xff0c;我盯着屏幕上那个怎么都改不成大写的"Figure 1"字样&#xff0c;差点把键盘摔了。这种看似简单的问题&#xff0c;往往最能…...