当前位置: 首页 > news >正文

QEMU增量镜像制作

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在服务器上,经常需要启动数十个或者几十个虚拟机,按照我们现有的方式是安装一个虚拟机,然后复制相应的份数。例如,一个虚机的镜像大小是4G,十个虚机的大小就需要占用40G空间。
事实上在目前为止里面还没有执行任何程序,这些空间都是分配,实际并不一定都要使用。那么是否能够实现用多少分配多少呢?分析下可以发现,每个虚拟机里面的内核都是一样的,大部分时候我们都不需要去修改里面的内核,是否能够共用内核?
Copy-On-Write模式为我们提供了很好的解决方式,通过创建一个基础镜像(base image),里面把各个虚拟机都需要的环境都搭建好,然后基于这个镜像建立起一个个“增量镜像”(增量镜像的初始大小低于1M),每个“增量镜像”对应一个虚拟机,虚拟机对镜像中所有的改变都记录在“增量镜像”里面,基础镜像始终保持不变。这样我们建立十个虚拟机,需要的空间为:4G+10*1M=4G,一下节省了近36G的空间。

对于我们Flexbng的环境,cp/dp的虚机可以共用一个基础镜像,然后各自有自己的增量镜像。
好处有:
1)在部署环境时,需要拷贝的文件大小和磁盘占用空间就会降低很多,尤其是多cp/dp的环境。
2)基础镜像不会被修改,新拉虚机时可以快速创建个“增量镜像”使用

基本步骤:
1. 创建一个基础镜像flexbng-normal.qcow2, 该镜像包含OS和必需的软件包

qemu-img info flexbng-normal.qcow2

image: flexbng-normal.qcow2
file format: qcow2
virtual size: 40G (42949672960 bytes)
disk size: 2.4G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false

  1. 清除基础镜像里面的临时文件(例如软件tar包、编译的文件、日志等等),然后退出虚机,并压缩基础镜像,压缩后的镜像为flexbng-base.qcow2。
    qemu-img convert -c -O qcow2 flexbng-normal.qcow2 flexbng-base.qcow2

qemu-img info flexbng-base.qcow2

image: flexbng-base.qcow2
file format: qcow2
virtual size: 40G (42949672960 bytes)
disk size: 1.1G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
3. 创建增量镜像flexbng-delta.qcow2
qemu-img create -f qcow2 -b flexbng-base.qcow2 flexbng-delta.qcow2

qemu-img info flexbng-delta.qcow2

image: flexbng-delta.qcow2
file format: qcow2
virtual size: 40G (42949672960 bytes)
disk size: 193K
cluster_size: 65536
backing file: flexbng-base.qcow2
Format specific information:
compat: 1.1
lazy refcounts: false

后面如果想将增量镜像中的修改合入到基础镜像中,需要执行commit命令:
qemu-img commit flexbng-delta.qcow2

实例展示:
在USB或者PXE部署时使用的增量镜像。

转载于:https://my.oschina.net/u/1777508/blog/1926823

相关文章:

  • SpringBoot 核心模块原理剖析
  • Confluence 6 的小型文字档案(Cookies)
  • WPF中使用amCharts绘制股票K线图
  • 装饰者模式--穿什么有这么重要?
  • 健身:手臂训练
  • SQLServer------查询结果为空的列赋默认值
  • 精简分页组件(手写)
  • Flutter 06:【小插曲】请慎重升级最新版本 AndroidStudio
  • 分页查询对象列表ListT findListByPage运用
  • centos /linux 修改目录或文件权限
  • Npm 多模块依赖解决方案
  • isset在php5.6-和php7.0+的一些差异
  • Nginx支持WebSocket反向代理-学习小结
  • linux服务器安装anaconda,然后远程使用jupyter
  • ES6是什么
  • 时间复杂度分析经典问题——最大子序列和
  • 【React系列】如何构建React应用程序
  • ECS应用管理最佳实践
  • ES6系统学习----从Apollo Client看解构赋值
  • JS笔记四:作用域、变量(函数)提升
  • js如何打印object对象
  • KMP算法及优化
  • Lsb图片隐写
  • spring boot下thymeleaf全局静态变量配置
  • SQLServer之创建数据库快照
  • text-decoration与color属性
  • 构造函数(constructor)与原型链(prototype)关系
  • 扑朔迷离的属性和特性【彻底弄清】
  • 前端_面试
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 深度学习中的信息论知识详解
  • 使用权重正则化较少模型过拟合
  • 算法---两个栈实现一个队列
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​queue --- 一个同步的队列类​
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (一)认识微服务
  • ***监测系统的构建(chkrootkit )
  • .apk 成为历史!
  • .dwp和.webpart的区别
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET下的多线程编程—1-线程机制概述
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .ui文件相关
  • @AliasFor注解
  • @Controller和@RestController的区别?
  • @Transactional类内部访问失效原因详解
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [100天算法】-二叉树剪枝(day 48)
  • [1181]linux两台服务器之间传输文件和文件夹
  • [2016.7 day.5] T2