Linux namespace概述

article/2025/10/6 16:29:30

操作系统通过虚拟内存技术,使得每个用户进程都认为自己拥有所有的物理内存,这是操作系统对内存的虚拟化。操作系统通过分时调度系统,每个进程都能被【公平地】调度执行,即每个进程都能获取到CPU,使得每个进程都认为自己在进程活动期间拥有所有的CPU时间,这是操作系统对CPU的虚拟化。

从这两种虚拟化方式可推知,当使用某种虚拟化技术去管理进程时,进程会认为自己拥有某种物理资源的全部。

虚拟内存和分时系统均是对「物理资源」进行虚拟化,其实操作系统中还有很多「非物理资源」,比如用户权限系统资源、网络协议栈资源、文件系统挂载路径资源等。通过Linux的namespace功能,可以对这些非物理全局资源进行虚拟化。

Linux namespace是在当前运行的系统环境中创建(隔离)另一个进程的运行环境出来,并在此运行环境中将一些必要的系统全局资源进行【虚拟化】。进程可以运行在指定的namespace中,因此,namespace中的每个进程都认为自己拥有所有这些虚拟化的全局资源。

目前,Linux已经支持8种全局资源的虚拟化(每种资源都是随着Linux内核版本的迭代而逐渐加入的,因此有些内核版本可能不具备某种namespace):

  • cgroup namespace:该namespace可单独管理自己的cgroup

  • ipc namespace:该namespace有自己的IPC,比如共享内存、信号量等

  • network namespace:该namespace有自己的网络资源,包括网络协议栈、网络设备、路由表、防火墙、端口等

  • mount namespace:该namespace有自己的挂载信息,即拥有独立的目录层次

  • pid namespace:该namespace有自己的进程号,使得namespace中的进程PID单独编号,比如可以PID=1

  • time namespace:该namespace有自己的启动时间点信息和单调时间,比如可设置某个namespace的开机时间点为1年前启动,再比如不同的namespace创建后可能流逝的时间不一样

  • user namespace:该namespace有自己的用户权限管理机制(比如独立的UID/GID),使得namespace更安全

  • uts namespace:该namepsace有自己的主机信息,包括主机名(hostname)、NIS domain name

用户可以同时创建具有多种资源类型的namespace,比如创建一个同时具有uts、pid和user的namespace。

理解Linux namespace

用户可以创建指定类型的namespace并将程序放入该namespace中运行,这表示从当前的系统运行环境中隔离一个进程的运行环境,在此namespace中运行的进程将认为自己享有该namespace中的独立资源。

实际上,即使用户没有手动创建Linux namespace,Linux系统开机后也会创建一个默认的namespace,称为「root namespace」,所有进程默认都运行在root namespace中,每个进程都认为自己拥有该namespace中的所有系统全局资源。

回顾一下Linux的开机启动流程,内核加载成功后将初始化系统运行环境,这个运行环境就是root namespace环境,系统运行环境初始化完成后,便可以认为操作系统已经开始工作了。

「每一个namespace都基于当前内核」,无论是默认的root namespace还是用户创建的每一个namespace,都基于当前内核工作。所以可以认为namespace是内核加载后启动的一个特殊系统环境,用户进程可以在此环境中独立享用资源。更严格地说,「root namespace直接基于内核,而用户创建的namespace运行环境基于当前所在的namespace」。之所以用户创建的namespace不直接基于内核环境,是因为每一个namespace可能都会修改某些运行时内核参数。

比如,用户创建的uts namespace1中修改了主机名为ns1,然后在namespace1中创建uts namespace2时,namespace2默认「将共享namespace1的其他资源并拷贝namespace1的主机名资源」,因此namespace2的主机名初始时也是ns1。当然,namespace2是隔离的,可以修改其主机名为ns2,这不会影响其他namespace,修改后,将只有namespace2中的进程能看到其主机名为ns2。

可以通过如下方式查看某个进程运行在哪一个namespace中,即该进程享有的独立资源来自于哪一个namespace。

# ls -l /proc/<PID>/ns
$ ls -l /proc/$$/ns | awk '{print $1,$(NF-2),$(NF-1),$NF}'
lrwxrwxrwx  cgroup            ->  cgroup:[4026531835]
lrwxrwxrwx  ipc               ->  ipc:[4026531839]
lrwxrwxrwx  mnt               ->  mnt:[4026531840]
lrwxrwxrwx  net               ->  net:[4026531992]
lrwxrwxrwx  pid               ->  pid:[4026531836]
lrwxrwxrwx  pid_for_children  ->  pid:[4026531836]
lrwxrwxrwx  user              ->  user:[4026531837]
lrwxrwxrwx  uts               ->  uts:[4026531838]$ sudo ls -l /proc/1/ns | awk '{print $1,$(NF-2),$(NF-1),$NF}'
lrwxrwxrwx  cgroup            ->  cgroup:[4026531835]
lrwxrwxrwx  ipc               ->  ipc:[4026531839]
lrwxrwxrwx  mnt               ->  mnt:[4026531840]
lrwxrwxrwx  net               ->  net:[4026531992]
lrwxrwxrwx  pid               ->  pid:[4026531836]
lrwxrwxrwx  pid_for_children  ->  pid:[4026531836]
lrwxrwxrwx  user              ->  user:[4026531837]
lrwxrwxrwx  uts               ->  uts:[4026531838]

这些文件表示当前进程打开的namespace资源,每一个文件都是一个软链接,所指向的文件是一串格式特殊的名称。冒号后面中括号内的数值表示该namespace的inode。如果不同进程的namespace inode相同,说明这些进程属于同一个namespace。

从结果上来看,每个进程都运行在多个namespace中,且pid=1和pid=$$(当前Shell进程)两个进程的namespace完全一样,说明它们运行在相同的环境下(root namespace)


http://chatgpt.dhexx.cn/article/uEOVXgj0.shtml

相关文章

C++ | 你真的了解namespace吗?

文章目录 一、前言二、命名冲突三、命名空间1、域作用限定符2、命名空间的概念&#x1f449;示例1&#x1f449;示例2 3、命名空间的定义4、命名空间的使用① 指定命名空间访问【做项目】② 使用using部分展开【做项目】③ 使用using namespace全局展开【日常练习】 5、小结 解…

using namespace std 介绍

using namespace std&#xff1b; 首先我们要知道&#xff0c;这句代码的意思是&#xff1a;打开标准命名空间&#xff0c;即告诉编辑器我们将要使用名字空间std中的函数或者对象。 using 意思就是正在使用的意思。namespace 的引用是为了解决不同space中命名相同导致命名冲突…

Namespace基本知识

published: true tags: C author: persuez Namespace C中namespace简单来说就是用来控制标志符&#xff08;如变量&#xff0c;函数&#xff0c;类等&#xff09;的名字冲突的。 简单术语 declarative region: 指标志符声明的区域。具体见图一。 potential scope: 指从该标…

【C++】命名空间namespace详解

一、命名空间的引入 C中&#xff0c;名称(name)可以是符号常量、变量、宏、函数、结构体、枚举、类和对象等等。而在大型工程中&#xff0c;难免会有重名的现象&#xff0c;命名空间namespace&#xff0c;就是C引入的一种解决名称冲突的机制 1.1 如何解决命名冲突 C语言中 …

namespace介绍

命名空间 命名空间 namespace 1、::作用域运算符&#xff08;表明 数据、方法 的归属性问题&#xff09; 2、命名空间 namespace 解决命名冲突 2.1&#xff1a;namespace命名空间的定义 2.2:命名空间只能全局范围内定义&#xff08;以下错误写法&#xff09; 2.3:命名空间可嵌套…

【C++】命名空间(namespace)详解

一、为什么使用命名空间 考虑一种情况&#xff0c;当我们有两个同名的人&#xff0c;Zara&#xff0c;在同一个班里。当我们需要对它们进行区分我们必须使用一些额外的信息和它们的名字&#xff0c;比如这个区域&#xff0c;如果它们生活在不同的区域或者它们的母亲或父亲的名…

Python中,线程threading详解

Python中最常用的同步有&#xff1a;锁/互斥&#xff0c;以及信号量。其中锁是最简单最低级的机制&#xff0c;信号量用于多线程竞争有限资源的情况。但是锁被释放&#xff0c;线程不一定被释放。 threading.Lock同步锁&#xff08;原语锁&#xff09; 通常使用获得锁&#xff…

【Python】多线程及threading模块介绍

​目录 1. 多线程简单介绍 2. threading模块介绍 2.1 threading模块常用方法 2.2 Thread类使用 2.2.1 使用构造函数传递可调用对象的方法创建线程 2.2.2 继承threading.Thread类 3. 多线程程序中使用(共享)全局变量 4. 多线程共享全局变量遇到的问题 5. 线程同步 5.1 …

threading库:Python线程的基础知识

目录 前言Thread对象区分线程守护线程自定义线程定时器线程线程间传送信号 前言 前面的subprocess库主要讲解的是进程知识与进程间的交互。而进程有可以拥有多个线程&#xff0c;所以threading库提供了管理多个线程执行的API&#xff0c;允许程序在同一个进程空间并发地运行多…

Python Threading 线程模块用法

一、什么是 Threading Threading用于提供线程相关的操作&#xff0c;线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组&#xff0c;线程也不能被停止、暂停、恢复、中断。 1.1、线程池图解 二、创建线程 导入模块threading&#xff0c;通过…

python中threading模块_python中threading模块详解

python中threading模块详解,threading提供了一个比thread模块更高层的API来提供线程的并发性。这些线程并发运行并共享内存。 下面来看threading模块的具体用法: 一、Thread的使用 目标函数可以实例化一个Thread对象,每个Thread对象代表着一个线程,可以通过start()方法,开…

python中的threading_python中threading的用法

threading提供了一个比thread模块更高层的API来提供线程的并发性。这些线程并发运行并共享内存。 下面来看threading模块的具体用法&#xff1a; 一、Thread的使用 目标函数可以实例化一个Thread对象&#xff0c;每个Thread对象代表着一个线程&#xff0c;可以通过start()方法…

Python--threading多线程总结

转载自&#xff1a;https://www.cnblogs.com/tkqasn/p/5700281.html threading用于提供线程相关的操作&#xff0c;线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组&#xff0c;线程也不能被停止、暂停、恢复、中断。 threading模块提供的类&…

Python 批量创建线程及threading.Thread类的常用函数及方法

在《【Python】线程的创建、执行、互斥、同步、销毁》&#xff08;点击打开链接&#xff09;中介绍了Python中线程的使用&#xff0c;但是里面线程的创建&#xff0c;使用了很原始的方式&#xff0c;一行代码创建一条。其实&#xff0c;Python里是可以批量创建线程的。利用Pyth…

功能强大的python包(十一):threading (多线程)

1.threading简介 threading库是python的线程模型&#xff0c;利用threading库我们可以轻松实现多线程任务。 2.进程与线程简介 通过上图&#xff0c;我们可以直观的总结出进程、线程及其之间的关系与特点&#xff1a; 进程是资源分配的最小单元&#xff0c;一个程序至少包含…

一文搞明白Python多线程编程:threading库

目录 前言一、基础知识1、并行和并发&#xff08;1&#xff09;定义&#xff08;2&#xff09;联系 2、进程和线程&#xff08;1&#xff09;定义&#xff08;2&#xff09;联系 3、全局解释器锁GIL 二、threading库1、线程的使用&#xff08;1&#xff09;普通创建方式&#x…

分块矩阵求逆(推导)

关于分块矩阵求逆&#xff0c;其中对角矩阵比较简单&#xff0c;我看很多人都写了&#xff0c;并且很详细。 但关于AUVD的分块矩阵我没看到太让我明白的&#xff0c;可能我get不到点&#xff0c;数学基础差&#xff0c;我就自己写了详细的步骤。 我写的这个条件是A可逆&#…

伴随矩阵求逆矩阵

在之前的文章《线性代数之矩阵》中已经介绍了一些关于矩阵的基本概念&#xff0c;本篇文章主要就求解逆矩阵进行进一步总结。 余子式(Minor) 我们先看例子来直观的理解什么是余子式(Minor&#xff0c;后边将都用英文Minor&#xff0c;中文的翻译较乱&#xff09;。 minor exa…

矩阵的逆

矩阵的逆 原理&#xff1a; 连接&#xff1a; https://baike.baidu.com/item/%E9%80%86%E7%9F%A9%E9%98%B5 代码&#xff1a; QT c版&#xff1a; //求逆矩阵 QVector<QVector<double>> Matrix_inverse(QVector<QVector<double>> &A) {int …

矩阵求逆

矩阵求逆 初等变换求逆参考文章 初等变换求逆 1&#xff09;初等变换求逆矩阵时不能同时使用初等列变换和初等行变换&#xff0c;使用初等列变换或者初等行变换来求逆矩阵都是可以的&#xff0c;但是不能二者同时使用&#xff0c;只能用一种方法来得到逆矩阵。 2&#xff09;初…