从零自制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是您想要执行的外部命令的名称(例如ls、curl等),而arg1到argN是传递给该命令的参数。参数之间以逗号分隔,并且每个参数都是一个单独的字符串,即使是那些在命令行中看起来像是一个整体的参数(例如带有空格的文件路径),也需要作为一个整体字符串传递。
格式差异
-
命令与参数: 执行不同命令时,主要的格式差异在于命令本身的名称以及它需要的参数。每个命令根据其功能会有不同的参数需求和格式。例如,
ping命令可能需要一个主机名作为参数,而cp命令则需要源文件路径和目标文件路径。 -
传递选项与参数: 一些命令支持长选项(如
--help)和短选项(如-h),这些选项的使用和它们后面的参数(如果有的话)也是exec.Command参数的一部分。例如,exec.Command("grep", "-r", "pattern", "directory")。 -
环境变量与工作目录: 除了命令和参数,
exec.Command还允许通过Cmd.Env和Cmd.Dir字段设置环境变量和工作目录。这不改变基本的命令格式,但会影响命令执行的环境。 -
输入输出重定向: 如你之前代码所示,可以使用
Cmd.Stdin、Cmd.Stdout、Cmd.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后

相关文章:
从零自制docker-12-【overlayfs】
文章目录 overlayfsexec.Command("tar", "-xvf", busyboxTarURL, "-C", busyboxURL).CombinedOutput()exec.Command格式差异 挂载mount卸载unmount代码地址结果演示 overlayfs 就是联合文件系统,将多个文件联合在一起成为一个统一的…...
凸优化理论学习一|最优化及凸集的基本概念
文章目录 一、优化问题(一)数学优化(二)凸优化 二、凸集(一)一些标准凸集(二)保留凸性的运算(三)正常锥和广义不等式(四)分离和支撑超…...
【R语言从0到精通】-4-回归建模
通过之前的文章,我们已经基本掌握了R语言的基本使用方法,那从本次教程开始,我们开始聚焦如何使用R语言进行回归建模。 4.1 回归简介 回归分析是一种统计学方法,用于研究两个或多个变量之间的相互关系和依赖程度。它可以帮助我们了…...
论文 学习 Transformer : Attention Is All You Need
目录 概述: 对摘要的理解: 框架解析 按比例缩放的点积注意力 多头注意力机制 前馈神经网络与位置编码 概述: transformer 是一个encoder ——decoder 结构的用于处理序列到序列转换任务的框架,是第一个完全依赖自注意力机制…...
工厂模式+策略模式
输入实体 基类 import lombok.Data;Data public class PersonInputDto {private Integer id;private String name; }子类 Data AllArgsConstructor NoArgsConstructor public class ManPerson extends PersonInputDto {private String sex; }Data AllArgsConstructor NoArgs…...
TMS320F28335学习笔记-时钟系统
第一次使用38225使用了普中的clocksystem例程进行编译,总是编译失败。 问题一:提示找不到文件 因为工程的头文件路径没有包含,下图的路径需要添加自己电脑的路径。 问题二 找不到库文件 例程种的header文件夹和common文件夹不知道从何而来…...
【Apache POI】Apache POI-操作Excel表格-简易版
Catalog Apache POI-操作Excel表格1. 需求2. 优点3. 缺点4. 应用场景5. 使用方法6. SpringBoot工程中处理Excel表格7. Demo示例 Apache POI-操作Excel表格 1. 需求 大多数项目的在运营过程中,会产生运营数据,如外卖系统中需要统计每日的订单完成数、每…...
MySQL系列之索引
🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期热门专栏回顾 专栏…...
【问题分析】锁屏界面调起google语音助手后壁纸不可见【Android 14】
1 问题描述 为系统和锁屏分别设置两张不同的壁纸,然后在锁屏界面长按Power调起google语音助手后,有时候会出现壁纸不可见的情况,如以下截图所示: 有的时候又是正常的,但显示的也是系统壁纸,并非是锁屏壁纸…...
Java入门基础学习笔记8——注释
1、注释: 注释是写在程序中对代码进行解释说明的文件,方便自己和其他人查看,以便理解程序的。 package cn.ensource.note;/**文档注释文档注释 */ public class NoteDemo {public static void main(String[] args) {// 单行注释System.out.…...
上班工资太低了,哪些副业可以多赚钱?
今天给各位分享最赚钱的副业方式的知识,其中也会对比较赚钱的副业进行解释. 1、网站接单 一般20页左右的PPT报价基本在200-400元。如果能每周接单,一个月就有接近1000元的副业收入。提交摄影和绘画作品 比起画画,靠摄影赚点外快更容易一点。…...
原子学习笔记4——GPIO 应用编程
一、应用层如何操控 GPIO 与 LED 设备一样,GPIO 同样也是通过 sysfs 方式进行操控,进入到/sys/class/gpio 目录下,如下所示: gpiochipX:当前 SoC 所包含的 GPIO 控制器,我们知道 I.MX6UL/I.MX6ULL 一共包…...
查看iqn编码
cat /etc/iscsi/initiatorname.iscsi ## for each iSCSI initiator. Do NOT duplicate iSCSI InitiatorNames. InitiatorNameiqn.2004-10.com.ubuntu:01:9ebe1a68...
如何安全的使用密码登录账号(在不知道密码的情况下)
首先,需要用到的这个工具: 度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z 1、打开工具,进入账号密码模块,如图 2、看到鼠标移动到密码那一栏有提示,按住Ctrl或者Alt点击或者双击就能复制内容&…...
软件需求和设计评审
目录 引言 1. 软件评审的方法和技术 2. 产品需求评审:构建正确的产品 3. 设计评审:构建正确的产品 4. 软件评审的最佳实践 结语 引言 在软件开发的迷宫中,需求和设计评审是通往成功产品的关键门户。它们是确保软件质量和满足用户需求的…...
论文笔记ColdDTA:利用数据增强和基于注意力的特征融合进行药物靶标结合亲和力预测
ColdDTA发表在Computers in Biology and Medicine 的一篇一区文章 突出 • 数据增强和基于注意力的特征融合用于药物靶点结合亲和力预测。 • 与其他方法相比,它在 Davis、KIBA 和 BindingDB 数据集上显示出竞争性能。 • 可视化模型权重可以获得可解释的见解。 …...
如何防止WordPress网站内容被抓取
最近在检查网站服务器的访问日志的时候,发现了大量来自同一个IP地址的的请求,用站长工具分析确认了我的网站内容确实是被他人的网站抓取了,我第一时间联系了对方网站的服务器提供商投诉了该网站,要求对方停止侵权行为,…...
全球化战略中的技术支柱:出海企业的网络技术解决方案
随着全球市场的一体化,中国的电商与游戏行业越来越倾向于扩展国际市场,这一过程被称为“出海”。成功的出海战略不仅需要强大的市场洞察和文化适应能力,还需依赖高效的网络技术,包括SOCKS5代理、代理IP、以及全面的网络安全策略。…...
在Linux上安装并运行RabbitMQ
目录 准备CentOS服务器 下载rabbit-server和erlang文件 启动RabbitMQ服务 准备CentOS服务器 两个命令,选一个能用的,查看CentOS服务器的版本 lsb_release -a下载rabbit-server和erlang文件 参考文章:http://t.csdnimg.cn/t8BbM 1、创建新…...
使用 docker-compose 搭建个人博客 Halo
说明 我这里使用的是 Halo 作为博客的工具,毕竟是开源了,也是使用 Java 写的嘛,另外一点就是使用 docker 来安装(自动挡,不用自己考虑太多的环境因素),这样子搭建起来更快一点,我们…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑 在电子商务领域,转化率与网站性能是决定商业成败的核心指标。今天,我们将深入解析不同类型电商平台的转化率基准,探讨页面加载速度对用户行为的…...
五、jmeter脚本参数化
目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...
aurora与pcie的数据高速传输
设备:zynq7100; 开发环境:window; vivado版本:2021.1; 引言 之前在前面两章已经介绍了aurora读写DDR,xdma读写ddr实验。这次我们做一个大工程,pc通过pcie传输给fpga,fpga再通过aur…...
宠物车载安全座椅市场报告:解读行业趋势与投资前景
一、什么是宠物车载安全座椅? 宠物车载安全座椅是一种专为宠物设计的车内固定装置,旨在保障宠物在乘车过程中的安全性与舒适性。它通常由高强度材料制成,具备良好的缓冲性能,并可通过安全带或ISOFIX接口固定于车内。 近年来&…...
【向量库】Weaviate 搜索与索引技术:从基础概念到性能优化
文章目录 零、概述一、搜索技术分类1. 向量搜索:捕捉语义的智能检索2. 关键字搜索:精确匹配的传统方案3. 混合搜索:语义与精确的双重保障 二、向量检索技术分类1. HNSW索引:大规模数据的高效引擎2. Flat索引:小规模数据…...
