LVM快照技术详解:原理、创建与应用
LVM快照技术详解:原理、创建与应用
LVM(逻辑卷管理)的快照功能是系统管理员的重要工具,它采用写时复制(COW)技术,在不中断服务的情况下实现数据备份。本文将详细介绍LVM快照的原理、创建方法、数据还原以及应用场景,帮助读者掌握这一实用技术。
LVM机制提供了对逻辑卷(LV)创建快照的功能,主要目的是给文件系统做一个备份。LVM的快照功能采用写时复制(Copy-On-Write,COW)技术,比传统的备份技术效率更高。创建快照时无需停止服务,就可以对数据进行备份。
LVM快照原理
LVM采用的写时复制技术是指:当LVM快照创建时,仅创建到实际数据的inode的硬链接(hard-link)。只要实际的数据没有改变,快照就只包含指向数据的inode的指针,而非数据本身。快照会跟踪原始卷中块的改变,一旦你更改了快照对应的文件或目录,这个时候原始卷上将要改变的数据会在改变之前拷贝到快照预留的空间。
上图展示了LVM快照的工作原理。左图为最初创建的快照数据卷状况,LVM会预留一个区域(比如左图的左侧三个PE区块)作为数据存放处。此时快照数据卷内并没有任何数据,而快照数据卷与源数据卷共享所有的PE数据,因此你会看到快照数据卷的内容与源数据卷中的内容是一模一样的。等到系统运行一阵子后,假设A区域的数据被更新了(上面右图所示),则更新前系统会将该区域的数据移动到快照数据卷中,所以右图的快照数据卷中被占用了一块PE成为A,而其他B到I的区块则还是与源数据卷共享!
需要注意以下两点:
- VG中需要预留存放快照本身的空间,不能全部被占满。
- 快照所在的VG必须与被备份的LV相同,否则创建快照会失败。
创建LVM快照
在创建快照前,让我们先查看一下系统当前的基本情况:
- 数据卷
nicklv00
大小为15G,在卷组nickvg
中。 - 卷组
nickvg
的容量为70G,其中有55G为空闲容量,所以我们有足够的资源为数据卷nickvg/nicklv00
创建快照。
创建快照的命令如下:
$ sudo lvcreate -L 15G --snapshot --name nicksnap00 nickvg/nicklv00
此时如果把LVnicksnap00
挂载到系统中,里面的内容和LVnicklv00
中的内容是一样的。创建的快照的大小可以比源数据卷小,但是当源数据卷中的数据更新过多时会导致快照容量不足而引起的错误并丢失数据。
还原部分数据
如果我们明确知道需要还原某个文件,可以挂载快照数据卷,直接拷贝其中旧版本的文件即可。下面以/home/doc/hello.txt
文件为例进行演示。hello.txt
文件原本的内容为"hello world",先更新一下hello.txt
文件:
$ echo "I changed you!" >> /home/doc/hello.txt
接下来我们开始通过快照来还原这个文件。挂载快照数据卷:
$ sudo mount /dev/nickvg/nicksnap00 /home/nick/bak
查看快照中的文件内容:
$ cat /home/nick/bak/doc/hello.txt
验明正身后直接通过cp
命令覆盖原文件:
$ sudo cp /home/nick/bak/doc/hello.txt /home/doc/
还原整个数据卷上的数据
如果数据卷上有很多小文件,并且都可能会被更新,这种情况下就不适合用上面的方法了。此时一把还原所有的数据会效率更高些,接下来我们介绍还原整个数据卷上所有数据的方式。
- 挂载快照数据卷
- 创建一个新的目录
/home/nick/backup
,注意这个目录所在的文件系统既不是源数据卷也不是快照数据卷。然后把快照数据卷中的内容创建为压缩文件保存在/home/nick/backup
目录中:
$ sudo tar -czf /home/nick/backup/lvm.tar.gz -C /home/nick/bak .
为什么要把数据备份到其它的数据卷呢?为什么不可以直接格式化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
选项一把搞定整个数据卷的还原。下面演示该方法的主要步骤。
- 创建快照:
$ sudo lvcreate -L 15G --snapshot --name nicksnap00 nickvg/nicklv00
- 更新文件:
$ echo "I changed you!" >> /home/doc/hello.txt
- 卸载源数据卷:
$ sudo umount /home/doc
- 合并快照:
$ sudo lvconvert --merge nickvg/nicksnap00
注意,合并快照的操作会自动删除快照数据卷。
- 重新挂载源数据卷:
$ sudo mount /dev/mapper/nickvg-nicklv00 /home/doc
$ cat /home/doc/hello.txt
hello.txt
文件中没有字符串"I changed you!",说明整个数据卷上的内容已经被还原到了创建快照的时刻。
利用快照创建测试环境
如果我们需要在测试环境中不断的修改文件,就可以利用快照来创建这样的测试环境。想想看,对一个数据卷创建快照,然后把这个快照数据卷挂载到系统中并作为测试环境任意地修改上面的数据;当测试完成时直接卸载并删除这个快照就可以了;如果还需要这样的测试环境,再创建一个新的快照就行了,是不是很方便呢!
总结
快照是LVM中的一个稍微高级一点的话题,但仅就日常的使用来说,本文介绍的常见用法足够大家愉快的开启探索之旅了。