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

文章目录

  • 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.Stdincmd.Stdout=os.Stdoutcmd.Stderr=os.Stderrif 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 mainimport ("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.Stdincmd.Stdout=os.Stdoutcmd.Stderr=os.Stderrif err:=cmd.Run();err!=nil{log.Fatal(err)}
}

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

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

相关文章

MySQL_数据库图形化界面软件_00000_00001

目录 NavicatSQLyogDBeaverMySQL Workbench可能出现的问题 Navicat 官网地址: 英文:https://www.navicat.com 中文:https://www.navicat.com.cn SQLyog 官网地址: 英文:https://webyog.com DBeaver 官网地址&…

Spring MVC文件上传配置

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 文件上传 Spring MVC文件上传基于Servlet 3.0实现;示例代码如下: Overrideprotected void customizeRegistration(ServletRegistration.Dynamic reg…

【开源鸿蒙】编译OpenHarmony轻量系统QEMU RISC-V版

文章目录 一、背景介绍二、准备OpenHarmony源代码三、准备hb命令3.1 安装hb命令3.2 检查hb命令 四、编译RISC-V架构的OpenHarmony轻量系统4.1 设置hb构建目标4.2 启动hb构建过程 五、问题解决5.1 hb set 报错问题解决 六、参考链接 开源鸿蒙坚果派,学习鸿蒙一起来&a…

AJAX概念和axios使用、URL、请求方法和数据提交、HTTP协议、接口、form-serialize插件

AJAX概念和axios使用 AJAX概念 AJAX就是使用XMLHttpRequest对象与服务器通信,它可以使用JSON、XML、HTML和text文本等格式发送和接收数据,AJAX最吸引人的就是它的异步特性,也就是说它可以在不重新刷新页面的情况下与服务器通信,…

GPU密集型计算性能优化的方法和技术

对GPU密集型计算进行性能优化的方法和技术多种多样。通过一些优化策略和技术需要综合考虑应用程序的具体需求、所使用的GPU硬件、以及编程模型和库的选择。通过不断地分析和调整,可以实现GPU计算性能的持续提升。以下是一些常用的优化策略和技术: 算法优…

uni-popup(实现自定义弹窗提示、交互)

一般提示框的样式,一般由设计稿而定,如果用uniapp的showmodel,那个并不能满足我们需要的自定义样式,所以最好的方式是我们自己封装一个!(想什么样就什么样)! 一、页面效果 二、使用…

Redis的常用操作-String字符串类型

一、redis简介 redis 就是一个数据库,与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此redis 被应用于缓存方向。另外,redis 也经常用来做分布式锁。 二、redis作缓存,主要用来实现…

WebSocket多服务实例下的消息推送

最近在做一个项目,涉及到前后端的消息同步、推送,进而我们选择使用webSocket的方案进行实现,但是当websocket服务端部署在多个实例下,会出现前端socket意外断开导致无法收到消息的情况。手下我们先说我们的实现方案: 1…

【JavaScript】JavaScript 运算符 ⑤ ( 赋值运算符 | 基础赋值运算符 与 复合赋值运算符 )

文章目录 一、JavaScript 赋值运算符1、赋值运算符 概念2、基础赋值运算符 与 复合赋值运算符3、复合赋值运算符4、完整代码示例 一、JavaScript 赋值运算符 JavaScript 赋值运算符种类 : 基础赋值运算符 : 等于 : ; 复合赋值运算符 : 加等 : 减等 : -乘等 : *除等 : /取模等…

MongoDB的安装方法图文详细

官网:www.mongodb.com 选择 Products > Community Edition 就能进入社区版 在这里下载 windows 版对应的安装包 注意:6.0.1 版本的 MongoDB 配置环境变量有问题,并且我不知道怎么解决,如果想要避免出问题,建议使…

【javaWeb】在webapp中手动发布一个应用

标题 🐲一、为什么要在webapp中手动发布一个应用🎉二、手动发布步骤1.下载Tomcat2.解压并安装3.在webapps中创建文档 ✨三、总结 🐲一、为什么要在webapp中手动发布一个应用 好处解释灵活性手动发布应用程序可以根据自己的需求进行自定义配置…

《PyTorch 深度学习实战》- 第一章 深度学习回顾和PyTorch简介

《PyTorch 深度学习实战》- 第一章 深度学习回顾和PyTorch简介 1.1 PyTorch的历史 pytorch前身是Torch,Torch使用Lua和C语言,而后因为python的兴起,演变成为PyTorch。事实上,pytorch是提供动态图功能的chainer分支。 pytorch与…

【php基础】输出、变量、

php基础补充 1. 输出2.和"的区别3.变量3.1变量的命名规则3.2 两个对象指向同一个值3.3 可变变量 4.变量的作用域5. 检测变量 1. 输出 echo: 输出 print: 输出,输出成功返回1 print_r(): 输出数组 var_dump(): 输出数据的详细信息,带有数据类型和数…

将FastSAM中的TextPrompt迁移到MobileSAM中

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

字母异位词分组【每日一题】

可以通过案例找到规律&#xff0c;每个词排序完后是同一个&#xff0c;所以通过hasmap存储排序过的值做key&#xff0c;值是存储单词集合。 package HasTable;import java.util.*;class Solution {static List<List<String>> groupAnagrams(String[] strs) {Map&l…

GPT-1, GPT-2, GPT-3, InstructGPT / ChatGPT and GPT-4 总结

1. GPT-1 What the problem GPT-1 solve? 在 GPT-1 之前&#xff0c;NLP 通常是一种监督模型。 对于每个任务&#xff0c;都有一些标记数据&#xff0c;然后根据这些标记数据开发监督模型。 这种方法存在几个问题&#xff1a;首先&#xff0c;需要标记数据。 但 NLP 不像 CV&…

ioDraw:与 GitHub、gitee、gitlab、OneDrive 无缝对接,绘图文件永不丢失!

&#x1f31f; 绘图神器 ioDraw 重磅更新&#xff0c;文件保存再无忧&#xff01;&#x1f389; 无需注册&#xff0c;即刻畅绘&#xff01;✨ ioDraw 让你告别繁琐注册&#xff0c;尽情挥洒灵感&#xff01; 新增文件在线实时保存功能&#xff0c;支持将绘图文件保存到 GitHu…

VScode(8)之阅读大型CC++工程

VScode(8)之阅读大型CC工程(Linux内核)代码 Author&#xff1a;Once Day Date&#xff1a;2023年4月25日/2024年3月17日 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: VScode开发_Once-Day的博客-CSDN博客 参考文档: 1. 历史包袱 由于上世纪70-80年代的…

NBlog Java定时任务-备份MySQL数据

NBlog部署维护流程记录&#xff08;持续更新&#xff09;&#xff1a;https://blog.csdn.net/qq_43349112/article/details/136129806 为了避免服务器被攻击&#xff0c;给博客添加了一个MySQL数据备份功能。 此功能是配合博客写的&#xff0c;有些方法直接用的已有的&#xf…

如何在不带备份的情况下恢复 Android 手机照片?

你的 Android 手机出了什么问题&#xff1f; Android 手机上的垃圾文件过多。 您的 Android 手机屏幕黑屏。 您的手机蓝屏死机。 您的设备卡在启动屏幕上。 电话停止工作。 手机一直关机。 ... 您是否遇到过以上情况并将您的 Android 手机恢复出厂设置&#xff1f;如果是这样&…