有没有类似于 rsync 同步块设备的东西?

Gea*_*net 8 synchronization

我使用 dd 安装了 linux 系统,克隆了几个 32Gb pendrive。后来我确实缩小了一个分区,并做了一些更多的更改(在“主”中)。是否有任何工具可以仅传输更改的块以避免使用 dd 进行缓慢的完全重新克隆?

我想到了rsync,但它似乎只适用于文件。

phe*_*mer 13

rsync 的某些版本具有此功能(这取决于您的发行版)。发行版通常适用于 rsync 有 2 个补丁。一个用于从块设备读取(提供--copy-devices标志),另一个用于写入块设备(提供标志--write-devices)。然而,即使有了这些,以这种方式使用 rsync 还需要一些其他标志和警告。

让我们看一下命令,然后分解它:

rsync -I --copy-devices --write-devices --no-whole-file --inplace \
  "$(readlink -f "/dev/vg_src/lv_src")" "$(readlink -f "/dev/vg_dst/lv_dst")"
Run Code Online (Sandbox Code Playgroud)

-I是因为 rsync 将查看块设备文件(代表设备的文件系统条目)的时间戳和大小,而不是块设备内容,并可能跳过同步。该标志强制 rsync 评估块设备的内容。

告诉--copy-devicesrsync 从源块设备的内容而不是/dev文件进行同步。

告诉--write-devicesrsync 同步到目标块设备的内容而不是替换文件/dev

告诉--no-whole-filersync 仅传输已更改的块。如有必要,可以控制块大小--block-size

告诉--inplacersync 更新目标块设备,而不是创建临时文件并将其重命名到位。

这些$(readlink ...)调用是因为 rsync 通常会查看路径并看到它们是符号链接,并且不会将它们识别为块设备。因此readlink取消引用符号链接。


Ste*_*fan 12

如今,rsync支持复制设备,具有:

rsync --copy-devices --write-devices <FROM> <TO>
Run Code Online (Sandbox Code Playgroud)

请注意,它仅在找到实际设备节点时才写入设备。因此,不要用作/dev/mapper/<VG>-<LV>目标,因为它只会(尝试)用包含源设备内容的文件替换符号链接。

[它的选项之一--*link*可能可以告诉它遵循这些符号链接,但我只是使用它/dev/dm-<NN>。]


Gea*_*net 11

根据描述:Bscp通过 SSH 连接复制单个文件或块设备,仅传输已更改的部分。

  • @Kusalananda 是的,但是如果我有空闲空间来制作整个块设备的图像,我可能就不需要智能复制工具了。 (2认同)

Gil*_*il' -3

不,也不可能有。Rsync 使用文件时间戳来确定要复制的内容和要跳过的内容。没有什么比文件更低的级别类似了。磁盘上的数据不记得曾经有过不同的分区排列。

为了确保两个磁盘相同,在文件系统下工作的工具必须读取两侧的每个块,如果不同,则将源块复制到目标块上。这通常比无条件复制要慢。如果对目标磁盘的写入比读取慢很多,则可能会更快(但与 rsync 通过完全跳过未更改的文件所获得的效果仍然相去甚远);我想我见过一个可以做到这一点的工具,但现在找不到了。

如果您对一侧的分区设置进行了更改,请在另一侧进行相同的更改,然后调用rsync各个文件系统。

  • 不,rsync 可以使用时间戳,但不是必须的。您可以告诉 rsync 忽略任何时间戳,如果文件或整个目录树在不更改时间戳的情况下移动,则通常需要这种时间戳。根据 https://arstechnica.com/civis/viewtopic.php?t=1173708,存在补丁来添加适当的命令行开关,以告诉 rsync 在块不同时逐块同步块设备的内容。 (3认同)
  • 在某些情况下,如果文件系统包含许多(数百万)硬链接,则原始块设备上的 rsync 比 rsync 整个文件系统要快得多并且使用的资源更少。这对于 BackupPC 池(至少对于 BackupPC 3.x)来说很常见。BackupPC 池的另一个常见问题是,在相当长的一段时间内仅使用额外的块,而大多数已使用的块保持不变。根据网络速度,仅比较块哈希和而不是再次传输 TB 数据可能会快得多。 (2认同)