【Linux】Namespace
一、概念
Linux Namespace 是 Linux 内核提供的一种特性,用于对系统资源进行隔离。通过 Namespace,不同的进程组可以拥有独立的系统资源视图,即使它们在同一台物理机器上运行。这种隔离机制使得容器技术成为可能,因为它允许在单个宿主机上运行多个隔离的容器实例,每个容器都拥有自己的网络、进程空间、用户ID等资源,而不会相互干扰。
二、类型
1、UTS namespaces:隔离主机名和域名信息
使用exec创建一个执行sh命令的新进程, 对该进程属性改为CLONE_NEWUTS,然后运行,
其中cmd的Run方法会阻塞父进程知道子进程执行结束。
package mainimport ("os/exec""syscall""os""fmt"
)
func main () {cmd:=exec.Command("sh")cmd.SysProcAttr=&syscall.SysProcAttr{Cloneflags:syscall.CLONE_NEWUTS,}cmd.Stdin=os.Stdincmd.Stdout=os.Stdoutcmd.Stderr=os.Stderrif err:=cmd.Run();err!=nil{fmt.Println("cmd.run err:",err)}
}
在sh环境内执行以下命令更改hostname,sh环境中的hostname改变而主机host 未改变。
hostname -b bird
2、IPC namespaces:隔离进程间通信资源
在SysProcAttr类的CloneFlags中或上syscall.CLONE_NEWIPC,实现进程间通信资源隔离。
func main () {cmd:=exec.Command("sh")cmd.SysProcAttr=&syscall.SysProcAttr{Cloneflags:syscall.CLONE_NEWUTS|syscall.CLONE_NEWIPC,}cmd.Stdin=os.Stdincmd.Stdout=os.Stdoutcmd.Stderr=os.Stderrif err:=cmd.Run();err!=nil{fmt.Println("cmd run err:",err)}}
使用以下命令创建消息队列
ipcmk -Q
在sh环境中执行:
ipcs -q
发现没有消息队列,说明实现了进程间通信隔离,IPC已经被隔离。
3、PID namespaces:隔离进程ID
同理,添加syscall.CLONE_NEWPID
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{fmt.Println("cmd run err:",err)}}
在主机上查看tiny_docker的pid为4828
在sh环境中查看pid为1,主机上的pid4828映射到Namespace后pid为1,实现了PID隔离。
但此时执行ps,top等命令还是会显示主机的信息,应为该命令使用/proc文件内容,此内容未被隔离。
4、Mount namespaces:隔离文件系统挂载点
添加syscall.CLONE_NEWNS(namespace缩写)
"mount"(挂载)是一个过程,它将文件系统(如硬盘驱动器、分区、磁盘映像文件、网络共享等)连接到一个已存在的文件系统树中。挂载操作使得文件系统能够被用户和程序访问,就像它们是本地文件系统的一部分一样。
func main () {cmd:=exec.Command("sh")cmd.SysProcAttr=&syscall.SysProcAttr{Cloneflags:syscall.CLONE_NEWUTS|syscall.CLONE_NEWIPC|syscall.CLONE_NEWPID|syscall.CLONE_NEWNS,}cmd.Stdin=os.Stdincmd.Stdout=os.Stdoutcmd.Stderr=os.Stderrif err:=cmd.Run();err!=nil{fmt.Println("cmd run err:",err)}}
执行ps -elf还是显示主机的进程,在sh中执行mount -t proc proc /proc将proc挂载到自己的namespace中,再执行ps -elf:
让我们分解这个命令:
mount
:这是用来挂载文件系统的命令。-t proc
:这指定了要挂载的文件系统类型,这里是proc
。proc
:这是源文件系统,对于proc
文件系统来说,源文件系统总是proc
。/proc
:这是挂载点,即挂载后文件系统在文件系统中的路径。/proc
是proc
文件系统的标准挂载点。
当你执行 mount -t proc proc /proc
命令时,你会将 proc
文件系统挂载到 /proc
目录。这个操作通常是自动完成的,因为大多数 Linux 发行版在系统启动时会自动挂载 proc
文件系统。这个文件系统对于系统管理员和程序来说非常重要,因为它提供了一个接口来获取和操作内核和进程的信息。
5、User namespaces:隔离用户和组ID
func main () {cmd:=exec.Command("sh")cmd.SysProcAttr=&syscall.SysProcAttr{Cloneflags:syscall.CLONE_NEWUTS|syscall.CLONE_NEWIPC|
syscall.CLONE_NEWPID|syscall.CLONE_NEWNS|syscall.CLONE_NEWUSER,}cmd.Stdin=os.Stdincmd.Stdout=os.Stdoutcmd.Stderr=os.Stderrif err:=cmd.Run();err!=nil{fmt.Println("cmd run err:",err)}}
执行id命令查看当前的用户和用户组
可以看到UID不同,实现了UID的隔离。
6、Network namespaces:隔离网络设备和网络栈
func main () {cmd:=exec.Command("sh")cmd.SysProcAttr=&syscall.SysProcAttr{Cloneflags:syscall.CLONE_NEWUTS|syscall.CLONE_NEWIPC|syscall.CLONE_NEWPID|syscall.CLONE_NEWNS|syscall.CLONE_NEWUSER|syscall.CLONE_NEWNET,}cmd.Stdin=os.Stdincmd.Stdout=os.Stdoutcmd.Stderr=os.Stderrif err:=cmd.Run();err!=nil{fmt.Println("cmd run err:",err)}}
相关文章:
【Linux】Namespace
一、概念 Linux Namespace 是 Linux 内核提供的一种特性,用于对系统资源进行隔离。通过 Namespace,不同的进程组可以拥有独立的系统资源视图,即使它们在同一台物理机器上运行。这种隔离机制使得容器技术成为可能,因为它允许在单个…...
SQLite 和 MySQL语法区别
SQLite 和 MySQL 在 SQL 语法上有一些差异,这些差异主要体现在数据类型、函数、表和索引的管理等方面。以下是一些主要的不同之处: 1. 数据类型 SQLite 支持的数据类型包括:TEXT, INTEGER, REAL, BLOB。动态类型系统,允许在插入…...
基于BERT的命名体识别(NER)
基于BERT的命名实体识别(NER) 目录 项目背景项目结构环境准备数据准备代码实现 5.1 数据预处理 (src/preprocess.py)5.2 模型训练 (src/train.py)5.3 模型评估 (src/evaluate.py)5.4 模型推理 (src/inference.py) 项目运行 6.1 一键运行脚本 (run.sh)6…...
华为云鸿蒙应用入门级开发者认证考试题库(理论题和实验题)
注意:考试链接地址:华为云鸿蒙应用入门级学习认证_华为云鸿蒙应用入门级开发者认证_华为云开发者学堂-华为云 当前认证打折之后是1元,之后原价700元,大家尽快考试!考试题库里面答案不一定全对,但是可以保证…...
SpringBoot+React养老院管理系统 附带详细运行指导视频
文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.入住合同文件上传2.添加和修改套餐的代码3.查看入住记录代码 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SpringBootReact框架开发的养老院管理系统。首先…...
使用element-plus el-table中使用el-image层级冲突table表格会覆盖预览的图片等问题
在日常开发项目中 使用element-plus 中表格中使用 el-image的点击图片出现图片预览 会出现以下问题 表格一行会覆盖预览的图片 鼠标滑过也会显示表格 el-image 的预览层级和表格的层级冲突导致的。 解决方法:有两种一种是直接使用样式穿透 第二种推荐方法 使用官网推…...
python读取Oracle库并生成API返回Json格式
一、安装必要的库 首先,确保已经安装了以下库: 有网模式 pip install flask pip install gevent pi install cx_Oracle离线模式: 下载地址:https://pypi.org/simple/flask/ # a. Flask Werkzeug-1.0.1-py2.py3-none-any.whl J…...
音视频入门基础:MPEG2-TS专题(5)——FFmpeg源码中,判断某文件是否为TS文件的实现
一、引言 通过FFmpeg命令: ./ffmpeg -i XXX.ts 可以判断出某个文件是否为TS文件: 所以FFmpeg是怎样判断出某个文件是否为TS文件呢?它内部其实是通过mpegts_probe函数来判断的。从《FFmpeg源码:av_probe_input_format3函数和AVI…...
每天10个vue面试题(九)
1、如何在组件中批量使用Vuex的getter属性? 使用mapGetters辅助函数, 利用对象展开运算符将getter混入computed 对象中computed:{ ...mapGetters([total,discountTotal]) } 2、vue2和vue3的区别? 双向数据绑定不同:vue2 的双向数据绑定…...
Jenkins的环境部署
day22 回顾 Jenkins 简介 官网Jenkins Jenkins Build great things at any scale The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project. 用来构建一切 其实就是用Java写的一个项目…...
八、鸿蒙开发-网络请求、应用级状态管理
提示:本文根据b站尚硅谷2024最新鸿蒙开发HarmonyOS4.0鸿蒙NEXT星河版零基础教程课整理 链接指引 > 尚硅谷2024最新鸿蒙开发HarmonyOS4.0鸿蒙NEXT星河版零基础教程 文章目录 一、网络请求1.1 申请网络访问权限1.2 安装axios库1.2.1 配置环境变量1.2.2 第二步&…...
经验笔记:Git 中的远程仓库链接及上下游关系管理
Git 中的远程仓库链接及上下游关系管理 1. 远程仓库的链接信息 当你克隆一个远程仓库时,Git 会在本地仓库中记录远程仓库的信息。这些信息包括远程仓库的 URL、默认的远程名称(通常是 origin),以及远程仓库中的所有分支和标签。…...
Paint 学习笔记
目录 ippaint 外扩对象 LCM_inpaint_Outpaint_Comfy: 不支持文字引导 ippaint https://github.com/Sanster/IOPaint 外扩对象 https://www.iopaint.com/models/diffusion/powerpaint_v2 GitHub - open-mmlab/PowerPaint: [ECCV 2024] PowerPaint, a versatile …...
Jenkins修改LOGO
重启看的LOGO和登录页面左上角的LOGO 进入LOGO存在的目录 [roottest-server01 svgs]# pwd /opt/jenkins_data/war/images/svgs [roottest-server01 svgs]# ll logo.svg -rw-r--r-- 1 jenkins jenkins 29819 Oct 21 10:58 logo.svg #jenkins_data目录是我挂载到了/opt目录&…...
kafka是如何做到高效读写
消息持久化: Kafka 将消息存储在磁盘上,并且通过顺序写入的方式提高写入性能。 消息被追加到日志文件的尾部,避免了随机写操作,从而提高了写入速度。零拷贝技术:利用操作系统的零拷贝特性,数据可以从磁盘直…...
Intern大模型训练营(九):XTuner 微调实践微调
本节课程的视频和教程都相当清晰,尤其是教程,基本只要跟着文档,在开发机上把指令都相同地输出一遍,就可以完成任务(大赞),相当顺利。因此,这里的笔记就不重复赘述步骤,更…...
从一次java.io.StreamCorruptedException: invalid stream header: 48656C6C 错误中学到的调试思路
问题场景: 在项目中,我试图使用 Java 的 ObjectInputStream 反序列化一个对象。代码逻辑看似简单:读取字节流,将其转为 Java 对象。然而,程序抛出了以下异常: java.io.StreamCorruptedException: invalid…...
树莓派的发展历史
树莓派(Raspberry Pi)是由英国的树莓派基金会开发的一系列单板计算机,其目标是为了促进计算机科学教育,同时提供廉价的计算机硬件平台。 1. 诞生背景与初代模型(2006-2012) 背景:树莓派的概念起…...
K8S containerd拉取harbor镜像
前言 接前面的环境 K8S 1.24以后开始启用docker作为CRI,这里用containerd拉取 参考文档 正文 vim /etc/containerd/config.toml #修改内容如下 #sandbox_image "registry.aliyuncs.com/google_containers/pause:3.10" systemd_cgroup true [plugins.…...
Ubuntu 环境下通过 Apt-get 安装软件
操作场景 为提升用户在云服务器上的软件安装效率,减少下载和安装软件的成本,腾讯云提供了 Apt-get 下载源。在 Ubuntu 环境下,用户可通过 Apt-get 快速安装软件。对于 Apt-get 下载源,不需要添加软件源,可以直接安装软…...
vue使用List.forEach遍历集合元素
需要遍历集合对其每个元素进行操作时,可以使用forEach方法 1.语法:集合.forEach ( 定义每一项 > 定义每一项都要进行的逻辑 ) 2、使用场景: //例如需要给每个员工的工资数量加1000this.personList.forEach(item>item.salary100…...
ROM修改进阶教程------安卓14去除修改系统应用后导致的卡logo验证步骤 适用安卓13 14 安卓15可借鉴参考
上期的博文解析了安卓14 安卓15去除系统应用签名验证的步骤解析。我们要明白。修改系统应用后有那些验证。其中签名验证 去卡logo验证 与可降级安装应用验证等等的区别。有些要相互结合使用。今天的博文将对修改系统应用后卡logo验证做个步骤解析。 通过博文了解💝💝�…...
苹果macbook,MacOS 11,12,13,14,15 跳过监管锁(配置锁)
第一步:进入恢复模式 长按电源键关机,再长按开机进入恢复模式。(M,Intel芯片方法不同) 第二步:复制代码 右上角联网,打开Safari,地址栏输入http://i7q.cn/61NWfQ。复制以下命令&am…...
【YOLOv8】安卓端部署-2-项目实战
文章目录 1 准备Android项目文件1.1 解压文件1.2 放置ncnn模型文件1.3 放置ncnn和opencv的android文件1.4 修改CMakeLists.txt文件 2 手机连接电脑并编译软件2.1 编译软件2.2 更新配置及布局2.3 编译2.4 连接手机 3 自己数据集训练模型的部署4 参考 1 准备Android项目文件 1.1…...
第二十四章 Spring之源码阅读——AOP篇
Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…...
Linux配置MySQL自动备份
Linux配置MySQL自动备份 配置MySQL的自动备份首先要编辑一个备份脚本然后配置开启Linux定时任务即可,下面是具体配置 1、配置备份脚本并测试执行 1.1 编写备份脚本 #这里创建脚本名为mysql_backups.sh mkdir ~/mysqlmulu touch ~/mysqlmulu/mysql_backups.sh#!/…...
qt 之 QDockWidget设置不可拖动
在Qt中,可以通过设置QDockWidget的属性来禁止它被拖动。你可以使用QDockWidget::setFeatures方法并传递QDockWidget::DockWidgetMovable作为参数来禁用拖动功能。 以下是一个简单的示例代码,展示了如何设置QDockWidget为不可拖动: #include …...
【Java知识】Java性能测试工具JMeter
一文带你了解什么是JMeter 概述JMeter的主要功能:JMeter的工作原理:JMeter的应用场景:JMeter的组件介绍: 实践说明JMeter实践基本步骤:JMeter实践关键点: JMeter支持哪些参数化技术?常见插件及其…...
Git 安装
一、下载安装包 Git官网 https://git-scm.com/ Git 阿里镜像 二、安装 点击安装包运行,基本上一路 next 就行。 使用许可声明 选择安装目录 选择组件,默认勾选就行 选择开始菜单文件夹,默认就行 选择 Git 的默认编译器,默认 V…...
【Python】FastAPI:Token认证
FastAPI:Token认证 本教程通过 FastAPI 实现用户登录和基于 JWT(JSON Web Token) 的认证与授权,适合初学者到进阶用户。教程特别关注 Depends、OAuth2PasswordBearer 等非基础操作的详细讲解,帮助你全面掌握相关技术。…...
合肥网站建设新闻营销/长沙seo优化排名
前段时间 , 在脉脉上看见某95后阿里P7晒出工资单,是真的给我酸了…… 没办法回去想想 , 还是说狠补一下技术吧。 按照之前的经验来看 , Java 一面基本上都是基础题,同样是 CURD 的话,谁更熟练要谁,比如下面这个Java面试手册&…...
东莞网站建设服务有什么用/seo搜索引擎优化总结报告
转载自: http://blog.csdn.net/u014610226/article/details/47679323 以下是对C中不能重载为友元函数的四个运算符进行了详细的分析介绍,需要的朋友可以过来参考下 C规定有四个运算符 , ->, [], ()不可以是全局域中的重载(即不能重载为友员函数)&…...
flash做网站的论文/搭建网站费用是多少
因为业务需求所以需要一个ID生成器,要求生成器16位ID唯一。UUID太长不适合需求,所以琢磨了一个。总体思路就是,借助UUID(毕竟人家全球唯一,自己写太麻烦了)生成一个baseID,然后搞个位权出来进行…...
网站个人备案步骤/推广网站源码
实现线程安全总结来说存在四种方法:1. 使用ThreadLocal----主要用于数据的传递2. synchronized----JVm来实现的3. lock----cpu的硬件指令4. 使用Atomic类型----使用CPU的指令来实现5. 并发包中读写分离CopyOnWriteArrayList等...6 ......package J…...
香港网站没有icp备案吗/怎么知道自己的域名
数据埋点是什么? 数据埋点是数据产品经理、数据运营以及数据分析师,基于业务需求(例如:CPC点击付费广告中统计每一个广告位的点击次数),产品需求(例如:推荐系统中推荐商品的曝光次数…...
泉州网站建设是什么意思/网站推广的工作内容
这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生与变迁,展望ES6模块化标准的未来。经历过这段历史的人或许会感到沧桑,没经历过的人也应该知道这段历史。无模块时代 在ajax还未提出之前,js还只是一种“玩具语言”…...