从零自制docker-12-【overlayfs】

文章目录

  • overlayfs
  • `exec.Command("tar", "-xvf", busyboxTarURL, "-C", busyboxURL).CombinedOutput()`
  • `exec.Command`
      • 格式差异
  • 挂载mount
  • 卸载unmount
  • 代码地址
  • 结果演示

overlayfs

就是联合文件系统,将多个文件联合在一起成为一个统一的视图。

overlayfs 一般分为 lower、upper、merged 和 work 4个目录。

  • lower 只读层,该层数据不会被修改
  • upper 可读写层,所有修改都发生在这一层,即使是修改的 - lower 中的数据。
  • merged 视图层,可以看到 lower、upper 中的所有内容
  • work 则是 overlayfs 内部使用

当在容器中新建文件
在这里插入图片描述
修改当前upper层,但lower层没有改变
在这里插入图片描述

exec.Command("tar", "-xvf", busyboxTarURL, "-C", busyboxURL).CombinedOutput()

exec.Command("tar", "-xvf", busyboxTarURL, "-C", busyboxURL).CombinedOutput() 这行代码会启动一个新的进程来执行tar命令,并且它会自动执行。
CombinedOutput调用这个方法包括执行命令并收集标准输出(stdout)和标准错误(stderr)的组合输出。如果命令执行成功,它会返回一个字节数组包含输出内容;如果执行过程中有错误,这个错误(一般命令执行失败)会被返回。

exec.Command

exec.Command函数在Go语言中用于执行外部命令,其基本格式为:

cmd := exec.Command(command, arg1, arg2, ..., argN)

这里,command是您想要执行的外部命令的名称(例如lscurl等),而arg1argN是传递给该命令的参数。参数之间以逗号分隔,并且每个参数都是一个单独的字符串,即使是那些在命令行中看起来像是一个整体的参数(例如带有空格的文件路径),也需要作为一个整体字符串传递。

格式差异

  • 命令与参数: 执行不同命令时,主要的格式差异在于命令本身的名称以及它需要的参数。每个命令根据其功能会有不同的参数需求和格式。例如,ping命令可能需要一个主机名作为参数,而cp命令则需要源文件路径和目标文件路径。

  • 传递选项与参数: 一些命令支持长选项(如--help)和短选项(如-h),这些选项的使用和它们后面的参数(如果有的话)也是exec.Command参数的一部分。例如,exec.Command("grep", "-r", "pattern", "directory")

  • 环境变量与工作目录: 除了命令和参数,exec.Command还允许通过Cmd.EnvCmd.Dir字段设置环境变量和工作目录。这不改变基本的命令格式,但会影响命令执行的环境。

  • 输入输出重定向: 如你之前代码所示,可以使用Cmd.StdinCmd.StdoutCmd.Stderr来重定向命令的标准输入、输出和错误流。这不影响命令的格式,但影响其交互方式。

挂载mount

  • 准备 busybox 目录作为只读层lower
  • 准备可读写层upper
  • 准备merged层,将可读写层和只读层挂载到merged层(以上操作都是在容器没启动之前运行的)
  • 容器(子进程)运行时pivotRoot 切换目录(在子进程切换到命令行之前)
package contain
import(
	log "github.com/sirupsen/logrus"
	"os/exec"
	
	"os"
)

func prepare_overlays(rooturl string){
	create_lower(rooturl)
	create_upper(rooturl)
	create_merged(rooturl)
	create_work(rooturl)
	mount_overlays(rooturl)
	log.Infof("prepare_overlays suceess")
}
func create_lower(rooturl string){
	busyboxurl:=rooturl+"/busybox"
	busytarurl:=rooturl+"/busybox.tar"
	_, err := os.Stat(busyboxurl)
    if err != nil {
        if os.IsNotExist(err) {
            log.Infof("文件不存在")
			if err:=os.Mkdir(busyboxurl,0777);err!=nil{
				log.Infof("mkdir error")
			}
			if _,err=exec.Command("tar", "-xvf", busytarurl, "-C", busyboxurl).CombinedOutput(); err!=nil{
				log.Infof("tar busybox.tar error")
			}	
        } else {
			log.Infof("无法获取文件信息: %v\n", err)
        }
    }
	
}
func create_upper(rooturl string){
	upperurl:=rooturl+"/upper"
	if err:=os.Mkdir(upperurl,0777);err!=nil{
		log.Infof("mkedir upper error")
	}
}

func create_merged(rooturl string){
	mergedurl:=rooturl+"/merged"
	if err:=os.Mkdir(mergedurl,0777);err!=nil{
		log.Infof("mkedir merged error")
	}
}
func create_work(rooturl string){
	workurl:=rooturl+"/work"
	if err:=os.Mkdir(workurl,0777);err!=nil{
		log.Infof("mkedir merged error")
	}
}

func mount_overlays(rooturl string){
	mnturl:=rooturl+"/merged"
	dirs:="lowerdir="+rooturl+"/busybox"+",upperdir="+rooturl+"/upper"+",workdir="+rooturl+"/work"
	cmd:=exec.Command("mount","-t","overlay","overlay","-o",dirs,mnturl)
	if err:=cmd.Run();err!=nil{
		log.Infof("mount overlay error")
		log.Error(err)
	}
}

卸载unmount

  • 在容器运行退出后(子进程退出后程序环境改变,此时根目录也改变,所以此时可以卸载并删除之前的根目录)卸载unmount挂载点
  • 删除upper merged work层,lower不变
package contain
import(
	log "github.com/sirupsen/logrus"
	"os/exec"
	
	"os"
)
func end_overlays(rooturl string){
	unmount_overlays(rooturl)
	delete_upper_work_merged(rooturl)
}
func unmount_overlays(rooturl string){
	mntrul:=rooturl+"/merged"
	cmd:=exec.Command("umount",mntrul)
	if err:=cmd.Run();err!=nil{
		log.Infof("unmount merged error")
	}
}
func delete_upper_work_merged(rooturl string){
	upperurl:=rooturl+"/upper"
	mergedurl:=rooturl+"/merged"
	workurl:=rooturl+"/work"

	if err:=os.RemoveAll(upperurl);err!=nil{
		log.Infof("delete upper error")
	}
	if err:=os.RemoveAll(mergedurl);err!=nil{
		log.Infof("delete merged error")
	}
	if err:=os.RemoveAll(workurl);err!=nil{
		log.Infof("delete work error")
	}
}

代码地址

https://github.com/FULLK/llkdocker

结果演示

  • sudo运行后upper层是没有任何东西的,但只要运行命令就会产生一个root文件夹,因为是以root用户执行。可能名字对文件夹有修改影响,因为merged的root文件夹里没有任何东西
  • 新建文件,修改在upper中出现,merged中也出现,但lower没有出现
    在这里插入图片描述在这里插入图片描述
  • 查看文件内容
    在这里插入图片描述
  • exit后
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTTP1.1的优化措施

3.2 HTTP/1.1 如何优化? 可以从以下三个方面来优化http/1.1协议: 尽量避免发送 HTTP 请求; 在需要发送 HTTP 请求时,考虑如何减少请求次数; 减少服务器的 HTTP 响应的数据大小; 避免发送HTTP请求 对于…

【计算机网络】数据链路层的功能

数据链路层的基本功能: 封装成帧透明传输差错检测 数据链路层使用的信道主要有两种 点对点信道——PPP协议广播信道——CSMA/CD协议(有线局域网)、CSMA/CA协议(无线局域网) 数据链路层所处的地位 从图中可以看出,数据从主机H1送到主机H2需要在路径中…

苍穹外卖项目---------收获以及改进(9-12)

①Spring Task-------实现系统定时任务 概念: 应用场景: 使用步骤: 实现订单超时和前一天派送中的订单的自动任务处理: Component Slf4j public class Mytask {Autowiredprivate OrderServiceimpl orderServiceimpl;/*** 处理订…

05-11 周六 一键完成FastBuild镜像部署功能的开发

05-11 周六 一键完成FastBuild镜像部署功能的开发 时间版本修改人描述2024年5月11日21:50:15V0.1宋全恒新建文档 简介 注,需要提前完成从DockerService到FastBuild主机的免密,因为脚本使用了ssh命令。 博客描述04-22 周日 阿里云-瑶光上部署FastBuild过…

最大子序列的分数

题目链接 最大子序列的分数 题目描述 注意点 n nums1.length nums2.length从nums1和nums2中选一个长度为k的子序列对应的下标对nums1中下标对应元素求和&#xff0c;乘以nums2中下标对应元素的最小值得到子序列的分数0 < nums1[i], nums2[j] < 1000001 < k < …

MVCC 详解

介绍 MVCC&#xff0c;全称 Multi-Version Concurrency Control&#xff0c;即多版本并发控制 MVCC的目的主要是为了提高数据库并发性能&#xff0c;用更好的方式去处理读-写冲突&#xff0c;做到即使有读写冲突时&#xff0c;也能做到不加锁。 这里的多版本指的是数据库中同时…

Django项目运行报错:ModuleNotFoundError: No module named ‘MySQLdb‘

解决方法&#xff1a; 在__init__.py文件下&#xff0c;新增下面这段代码 import pymysql pymysql.install_as_MySQLdb() 注意&#xff1a;确保你的 python 有下载 pymysql 库&#xff0c;没有的话可以使用 pip install pymysql安装 原理&#xff1a;用pymysql来代替mysqlL…

Mysql数据库的基础学习

为什么使用数据库&#xff1f; 1.持久化&#xff1a;将数据保存到可掉电式存储设备中以供使用。 数据库相关概念&#xff1a; DB:数据库&#xff08;Databass&#xff09;即存储数据的仓库&#xff0c;本质是一个文件系统&#xff0c;保存了一系列有组织的数据DBMS:数据库管…

【简单介绍下Sass】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

怎么使用远程桌面传输文件?

微软提供的远程桌面功能是一项强大的工具&#xff0c;可让您在同一网络下远程访问和管理其他计算机。除了远程控制&#xff0c;它还支持文件传输功能&#xff0c;为Windows用户提供了极大的便利。在接下来的内容中&#xff0c;我们将介绍如何使用远程桌面传输文件。 如何从远程…

求正方形中一角四边形的面积

求绿色四边形的面积&#xff1f; 假设大正方形的边长为2a 通过中间的点做十字的辅助线&#xff0c;假设两条辅助线的长度为xy,uv 所以 1/2ay1/2au42① 1/2ay1/2av38② 1/2ax1/2av28③ ①③ 1/2ay1/2au1/2ax1/2av4228 &#xff08;1/2ay1/2av&#xff09;1/2au1/2ax4228 代入…

SeetaFace6人脸特征提取与对比C++代码实现Demo

SeetaFace6包含人脸识别的基本能力&#xff1a;人脸检测、关键点定位、人脸识别&#xff0c;同时增加了活体检测、质量评估、年龄性别估计&#xff0c;并且顺应实际应用需求&#xff0c;开放口罩检测以及口罩佩戴场景下的人脸识别模型。 官网地址&#xff1a;https://github.co…

Hive Transaction事务表(含实现原理)

Hive Transaction事务表 在Hive中&#xff0c;事务表&#xff08;Transactional Tables&#xff09;允许用户执行事务性操作&#xff0c;包括ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;特性。事务表是在Hive 0.14版本引入的&#xff0c;并且在后续版本中不断…

conan2 基础入门(05)-(静态库动态库)(DebugRelease)

conan2 基础入门(05)-(静态库&动态库)(Debug&Release) 文章目录 conan2 基础入门(05)-(静态库&动态库)(Debug&Release)⭐准备预备文件和Code ⭐静态库&动态库静态库动态库 ⭐Debug&ReleaseReleaseDebug END视频教学settings.yml ⭐准备 本文均在windo…

以太ETH链市值机器人

在数字资产交易市场的浪潮中&#xff0c;如何高效地管理市值、提升交易流动性并保障资金安全&#xff0c;一直是交易所和项目方关注的焦点。市值管理机器人飞机//aishutuyu以太ETH链市值机器人凭借其卓越的功能和强大的安全保障&#xff0c;为数字资产交易市场带来了革命性的变…

GeoServer安装以及部署

GeoServer介绍 GeoServer是一个开源的服务器软件&#xff0c;用于共享和编辑地理空间数据。它支持多种地理空间数据格式&#xff0c;并且可以发布为多种服务格式&#xff0c;如Web Feature Service (WFS)、Web Map Service (WMS)、Web Coverage Service (WCS)&#xff0c;以及…

十天学会单片机可能吗?单片机入门需要多久?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 十天学“会”单片机&#xf…

前后端完全开源!功能丰富的在线教室项目:Agora Flat

Agora Flat&#xff1a;高效集成的在线教室解决方案&#xff0c;重塑互动学习新体验。- 精选真开源&#xff0c;释放新价值。 概览 Agora Flat是在GitHub平台上公开分享的一个全面开源项目&#xff0c;它精心设计为一个高性能的在线教室解决方案&#xff0c;旨在便捷地搭建支持…

Python装饰器带括号和不带括号的理解

装饰器是 Python 中一个强大且灵活的特性&#xff0c;允许用户在不修改原有函数或类定义的基础上&#xff0c;为其增加额外功能。 今天在尝试自定义 Python 装饰器的时候遇到了一个问题&#xff0c;因为以前一直是使用装饰器&#xff0c;基本没有自定义过装饰器&#xff0c;所…

KEIL declaration may not appear after executable statement in block

KEIL declaration may not appear after executable statement in block 这个问题也是比较经典&#xff0c;就是不允许你的变量定义位置不允许在下边的代码区域&#xff0c;只允许在最上方 ‍ 修改编码模式为C99解决 ‍ ​​