5

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

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

有没有办法“原子地”卸载 FS,制作 LVM 快照并将其挂载回来?如果操作系统会阻止所有活动几秒钟来执行此任务,那将是可以的。或者可能是某种原子的“同步+快照”?内核调用?

我什至不知道这是否可能......

4

6 回答 6

12

对于大多数 Linux 文件系统,您不必做任何事情。它应该可以在您不付出任何努力的情况下工作。快照命令本身使用被快照的卷来寻找挂载的文件系统,并调用一个特殊的钩子来检查它们处于一致的、可挂载的状态,并以原子方式执行快照。

旧版本的 LVM 带有一组 VFS 锁补丁,可以修补各种文件系统,以便为快照设置检查点。但是对于应该已经内置到大多数 Linux 文件系统中的新内核。

这个关于快照的介绍也有同样的要求。

还有一点研究表明,对于 2.6 系列中的内核,ext 系列文件系统应该都支持这一点。ReiserFS 大概也是。如果我认识 btrfs 的人,那个人可能也认识。

于 2009-12-21T14:14:46.220 回答
4

我知道 RedHat Enterprise、Fedora 和 CentOS 中的 ext3 和 ext4 在创建 LVM 快照时会自动检查点。这意味着安装快照永远不会有任何问题,因为它总是干净的。

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

于 2009-12-21T14:15:32.733 回答
3

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

于 2009-12-21T14:07:40.303 回答
1

我不确定这是否对您有用,但您可以将文件系统重新安装为只读。 mount -o remount,ro /lvm(或类似的东西)会做的伎俩。完成快照后,您可以使用mount -o remount,rw /lvm.

于 2009-12-21T13:31:53.180 回答
1

有没有办法“原子地”卸载 FS,制作 LVM 快照并将其挂载回来?

即使文件系统不在 LVM 卷上,也可以对已挂载的文件系统进行快照。如果文件系统在 LVM 上,或者它有内置的快照工具(例如 btrfs 或 ZFS),那么请改用它们。

以下说明是相当低级的,但如果您希望能够对不在 LVM 卷上的文件系统进行快照,并且无法将其移动到新的 LVM 卷,它们会很有用。尽管如此,它们并不适合胆小的人:如果您犯了错误,您可能会损坏您的文件系统。确保查阅官方文档dmsetup手册页,三重检查您正在运行的命令,并进行备份

Linux 内核有一个很棒的工具,叫做设备映射器,它可以做一些很好的事情,比如创建作为其他块设备“视图”的块设备,当然还有快照。这也是 LVM 在幕后用来完成繁重工作的东西。

在下面的示例中,我假设您想要快照/home,这是一个位于/dev/sda2.

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

# 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 设备。

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

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

# blockdev --setro /dev/sda2

这不会影响它支持的 device-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,但它没有意义(因为内存中正在运行的程序的状态将不再对应于文件系统状态),并且它可能会损坏您的文件系统。

于 2017-02-08T15:50:31.590 回答
0

只要您从未在任何类型的专业环境中工作,FS 腐败“极不可能”。否则你会遇到现实,你可能会尝试指责“bit rot”或“hardware”之类的,但这一切都归结为不负责任。冻结/解冻(如多次提及,并且仅在正确调用的情况下)在数据库环境之外就足够了。对于数据库,您仍然没有事务完成备份,并且如果您认为在恢复时回滚某些事务的备份很好:请参阅起始句。根据活动,如果您需要该备份,您可能会再增加 5-10 分钟的停机时间 我们大多数人都可以轻松负担得起,但这不能是一般性的建议。 老实说缺点,伙计们。

于 2017-03-19T12:01:00.230 回答