从零自制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 来安装(自动挡,不用自己考虑太多的环境因素),这样子搭建起来更快一点,我们…...

JDBC连不上mysql:Unable to load authentication plugin ‘caching_sha2_password‘.
最近为一个spring-boot项目下了mysql-9.3.0,结果因为mysql版本太新一直报错连不上。 错误如下: 2025-06-01 16:19:43.516 ERROR 22088 --- [http-nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispat…...
[网页五子棋][用户模块]数据库设计和配置(MyBatis)、约定前后端交互接口、服务器开发
文章目录 数据库数据库设计配置 MyBatis1. Spring 配置2. 创建实体类3. 创建 Mapper 接口4. 使用 MyBatis 约定前后端交互接口登录接口注册接口获取用户信息 服务器开发loginregistergetUserInfo完整代码 数据库 数据库设计 完成注册登录以及用户分数管理 使用数据库来保存上…...

VIN码识别解析接口如何用C#进行调用?
一、什么是VIN码识别解析接口? VIN码不仅是车辆的“身份证”,更是连接制造、销售、维修、保险、金融等多个环节的数字纽带。而VIN码查询API,正是打通这一链条的关键工具。 无论是汽车电商平台、二手车商、维修厂,还是保险公司、金…...
@Docker Compose部署Alertmanager
文章目录 Docker Compose部署Alertmanager1. 准备工作1.1 系统要求1.2 目录结构准备 2. 配置文件准备2.1 创建docker-compose.yml文件2.2 创建Alertmanager配置文件 3. 部署Alertmanager3.1 启动服务3.2 验证服务状态3.3 检查日志 4. 服务验证4.1 访问Web UI 4.2 API健康检查5.…...

【STM32】HAL库 之 CAN 开发指南
基于stm32 f407vet6芯片 使用hal库开发 can 简单讲解一下can的基础使用 CubeMX配置 这里打开CAN1 并且设置好波特率和NVIC相关的配置 波特率使用波特率计算器软件 使用采样率最高的这段 填入 得到波特率1M bit/s 然后编写代码 环形缓冲区 #include "driver_buffer.h&qu…...

Linux --进度条小程序更新
这里使用随机数来模拟下载量,来实现一个下载进度更新的小程序 main.c 的代码,其中downlod这个函数使用的是函数指针,如果有多个进度条函数可以传入进行多样化的格式下载显示,还需要传入一个下载总量,每次"下载以…...

使用Mathematica绘制随机多项式的根
使用ListPlot和NSolve直接绘制: (*返回系数为r和s之间整数的n次随机多项式*) eq[n_, r_, s_] : RandomInteger[{r, s}, {n}] . Array[Power[x, # - 1] &, n] (*返回给定随机多项式的根所对应的笛卡尔坐标*) sol[n_, r_, s_] : {Re[#], Im[#]} & / (x /.…...
LG P4119 [Ynoi2018] 未来日记 Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 m m m 个操作分两种: replace ( l , r , x , y ) \operatorname{replace}(l,r,x,y) replace(l,r,x,y):将 a l ∼ a r a_l\sim a_r …...

PyTorch中nn.Module详解
直接print(dir(nn.Module)),得到如下内容: 一、模型结构与参数 parameters() 用途:返回模块的所有可训练参数(如权重、偏置)。示例:for param in model.parameters():print(param.shape)named_parameters…...
华为OD机试_2025 B卷_静态扫描(Python,100分)(附详细解题思路)
题目描述 静态扫描可以快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出: 1、文件扫描的成本和文件大小相关,如果文件大小为N,则扫描成本为N个金币 2、扫描报告的缓存成本和文件大小无关,每缓存一个报告需要…...