已挂载文件系统的LVM快照

我想以编程方式在Linux中创build一个实时文件系统快照,最好使用LVM。 我想不要卸载它,因为我打开了很多文件(我最常见的情况是,我有一个繁忙的桌面有很多程序)。

据我所知,由于内核缓冲区和一般的文件系统活动,磁盘上的数据可能处于一个或多或less未定义的状态。

有没有办法“自动”卸载一个FS,做一个LVM快照并重新安装它? 如果操作系统将阻塞所有的活动几秒钟来完成这个任务,这将是确定的。 或者,也许某种primefaces“同步+快照”? 内核调用?

我不知道是否有可能

Solutions Collecting From Web of "已挂载文件系统的LVM快照"

对大多数Linux文件系统你不应该做任何事情。 它应该是没有任何努力,在你的一部分工作。 快照命令本身使用正在快照的卷查找挂载的文件系统,并调用一个特殊的挂钩,以一致的,可挂载的状态检查它们,并以原子方式执行快照。

较早版本的LVM附带一组VFS锁定补丁程序,可以修补各种文件系统,以便可以对其进行检查以获取快照。 但是新的内核应该已经被内置到大多数Linux文件系统中。

快照的这个介绍声称同样多。

而更多的研究显示,对于2.6系列的内核系列文件系统应该都支持这一点。 ReiserFS可能也是。 如果我了解btrfs的人,那么也可以这样做。

我知道RedHat Enterprise,Fedora和CentOS中的ext3和ext4会在创建LVM快照时自动检查点。 这意味着从来没有任何问题挂载快照,因为它总是干净的。

相信 XFS也有相同的支持。 我不确定其他文件系统。

这取决于您正在使用的文件系统。 使用XFS,您可以使用xfs_freeze -f同步并冻结FS,然后使用xfs_freeze -u再次激活它,以便您可以从冻结的卷创建快照,这应该是保存状态。

我不确定这是否会为您解决问题,但您可以将文件系统重新挂载为只读。 mount -o remount,ro /lvm (或者类似的东西)都可以实现。 完成快照后,可以使用mount -o remount,rw /lvm读写。

有没有办法“自动”卸载一个FS,做一个LVM快照并重新安装它?

即使文件系统不在LVM卷上,也可以对已安装的文件系统进行快照。 如果文件系统位于LVM上,或者它具有内置的快照功能(例如btrfs或ZFS),则使用它们。

下面的说明是相当低级的,但是如果您希望能够对不在LVM卷上的文件系统进行快照,并且无法将其移动到新的LVM卷,则它们可能非常有用。 不过,他们不适合胆小鬼:如果你犯了一个错误,你可能会损坏你的文件系统。 请务必查阅官方文档和dmsetup手册页,三重检查您正在运行的命令并进行备份

Linux内核有一个很棒的设备,称为设备映射器(Device Mapper),它可以做很好的事情,比如创建块设备,这些设备是其他块设备的“视图”,当然还有快照。 这也是LVM在引擎盖下使用的重要举措。

在下面的例子中,我假设你要创建快照/home ,这是一个位于/dev/sda2上的ext4文件系统。

首先,找到分区所在的设备映射器设备的名称:

 # mount | grep home /dev/mapper/home on /home type ext4 (rw,relatime,data=ordered) 

这里,设备映射器设备名称是home 。 如果块设备的路径不以/dev/mapper/开头,则需要创建设备映射器设备,然后重新挂载文件系统以使用该设备而不是HDD分区。 你只需要做一次。

 # dmsetup create home --table "0 $(blockdev --getsz /dev/sda2) linear /dev/sda2 0" # umount /home # mount -t ext4 /dev/mapper/home /home 

接下来,获取块设备的设备映射表:

 # dmsetup table home home: 0 3864024960 linear 9:2 0 

你的号码可能会有所不同。 设备目标应该是linear ; 如果你的不是,你可能需要特别考虑。 如果最后一个数字(起始偏移量)不是0,则需要创建一个中间块设备(与当前表中的表格相同),并将其作为基础而不是/dev/sda2

在上面的例子中, home正在使用linear目标的单一表格。 您将需要用新的替换此表,使用snapshot目标。

设备映射器提供三个快照目标:

  • snapshot目标,它将写入保存到指定的COW设备。 (请注意,即使它被称为快照,但术语是误导性的,因为快照将是可写的,但底层设备将保持不变。)

  • snapshot-origin目标,它将写入发送到底层设备,但也会将写入覆盖的旧数据发送到指定的COW设备。

通常,您将创建一个snapshot-origin目标,然后在其上创建一些snapshot目标。 这就是LVM所做的。 然而,更简单的方法是直接创建一个snapshot目标,这是我将在下面显示的。

无论选择何种方法,都不能写入底层设备( /dev/sda2 ),否则快照将看到文件系统的损坏视图。 所以,作为预防措施,您应该将底层的块设备标记为只读:

 # blockdev --setro /dev/sda2 

这不会影响由它支持的设备映射器设备,所以如果您已经在/dev/mapper/home上重新安装了/dev/mapper/home ,它应该没有明显的影响。

接下来,您将需要准备COW设备,该设备将存储自创建快照以来的更改。 这必须是一个块设备,但可以由一个稀疏文件支持。 如果你想使用例如32GB的稀疏文件:

 # dd if=/dev/zero bs=1M count=0 seek=32768 of=/home_cow # losetup --find --show /home_cow /dev/loop0 

显然,稀疏文件不应该在您正在快照的文件系统上:)

现在您可以重新加载设备的表格并将其转换为快照设备:

 # dmsetup suspend home && \ dmsetup reload home --table \ "0 $(blockdev --getsz /dev/sda2) snapshot /dev/sda2 /dev/loop0 PO 8" && \ dmsetup resume home 

如果成功,现在应该将/home写入/home_cow文件,而不是写入/dev/sda2 。 确保监视COW文件的大小,以及文件系统上的可用空间,以避免用完COW空间。

一旦你不再需要快照,你可以合并它(永久提交COW文件中的变化到底层设备),或丢弃它。

  • 要合并它:

    1. 将该表替换为snapshot-merge目标而不是snapshot目标:

       # dmsetup suspend home && \ dmsetup reload home --table \ "0 $(blockdev --getsz /dev/sda2) snapshot-merge /dev/sda2 /dev/loop0 P 8" && \ dmsetup resume home 
    2. 接下来,监视合并的状态,直到所有非元数据块合并为止:

       # watch dmsetup status home ... 0 3864024960 snapshot-merge 281688/2097152 1104 

      注意最后的3个数字(X / YZ)。 当X = Z时合并完成。

    3. 接下来,再次用线性目标替换表:

       # dmsetup suspend home && \ dmsetup reload home --table \ "0 $(blockdev --getsz /dev/sda2) linear /dev/sda2 0" && \ dmsetup resume home 
    4. 现在你可以拆卸回路设备了:

       # losetup -d /dev/loop0 
    5. 最后,您可以删除COW文件。

       # rm /home_cow 
  • 要放弃快照,请卸载/home ,执行上述步骤3-5,然后重新安装/home 。 尽管Device Mapper可以在不卸载/home情况下执行此操作,但是这样做没有任何意义(因为正在运行的程序在内存中的状态不再与文件系统状态相对应),并且可能会损坏文件系统。

只要你从不在任何职业环境中工作,FS腐败“极不可能”。 否则你会遇到现实,你可能会试图指责“有点腐烂”或“硬件”或其他什么,但这一切都归结为不负责任。 数据库环境之外冻结/解冻 (如提到的几次,只有在正确调用的情况下)才是足够的。 对于数据库,您仍然不会有事务完整备份,并且如果您认为恢复某个事务的备份恢复正常,请参阅启动语句。 根据您的活动,如果您需要备份,您可能会再增加5-10分钟的停机时间。 我们大多数人都可以轻易承受,但这不是一般的建议。 说实话,家伙。