LVM : 快照
LVM 机制还提供了对 LV 做快照的功能,也就是说可以给文件系统做一个备份,这也是设计 LVM 快照的主要目的。LVM 的快照功能采用写时复制技术(Copy-On-Write,COW),这比传统的备份技术的效率要高很多。创建快照时不用停止服务,就可以对数据进行备份。说明:LVM 还支持 thin 类型的快照,但是本文中的快照都是指 COW 类型的快照。
LVM 采用的写时复制,是指当 LVM 快照创建的时候,仅创建到实际数据的 inode 的硬链接(hark-link)而已。只要实际的数据没有改变,快照就只包含指向数据的 inode 的指针,而非数据本身。快照会跟踪原始卷中块的改变,一旦你更改了快照对应的文件或目录,这个时候原始卷上将要改变的数据会在改变之前拷贝到快照预留的空间。说明:本文的演示环境为 ubuntu 16.04。
LVM 快照的原理
创建快照实际上也是创建了一个逻辑卷,只不过该卷的属性与普通逻辑卷的属性有些不一样。我们可以通过下图来理解快照数据卷(图中的实线框表示快照区域,虚线框表示文件系统):
左图为最初创建的快照数据卷状况,LVM 会预留一个区域 (比如左图的左侧三个 PE 区块) 作为数据存放处。 此时快照数据卷内并没有任何数据,而快照数据卷与源数据卷共享所有的 PE 数据, 因此你会看到快照数据卷的内容与源数据卷中的内容是一模一样的。 等到系统运行一阵子后,假设 A 区域的数据被更新了(上面右图所示),则更新前系统会将该区域的数据移动到快照数据卷中, 所以在右图的快照数据卷中被占用了一块 PE 成为 A,而其他 B 到 I 的区块则还是与源数据卷共享!
由於快照区与原本的 LV 共享很多 PE 区块,因此快照区与被快照的 LV 必须要在同一个 VG 上头,下面两点非常重要:
- VG中需要预留存放快照本身的空间,不能全部被占满。
- 快照所在的 VG 必须与被备份的 LV 相同,否则创建快照会失败。
创建 LVM 快照
在创建快照前让我们先查看一下系统当前的基本情况:
数据卷 nicklv00 大小为 15G,在卷组 nickvg 中。
卷组 nickvg 的容量为 70G,其中有 55G 为空闲容量,所以我们有足够的资源为数据卷 nickvg/nicklv00 创建快照。
其实快照就是一个特殊类型的数据卷,所以创建快照的命令和创建数据卷的命令相同,也是 lvcreate:
$ sudo lvcreate -L 15G --snapshot --name nicksnap00 nickvg/nicklv00
其实就是添加了一个特殊类型的 LV:
此时如果把 LV nicksnap00 挂载到系统中,里面的内容和 LV nicklv00 中的内容是一样的。
创建的快照的大小可以比源数据卷小,但是当源数据卷中的数据更新过多时会导致快照容量不足而引起的错误并丢失数据。
创建快照后,如果源数据卷中的文件被更新了,快照系统中则保存着其创建快照时的版本。
还原部分数据
如果我们明确的知道需要还原某个文件,可以挂载快照数据卷,直接拷贝其中旧版本的文件即可。下面以 /home/doc/hello.txt 文件为了进行演示。hello.txt 文件原本的内容为 "hello world",先更新一下 hello.txt 文件:
我们在文件中加入了一句话:"I changed you!"。接下来我们开始通过快照来还原这个文件。
挂载快照数据卷
查看快照中的文件内容:
验明正身后直接通过 cp 命令覆盖原文件就可以了:
还原整个数据卷上的数据
如果数据卷上有很多小文件,并且都可能会被更新,这种情况下就不适合用上面的方法了。此时一把还原所有的数据会效率更高些,接下来我们介绍还原整个数据卷上所有数据的方式。
挂载快照数据卷
这一步与之前的操作相同,挂载点也同样为 /home/nick/bak 目录。
把快照中的数据导出到另外一个数据卷上
创建一个新的目录 /home/nick/backup,注意这个目录所在的文件系统既不是源数据卷也不是快照数据卷。然后把快照数据卷中的内容创建为压缩文件保存在 /home/nick/backup 目录中:
为什么要把数据备份到其它的数据卷呢?为什么不可以直接格式化 nickvg/nicklv00 然后将快照 nickvg/nicksnap00 直接复制给 nickvg/nicklv00 呢? 原因是因为 nickvg/nicksnap00 是 nickvg/nicklv00 的快照,如果格式化整个 nickvg/nicklv00,那么nickvg/nicklv00 上的所有数据都会被搬移到 nickvg/nicksnap00。 如果 nickvg/nicksnap00 的容量不够大,那么部分数据将无法复制到 nickvg/nicksnap00 内!
卸载并删除快照数据卷
$ sudo umount /home/nick/bak
$ sudo lvremove nickvg/nicksnap00
卸载源数据卷,格式化后重新挂载
$ sudo umount /home/doc
$ sudo mkfs.ext4 /dev/nickvg/nicklv00
$ sudo mount /dev/mapper/nickvg-nicklv00 /home/doc
把数据还原到源数据卷
$ sudo tar -xf /home/nick/backup/lvm.tar.gz -C /home/doc
这样就把创建快照时刻的数据完全还原出来了。
合并快照(merge snapshot)
前面介绍的方法可以恢复整个数据卷上的数据,但是操作起来实在是太繁琐了,其实我们可以通过 lvconvert 命令配合其 --merge 选项一把搞定整个数据卷的还原。下面演示该方法的主要步骤。
创建快照
由于前面的演示删除了快照数据卷,这里我们重新创建名称为 nicksnap00 的快照数据卷:
$ sudo lvcreate -L 15G --snapshot --name nicksnap00 nickvg/nicklv00
然后更新一下文件 /home/doc/hello.txt:
$ echo "I changed you!" >> /home/doc/hello.txt
卸载源数据卷
合并快照的操作也需要卸载源数据卷:
$ sudo umount /home/doc
合并快照
确认源数据卷和快照数据卷都没有被挂载后就可以执行合并快照的操作了:
$ sudo lvconvert --merge nickvg/nicksnap00
注意,合并快照的操作会自动删除快照数据卷:
上图显示快照数据卷 nicksnap00 已经被删除了。
重新挂载源数据卷
现在我们来重新挂载源数据卷并查看文件 hello.txt 的内:
$ sudo mount /dev/mapper/nickvg-nicklv00 /home/doc
$ cat /home/doc/hello.txt
hello.txt 文件中没有字符串 "I changed you!",说明整个数据卷上的内容已经被还原到了创建快照的时刻。
利用快照创建测试环境
如果我们需要在测试环境中不断的修改文件,就可以利用快照来创建这样的测试环境。想想看,对一个数据卷创建快照,然后把这个快照数据卷挂载到系统中并作为测试环境任意地修改上面的数据;当测试完成时直接卸载并删除这个快照就可以了;如果还需要这样的测试环境,再创建一个新的快照就行了,是不是很方便呢!
总结
快照是 LVM 中的一个稍微高级一点的话题,但仅就日常的使用来说,本文介绍的常见用法足够大家愉快的开启探索之旅了。
参考:
LVM 快照
LVM 的系统快照
lvm 逻辑卷的快照及备份 还原
在 LVM中 录制逻辑卷快照并恢复
LVM Snapshot Merging
LVM : 快照的更多相关文章
- Linux操作系统备份之一:使用LVM快照实现Linux操作系统数据的在线备份
这里我们讨论Linux操作系统的备份. 在生产环境,客户都会要求做全系统的数据备份,用于系统崩溃后的一种恢复手段.这其中就包含操作系统数据的备份恢复. 由于是生产环境,客户都会要求备份不中断业务,也就 ...
- lvm snapshot(lvm 快照)
lvm快照有多种实现方法,其中一种是COW(Copy-On-Write),不用停止服务或将逻辑卷设为只读就可以进行备份,当一个 snapshot创建的时候只是拷贝原始卷里的元数据,而不是物理上的数据, ...
- 烂泥:KVM利用LVM快照快速部署虚拟机
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上一篇文章介绍了有关KVM利用LVM快照备份和恢复虚拟机的功能,这篇文章我们来介绍,如何利用LVM快照功能为KVM快速部署虚拟机. 部署虚拟机需要以下几 ...
- 烂泥:LVM学习之KVM利用LVM快照备份与恢复虚拟机
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 最近一段时间一直在学习有关LVM逻辑卷方面的知识,前几篇文章介绍了有关LVM的逻辑卷的基本相关知识,包括逻辑卷及卷组的扩容与缩小.今天我们再来介绍LVM ...
- lvm快照备份数据库(Mysql5.7)
备份的目的 能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方. 备份的分类 以操作过程中服务的可用性分: 冷备份:cold backup mysql服务关闭,mysq ...
- LVM快照备份与恢复
简介 最近在做数据备份方面的工作,用到两个工具,一个是dd,而另一个是lvm的快照(snapshot).由于数据比较大,直接是用dd非常耗时,而lvm的快照可以在几秒内轻松搞定,而且可以达到实时的 ...
- MySQL基于LVM快照的备份恢复(临时)
目录1.数据库全备份2.准备LVM卷3.数据恢复到LVM卷4.基于LVM快照备份数据5.数据灾难恢复6.总结 写在前面:测试环境中已安装有mysql 5.5.36数据库,但数据目录没有存放在LVM卷, ...
- mysql数据库基于LVM快照的备份
lvm-snapshot: 基于LVM快照的备份 1.事务日志跟数据文件必须在同一个卷上 2.创建快照卷之前,要请求mysql的全局锁,在快照创建完成之后释放锁 3 ...
- MySQL的备份和恢复-基于LVM快照的备份(lvm-snapshot)
MySQL的备份和恢复-基于LVM快照的备份(lvm-snapshot) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是快照卷 如上图所示,原卷和快照卷可以不一样大,因为 ...
随机推荐
- Asp.Net配置不允许通过url方式访问目录下的资源
Asp.Net网站发布后,有部分文件为了安全性,是不能直接通过url访问获取 通常有2种做法: 1.将文件目录建立在 App_code 或者App_Data 等默认的隐藏目录下 2.将文件的目录添加到 ...
- NAudio音频文件转换
1.NuGet安装 NAudio,项目及demo的网址:https://github.com/naudio/NAudio Encode to MP3, WMA and AAC with MediaFo ...
- MySQL重做日志相关
Ⅰ.事务的实现 这里我们先抛出答案,通过答案再展开分析 特性 实现 A(原子性) redo C(一致性) undo I(隔离性) lock D(持久性) redo/undo 本节针对redo展开分 ...
- Git的gc功能
http://blog.csdn.net/lihuanshuai/article/details/37345565 Git的底层并没有采用 CVS.SVN 底层所采用的那套增量式文件系统,而是采用一套 ...
- HashTree【转】
http://blog.csdn.net/yang_yulei/article/details/46337405 在各种数据结构(线性表.树等)中,记录在结构中的相对位置是随机的.因此在机构中查找记录 ...
- [SequenceFile_1] Hadoop 序列文件
1. 关于 SequenceFile 对于日志文件来说,纯文本不适合记录二进制类型数据,通过 SequenceFile 为二进制键值对提供了持久的数据结构,将其作为日志文件的存储格式时,可自定义键(L ...
- Centos7下安装与卸载docker应用容器引擎
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...
- Navicat 连接Oracle时提示oracle library is not loaded的问题解决
笔者使用的Navicat Premium 12启动界面截屏: 请注意是64位的.笔者win7 64位系统. 连接Oracle时提示“oracle library is not loaded”. 解决方 ...
- oracle中nvarchar2字符集不匹配
oracle当多表union时遇到nvarchar2类型时报错 字符集不匹配对使用nvarchar的地方,加上 to_char( nvarchar 的变量或字段 ) 如:select to_char( ...
- 有关科学计算方面的python解决
在科学计算方面,一般觉得matlab是一个超强的东西.此外还有R. 至于某种语言来说,一般都要讲究一些特别的算法,包含但不限于: 矩阵方面的计算 指数计算 对数计算 多项式运算 各类方程求解 总之.仅 ...