从零自制docker-4-【PID Namespace MOUNT Namespace】

news2024/10/7 20:28:35

文章目录

  • PID namespace
  • 代码
  • mountnamespace
  • 通俗理解
  • 代码

PID namespace

每个命名空间都有独立的PID空间,即每个命名空间的进程都由一开始分配。

在这里插入图片描述
在这里插入图片描述
新建立的进程内部进程ID为1

代码

package main
import (
	"log"
	"os/exec"
	"os"
	"syscall"
)
func main(){
	cmd:=exec.Command("sh")
	cmd.SysProcAttr=&syscall.SysProcAttr{
		Cloneflags: syscall.CLONE_NEWUTS|syscall.CLONE_NEWIPC|syscall.CLONE_NEWPID,}
	cmd.Stdin=os.Stdin
	cmd.Stdout=os.Stdout
	cmd.Stderr=os.Stderr
	if err:=cmd.Run();err!=nil{
		log.Fatal(err)
	}
}

mountnamespace

NEWNS ( New Namespace的缩写)
mount namespace 是 Linux 系统中的一个概念,它是 Linux 命名空间(namespace)的一种。命名空间是 Linux 内核的一种特性,它可以将系统的某些部分(如进程、网络、用户 ID、文件系统等)隔离开来,使得在命名空间内部的进程看起来就像是在一个独立的系统中一样。

mount namespace 就是用来隔离文件系统挂载点(mount points)的。每个 mount namespace 都有自己的一套挂载点,这些挂载点对其他的 mount namespace 是不可见的。这意味着在一个 mount namespace 中挂载或卸载文件系统不会影响到其他的 mount namespace。

举个例子,假设你在一个大楼里(这个大楼就像是一个 Linux 系统),每个人都有自己的房间(每个房间就像是一个 mount namespace)。在你的房间里,你可以挂上你喜欢的画(就像在你的 mount namespace 中挂载文件系统),并且你可以随时更换或者取下这些画(就像在你的 mount namespace 中卸载文件系统)。但是,你在自己房间中挂上的画,其他人在他们的房间里是看不到的(这就是 mount namespace 的隔离特性)。同样,其他人在他们的房间里挂上的画,你也是看不到的。

这种特性在很多场合都非常有用,比如在创建容器(如 Docker)时。每个容器都有自己的 mount namespace,这样它就可以有自己的文件系统,而不会影响到宿主机或者其他的容器。
在这里插入图片描述
proc 是 Linux 系统中的一个特殊文件系统,也被称为 procfs 或者 proc 文件系统。它并不像传统的文件系统那样存储在硬盘上,而是存在于内存中。proc 文件系统是 Linux 内核的一部分,它为用户空间的程序提供了一个接口来访问内核空间的数据。

proc 文件系统通常被挂载到 /proc 目录。在这个目录下,你可以看到许多文件和目录,它们都是由内核实时生成的,反映了系统的当前状态。例如:

/proc/[pid]:每个正在运行的进程都有一个对应的目录,其中 pid 是进程的 ID。在这个目录下,你可以找到关于这个进程的许多信息,例如它的内存使用情况、打开的文件、运行状态等。
/proc/meminfo:这个文件包含了关于系统内存使用情况的信息。
/proc/cpuinfo:这个文件包含了关于 CPU 的信息。

mount -t proc proc /proc

这个命令是用来在 Linux 系统中挂载 proc 文件系统的。让我们逐步解析这个命令:

  • mount:这是用来挂载文件系统的命令。
  • -t proc:这是指定要挂载的文件系统类型,这里是 proc。
  • proc:这是要挂载的文件系统的设备或文件,对于 proc 文件系统,这个参数通常也是 proc。
  • /proc:这是挂载点,即挂载后访问文件系统的路径。
  • proc 文件系统是一个伪文件系统,它是内核用来向用户空间程序提供系统信息的一种方式。它包含了大量的信息,例如进程信息(每个进程在 /proc 下有一个以其 PID 命名的目录)、内存信息、硬件配置等。

当你执行 mount -t proc proc /proc 命令后,你就可以通过访问 /proc 目录来获取这些信息了。例如,你可以通过读取 /proc/cpuinfo 文件来获取 CPU 的信息,或者通过读取 /proc/meminfo 文件来获取内存的信息。

通俗理解

首先,你可以把 mount 命令理解为一种“连接”或者“接入”的操作。就像你有一台电视和一个游戏机,你想玩游戏,你需要把游戏机接入电视,这样你就能在电视上玩游戏了。在这个例子中,mount 命令就像是把游戏机接入电视的操作。

然后,-t proc 是告诉 mount 命令我们要接入的是什么类型的“游戏机”,在这个例子中,就是 proc 类型的文件系统。

接下来,proc 是我们要接入的“游戏机”,在这个例子中,就是 proc 文件系统。

最后,/proc 是我们要把“游戏机”接入的电视的接口,也就是挂载点。

所以,mount -t proc proc /proc 命令的意思就是把 proc 文件系统(游戏机)接入到 /proc 目录(电视的接口)。

那么,proc 文件系统是什么呢?它其实是一个特殊的文件系统,它并不像硬盘或者 CD 那样存储真实的文件,而是提供了一种访问系统信息的方式。你可以把它想象成一个“魔法游戏机”,当你把它接入电视后,你可以在电视上看到各种系统信息,比如 CPU 的状态、内存的使用情况等。

例如,你可以通过读取 /proc/cpuinfo(在电视上选择“CPU 信息”菜单)来查看 CPU 的信息,或者通过读取 /proc/meminfo(在电视上选择“内存信息”菜单)来查看内存的信息。

在 mount -t proc proc /proc 这条命令中,-t proc 指定了我们要挂载的文件系统类型,这里是 proc。你可以把 -t proc 理解为我们告诉 mount 命令:“我们要挂载的是一个类型为 proc 的文件系统”。
接下来的 proc 是一个特殊的设备名,它表示 proc 文件系统本身。因为 proc 文件系统是一个虚拟的文件系统,它并不像硬盘或 CD 那样有一个物理设备,所以这里的设备名也就是 proc。
所以,mount -t proc proc /proc 这条命令的意思就是:“挂载一个类型为 proc 的文件系统,该文件系统的设备名为 proc,并把它挂载到 /proc 目录”。

proc 是一个特殊的文件系统,它是 Linux 内核的一部分并且存在于内存中,不同于传统的文件系统如 ext4、xfs 等存储在硬盘上。它并没有一个具体的物理位置。
proc 文件系统提供了一个接口,使得用户空间的程序可以访问内核空间的数据。当你查看 /proc 目录时,你看到的所有文件和信息都是由内核实时生成的。例如,/proc/[pid] 目录包含了关于 pid 对应的进程的信息,/proc/meminfo 文件包含了内存使用情况的信息,等等。
因此,当我们说 “挂载 proc 文件系统到 /proc 目录” 时,我们实际上是在创建一个接口,使得我们可以通过访问 /proc 目录来获取内核的信息。

代码

package main

import (
	"os/exec"
	"os"
	"syscall"
	"log"
)

func main(){
	cmd:=exec.Command("sh")
	cmd.SysProcAttr=&syscall.SysProcAttr{
		Cloneflags: syscall.CLONE_NEWIPC|syscall.CLONE_NEWPID|syscall.CLONE_NEWUTS|syscall.CLONE_NEWNS,}
	cmd.Stdin=os.Stdin
	cmd.Stdout=os.Stdout
	cmd.Stderr=os.Stderr

	if err:=cmd.Run();err!=nil{
		log.Fatal(err)
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1524613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pyspark基础 -- DataFrame的理解与案例

DataFrame(df)介绍 datafram就是一个内存中的二维表结构,具备表结构的三个基本属性: 行列表结构描述 在结构层面,pyspark中的StructType对象描述了表结构,StructField对象描述了表的一个列信息;在数据层面&#xff…

银行信息系统应用架构导论-引用

一级目录二级目录金融标准和参考文档一、银行企业级应用系统架构规划企业级应用系统架构规划《金融科技发展规划(2022-2025年)(2022年1月中国人民银行印发)》 《关于银行业保险业数字化转型的指导意见(2022年1月中国银…

【linux】CentOS查看系统信息

一、查看版本号 在CentOS中,可以通过多种方法来查看版本号。以下是几种常用的方法: 使用cat命令查看/etc/centos-release文件: CentOS的版本信息存储在/etc/centos-release文件中。可以使用cat命令来显示该文件的内容,从而获得C…

ThingsBoard初始化数据库Postgres

视频教程: ThingsBoard初始化数据库postgres_哔哩哔哩_bilibilihingsBoard是一个基于Java的开源物联网平台,旨在实现物联网项目的快速开发、管理和扩展。本课程主要从0到1带你熟悉ThingsBoard,学习优秀的物联网变成思维与思想,主…

Nginx离线安装(保姆级教程)

1、下载与安装gcc-c环境 获取rpm包的方式很多,在这里推荐使用yum工具获取,因为手动从官网下载,手动执行rpm -Uvh *.rpm --nodeps --force命令进行安装,可能会缺少某个依赖,我们也不确定到底需要哪些依赖。 因此需要准…

游戏引擎中网络游戏的基础

一、前言 网络游戏所面临的挑战: 一致性:如何在所有的主机内都保持一样的表现可靠性:网络传输有可能出现丢包安全性:反作弊,反信息泄漏。多样性:不同设备之间链接,比如手机,ipad&a…

第九节:Vben Admin实战-系统管理之角色管理实现-上

系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 第六节:Vben Admin权限-后端控制方式 第七节…

RUST egui体验

egui官方提供了web版的demo&#xff0c;效果还是很不错的&#xff0c;就是用的时候有点一头雾水&#xff0c;没有找到明确的指导怎么把这些组件插入到自己的application或者web。花了一天时间撸了一遍流程&#xff0c;记录一下&#xff0c;说不定以后能用到呢 >_< efram…

蓝桥杯并查集|路径压缩|合并优化|按秩合并|合根植物(C++)

并查集 并查集是大量的树&#xff08;单个节点也算是树&#xff09;经过合并生成一系列家族森林的过程。 可以合并可以查询的集合的一种算法 可以查询哪个元素属于哪个集合 每个集合也就是每棵树都是由根节点确定&#xff0c;也可以理解为每个家族的族长就是根节点。 元素集合…

【Java基础知识总结 | 第三篇】深入理解分析ArrayList源码

文章目录 3.深入理解分析ArrayList源码3.1ArrayList简介3.2ArrayLisy和Vector的区别&#xff1f;3.3ArrayList核心源码解读3.3.1ArrayList存储机制&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;add()方法&#xff08;3&#xff09;新增元素大体流程 3.3.2ArrayL…

R:简易的Circos图

library(grid) library(circlize) library(RColorBrewer) library(ComplexHeatmap) setwd("C:/Users/fordata/Downloads/Circos") # 创建颜色调色板 coul <- colorRampPalette(brewer.pal(9, "Set3"))(12) # 读取基因组数据 genome <- read.table(ci…

【启动npm run serve 奇怪的报错】

报错如下&#xff1a; INFO Starting development server... utils.js:587Uncaught TypeError [ERR_INVALID_ARG_VALUE]: The argument path must be a string or Uint8Array without null bytes. Received E:\\#\u0000#idea-workspace\\wonderful-search\\wonderful-search-v…

julia语言中的决策树

决策树&#xff08;Decision Tree&#xff09;是一种基本的分类与回归方法&#xff0c;它呈现出一种树形结构&#xff0c;可以直观地展示决策的过程和结果。在决策树中&#xff0c;每个内部节点表示一个属性上的判断条件&#xff0c;每个分支代表一个可能的属性值&#xff0c;每…

JavaSE、JavaEE和Jakarta EE的历史、区别与联系

JavaSE、JavaEE和Jakarta EE是Java平台中的三个重要组成部分&#xff0c;它们各自承担着不同的角色&#xff0c;同时也有着密切的联系。在理解它们之间的历史、区别和联系之前&#xff0c;我们首先需要了解它们的基本概念。 JavaSE&#xff08;Java Standard Edition&#xff…

电脑充电器能充手机吗?如何给手机充电?

电脑充电器可以给手机充电吗&#xff1f; 电脑充电器可以给手机充电&#xff0c;但前提是电脑充电器的功率输出与手机的功率匹配且接口匹配。 假设电脑充电器的输出功率为5V/2A&#xff0c;手机也支持5V/2A的输入功率。 只要接口匹配&#xff0c;就可以使用电脑充电器给手机充…

基于单片机的光电传感转速测量系统的设计

摘要:针对在工程实践中很多场合都需要对转速这一参数进行精准测量的目的,采用以STC89C52 芯片为核心,结合转动系统、光电传感器、显示模块等构成光电传感器转速测量系统,实现对电机 转速的测量。通过测试表明该系统具有结构简单、所耗成本低,测量精度高、稳定可靠等优点,…

Day67:WEB攻防-Java安全JNDIRMILDAP五大不安全组件RCE执行不出网

知识点&#xff1a; 1、Java安全-RCE执行-5大类函数调用 2、Java安全-JNDI注入-RMI&LDAP&高版本 3、Java安全-不安全组件-Shiro&FastJson&JackJson&XStream&Log4j Java安全-RCE执行-5大类函数调用 Java中代码执行的类&#xff1a; GroovyRuntimeExecPr…

html5cssjs代码 023 公制计量单位进位与换算表

html5&css&js代码 023 公制计量单位进位与换算表 一、代码二、解释 这段HTML代码定义了一个网页&#xff0c;用于展示公制计量单位的进位与换算表。 一、代码 <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"utf-8&quo…

将FastSAM中的TextPrompt迁移到MobileSAM中

本博文简单介绍了SAM、FastSAM与MobileSAM,主要关注于TextPrompt功能的使用。从性能上看MobileSAM是最实用的,但其没有提供TextPrompt功能,故而参考FastSAM中的实现,在MobileSAM中嵌入TextPrompt类。并将TextPrompt能力嵌入到MobileSAM官方项目提供的gradio.py部署代码中,…

ros小问题之差速轮式机器人轮子不显示(rviz gazebo)

在rviz及gazebo练习差速轮式机器人时&#xff0c;很奇怪&#xff0c;只有个机器人的底板及底部的两个万向轮&#xff0c;如下图&#xff0c; 后来查看相关.xacro文件&#xff0c;里面是引用包含了轮子的xacro文件&#xff0c;只需传入不同的参数即可调用生成不同位置的轮子&…