我试图弄清楚 LVM 快照是如何工作的,以便我可以在我的文件服务器上实现它,但是我很难在谷歌上找到任何解释它是如何工作的东西,而不是如何将它用于基本备份系统。
从我读过的内容来看,我认为它的工作原理是这样的:
- 您有一个带有主分区的 LVM,并且该分区中没有大量未分配的可用空间
- 然后您拍摄快照并将其安装在新的逻辑卷上。快照应该有变化,所以第一个快照将是一个完整的副本,对吗?
- 然后,第二天你拍摄另一个快照(这个分区的大小不必那么大)并挂载它。
- LVM 以某种方式跟踪快照,并且不会在主卷上存储未更改的位。
- 然后你决定你有足够的快照并摆脱第一个。我不知道这是如何工作的,也不知道这将如何影响下一个快照。
有人可以纠正我哪里错了。充其量,我猜,我在谷歌上找不到任何东西。
vgdiplay
obu1:/home/jail/home/qps/backup/D# vgdisplay --- 卷组 --- VG 名称文件服务器LVM 系统编号 lvm2 格式 元数据区 1 元数据序列号 3 VG 访问读/写 VG 状态可调整大小 最大低压 0 电流 LV 2 打开LV 2 最大 PV 0 当前 PV 1 行动 PV 1 VG 大小 931.51 GB PE 大小 4.00 MB 总PE 238467 分配 PE / 大小 238336 / 931.00 GB 免费 PE / 大小 131 / 524.00 MB VG UUID qSGaG1-SQYO-D2bm-ohDf-d4eG-oGCY-4jOegU
为什么不看看LVM-HOWTO 的快照部分?
LVM 快照是您基本的“写入时复制”快照解决方案。快照实际上只不过是要求 LVM 给您一个指向文件系统当前状态的“指针”,并将快照后所做的更改写入指定区域。
LVM 快照“活动”在卷组内,该卷组托管受快照影响的卷 - 而不是另一个卷。您的陈述“...大量未分配的可用空间而不是分区”听起来您的想法是快照在受快照影响的卷组之外“存在”,这是不准确的。您的卷组位于硬盘分区中,并且该卷受快照以及您拍摄的任何快照都位于该卷组中。
使用 LVM 快照的正常方式不是用于长期存储,而是为了获得文件系统的一致“图片”,以便可以进行备份。备份完成后,快照将被丢弃。
创建 LVM 快照时,您指定一定量的空间来保存快照处于活动状态时所做的任何更改。如果所做的更改多于您为快照指定的空间,则会变得不可用并且必须丢弃。您不希望留下快照,因为 (a) 它们会填满并变得无法使用,以及 (b) 快照处于活动状态时系统的性能会受到影响——事情会变慢。
编辑:
Microsoft 卷影复制服务和 LVM 快照所做的并没有太大的不同。微软的解决方案更加全面(就像微软的典型情况一样——无论好坏,他们的工具和产品通常寻求解决相当大的问题而不是专注于一件事)。
VSS 是一个更全面的解决方案,它将支持快照和基于软件的快照的硬件设备的支持统一到一个 API 中。此外,VSS 的 API 允许通过快照 API 使应用程序处于静止状态,而 LVM 快照只关心快照——任何静止的应用程序都是您的问题(将数据库置于“备份”状态等)。
正如 Evan 所说,LVM 快照是写时复制快照解决方案的一个示例。它的工作原理与 Evan 暗示的有点不同,但差别不大。
当您有一个没有快照的 LVM 卷时,对该卷的写入会按您的预期进行。一个块被改变了,就是这样。
创建快照后,LVM 会立即创建一个块池。此池还包含卷的 LVM 元数据的完整副本。当主卷发生写入(例如更新 inode)时,被覆盖的块被复制到这个新池中,新块被写入主卷。这就是“写时复制”。因此,在创建快照和主卷的当前状态之间更改的数据越多,该快照池消耗的空间就越多。
当您挂载快照时,拍摄快照时写入的元数据允许将快照池块映射到卷中更改的块(或更高级别的快照)。这样,当对特定块进行访问时,LVM 就知道访问哪个块。就该卷上的文件系统而言,没有快照。
詹姆斯指出了这个系统的一个缺陷。当您拥有同一卷的多个快照时,每次写入主卷中的块时,您都可能会触发每个快照中的写入。这是因为每个快照都维护自己的更改块池。此外,对于长快照树,访问快照可能会导致服务器上的大量计算来确定需要为访问提供哪个确切块。
当您处理快照时,LVM 只是删除快照池并根据需要更新快照树。如果删除的快照是快照树的一部分,一些块将被复制到较低级别的快照。如果它是最低的快照(或唯一的一个),那么池就会被丢弃并且操作非常快。
一些文件系统确实提供文件系统内快照,ZFS 和 BTRFS 只是其中两个比较知名的。尽管文件系统本身管理已更改/未更改的映射,但它们的工作方式类似。这可以说是一种更好的方法,因为您可以 fsck 整个快照系列以保持一致性,这是直接使用 LVM 无法做到的。
LVM 快照效率低下,快照越多,系统运行速度就越慢。
我只支持我们使用的 xfs,xfs_freeze 可用于停止对文件系统的新访问并在磁盘上创建稳定的映像。
使用写时复制,以便有效地使用磁盘空间。
您已经在一个逻辑卷中创建了一个文件系统,其中有用于快照的备用空间。
这是FAQ中的一个例子
您没有指定您使用的是 Linux 还是 HP-UX。在 HP-UX 中,您创建一个逻辑卷并将其安装为另一个逻辑卷的快照。在 Linux 中,您创建一个逻辑卷作为快照卷。
在 HP-UX 中删除快照是通过卸载卷来完成的;在 Linux 中,它是通过使用 lvremove 删除逻辑卷来完成的。
在任何情况下,更改都是存储在快照中的唯一内容。快照可用的时间越长,它储存的变化就越多——如果大小或发布不当,它就有可能被填满。
快照卷上的磁盘访问速度比普通卷要慢;你必须考虑到这一点。
@Evan Anderson 和 @sysadmin1138 的答案虽然对他们的时代(2009 年)非常有启发性和针对性,但由于存在两种不同的 LVM 快照方法,现在已经有些过时了:
第一个(称之为经典LVM)是上述答案中描述的那个。它基本上设置了一个特定的磁盘部分来复制要覆盖的数据,这意味着多个快照会破坏性能(即:如果单个快照会使系统减慢 3-5 倍,两个快照会减慢 6-10 倍,三个12-15 倍的快照,依此类推)。这反过来又使他们无法支持滚动快照策略。此外,他们的元数据存储(纯文本)并未针对速度进行优化。事实上,它们的主要用途是备份:拍摄单个快照,然后在备份后删除;
新的(称为 Thin LVM 或lvmthin)是完全不同的野兽。它严重依赖二进制优化元数据(btree)来快速有效地跟踪空间块。拍摄快照不占用任何磁盘空间(即:不应声明快照大小并且不分开),除了一些更多使用的元数据空间。覆盖已经分配的块可能会再次导致读取-修改-写入,但是对于大型写入可以完全避免这种情况(其中“大”意味着大于精简池数据块)。更重要的是,多个快照不会复制比单个快照更多的数据,因为只有元数据被更改以将各种快照指向相同的数据块。在较暗的一面,应该注意到精简快照可以“填满”整个卷,导致所有写入停止。
您应该使用哪个 LVM 卷?对于根文件系统,我通常使用经典的 LVM 卷:它们坚如磐石,更容易恢复。此外,根分区本身通常不包含太多有价值的数据(因此正常的备份过程就足够了)。另一方面,对于数据量,我通常希望在过去几天/几周内扩展一些滚动快照,因此我使用 Thin LVM(或 ZFS 池,但这是另一回事......)。有关其他上下文,您可以在此处阅读