操作系统通过虚拟内存技术,使得每个用户进程都认为自己拥有所有的物理内存,这是操作系统对内存的虚拟化。操作系统通过分时调度系统,每个进程都能被【公平地】调度执行,即每个进程都能获取到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)

Linux namespace概述相关推荐

  1. linux namespace的概述

    1.Linux Namespace namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共 用同一 ...

  2. 【网址收藏】linux namespace和cgroup

    namespace 包含了Linux目前常用的6个namespace的介绍 Linux Namespace系列(01):Namespace概述 Linux Namespace系列(02):UTS na ...

  3. Docker基础技术:Linux Namespace【上】

    点点收获: //之前发现Coolshell上好久不更新了, 博主果然去搞大业去了,只恨这几篇文章看到太晚了啊~太厉害了. 1.  clone(), unshare(), setns()初识; 主要是š ...

  4. 资源隔离之 Linux namespace

    Linux namespace 简称 ns,在 2002 年 2.4.19 内核中被引入,发展到今天已经有 15 个年头了. 2010 年后国内云计算爆发,紧接着 2013 年 Docker 崛起,n ...

  5. c++ namespace和linux namespace

    一.c++中的namespace 在C++语言中,命名空间使用namespace来声明,并使用{ }来界定命名空间的作用域.命名空间可以是全局的,也可以位于另一命名空间之中:但不能在类和代码块之中.按 ...

  6. Docker 基础技术之 Linux namespace 源码分析

    上篇我们从进程 clone 的角度,结合代码简单分析了 Linux 提供的 6 种 namespace,本篇从源码上进一步分析 Linux namespace,让你对 Docker namespace ...

  7. linux namespace 工具,Linux Namespace : 简介

    文章简单的介绍下 linux namespace 的概念以及基本用法. namespace 是 Linux 内核用来隔离内核资源的方式.通过 namespace 可以让一些进程只能看到与自己相关的一部 ...

  8. Linux Namespace机制简介

    最近Docker技术越来越受到关注,作为Docker中很重要的一项技术,Namespace也就经常在Docker的简介里面看到. 在这里总结一下它的内部机制.也解决一下自己原来的一些疑惑. Names ...

  9. Docker 基础技术之 Linux namespace 详解

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Docker ...

最新文章

  1. [导入]阿贾克斯行动(中文版).pdf(2.48 MB)
  2. python并行编程语言_Python3 系列之 并行编程
  3. 非常有用的并发控制-倒计时器CountDownLatc
  4. java 方法的拆分_java – 字符串拆分和比较 – 最快的方法
  5. 安装linux可是c盘文件夹失败,虚拟机安装linux系统,会对物理的磁盘有影响吗?怎样保证安全,谢了!...
  6. 国网376.1协议报文地址域
  7. Matlab中配置vlfeat库
  8. arcmap中加载底图
  9. mac 硬盘读写速度测试 软件,MAC硬盘速度测试技巧
  10. 【可视化】使用PS将图片从白底换成其他底色时,如何保留头发边缘的发丝
  11. 【黑帽SEO案例分析】10天爱站从0到6
  12. 怎样设定目标(三)—— 目标设定前的准备
  13. KDF- key derivation function
  14. 红米k60和k50至尊版参数对比 Redmi k60和k50至尊版哪个好
  15. Android获取自定义格式时区
  16. 《会计基础:前言》学习笔记
  17. 二叉树家谱关系实验报告
  18. 安装sql错误:系统找不到指定路径
  19. 计算机应用领域中CAL代表,计算机应用领域.doc
  20. USB2.0接口CM4_5G mini驱动板搭配广和通FM650在Win11下的测速

热门文章

  1. python终端指令大全_使用python模拟命令行终端的示例
  2. C语言 error C4996: This function or variable may be unsafe - C语言零基础入门教程
  3. Python 不定长参数 *argc/**kargcs - Python零基础入门教程
  4. MATLAB课程表分配问题,求助matlab大神,学校的课程安排太骚了,我们压根就不用学matlab...
  5. 七乐彩中奖规则表_【开奖】双色球第2020094期开奖结果出炉!你中奖了吗?
  6. linux看java堆大小,linux 改java堆内存大小
  7. 土木工程计算机仿真学科未来前景,同济大学土木工程学院土木工程计算机仿真2010级学历教育硕士--培养方案...
  8. java数据段 静态区_回顾一下基础,关于栈与堆,常量池,静态区
  9. 合肥天鹅湖万达广场机器人_合肥租房价位及租房地理位置推荐
  10. mysql解压包安装linuex_CentOS下安装Apache,php,Mysql