通过网络将逻辑卷直接从一台服务器移动到另一台服务器?

Nic*_*ick 15 files lvm dd

我有一台 KVM 主机,上面有多个 VM。每个 VM 在主机上使用一个逻辑卷。我需要将 LV 复制到另一台主机。

通常,我会使用类似的东西:

dd if=/the/logical-volume of=/some/path/machine.dd
Run Code Online (Sandbox Code Playgroud)

将 LV 转换为图像文件并使用 SCP 移动它。然后使用 DD 将文件复制回新主机上的新 LV。

这种方法的问题是您需要的磁盘空间是虚拟机在两台机器上占用的磁盘空间的两倍。IE。一个 5GB 的 LV 为 LV 使用了 5GB 的空间,而 dd 副本也为图像使用了额外的 5GB 空间。这对于小型 LV 来说很好,但是如果(就像我的情况一样)您有一个 500GB 的 LV 用于大型 VM,该怎么办?新主机具有1TB硬盘,所以它不能保持一个500GB的DD镜像文件,并有一个500GB的逻辑卷复制到有房的主机操作系统房间其他较小的客人。

我想做的是:

dd if=/dev/mygroup-mylv of=192.168.1.103/dev/newvgroup-newlv
Run Code Online (Sandbox Code Playgroud)

换句话说,通过网络将数据直接从一个逻辑卷复制到另一个逻辑卷,并跳过中间映像文件。

这可能吗?

lar*_*sks 30

当然,当然有可能。

dd if=/dev/mygroup-mylv | ssh 192.168.1.103 dd of=/dev/newvgroup-newlv
Run Code Online (Sandbox Code Playgroud)

繁荣。

不过,帮自己一个忙,使用比默认块大小更大的东西。也许添加 bs=4M (以 4 MB 的块读取/写入)。你可以看到评论中有一些关于块大小的吹毛求疵;如果这是你经常做的事情,花点时间用不同的块大小尝试几次不同的时间,看看什么能让你获得最好的传输速率。

回答评论中的问题之一:

您可以通过pv管道传输以获取有关传输的统计信息。它比将信号发送到dd.

我还要说,虽然当然使用 netcat —— 或任何其他不强加加密开销的东西 —— 会更有效率,但我通常发现额外的速度会带来一些便利性的损失。除非我要处理非常大的数据集,否则尽管开销很大,我通常还是坚持使用 ssh,因为在大多数情况下,一切都已经设置为 Just Work。

  • 它对数据的存储方式没有影响,但比使用默认块大小(512 字节)进行读取和写入要高效得多。 (3认同)
  • @Nick:在 Linux 上,您可以向 `dd` 进程发送 `USR1` 信号,使其显示带有转移金额的状态行。使用类似`ps aux | 的东西获取`dd` 进程的进程号。grep dd` 然后将这个 PID 与命令 `kill -USR1 $PID` 一起使用。该消息将显示在您启动 `dd` 的原始终端上。 (3认同)
  • 您可能不想使用那么大的 bs,因为它只会阻止写入管道到 ssh,直到它可以将大部分内容传输到网络套接字,在此期间磁盘将处于空闲状态。由于默认预读大小为 128k,您可能希望坚持使用。或者增加磁盘预读大小。 (3认同)
  • @psusi:Zoredache 在问题下面作为评论放置的链接演示了相反的情况,他们以 16M 块大小获得了最快的结果,但使用 netcat 而不是 ssh 作为传输方法,当不需要加密时,这始终是更好的选择。 (2认同)

小智 20

这是一个优化版本,它显示了使用pv和使用 BS 处理更大块的进度,还用于gzip减少网络流量。

在互联网服务器等慢速连接之间移动数据时,这是完美的。我建议在屏幕或 tmux 会话中运行该命令。这样就可以毫不费力地断开与您执行命令的主机的 ssh 连接。

$ dd if=/dev/volumegroupname/logicalvolume bs=4096 | pv | gzip | \
    ssh root@78.46.36.22 'gzip -d | dd of=/dev/volumegroupname/logicalvolume  bs=4096'
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用 `ssh -C` 代替 `gzip`。我不确定是否有性能影响,但打字要少得多。 (2认同)
  • 我还建议使用 pigz 或 pxz -1 而不是 gzip,多线程 _really_ 对任何现代服务器都有帮助。 (2认同)

小智 5

用一个老朋友来做这件事怎么样。网猫。

在丢失逻辑卷类型的系统上

  • $ dd if=/dev/[directory]/[volume-name] | nc -l [any high number port]

然后在接收系统上。类型

  • $ nc -w 10 [ip or name] [port] | dd of=/dev/[directory/[volume name]

翻译,源框 dd 这个文件并将其通过管道传输到将侦听此端口的 nc (netcat)。在接收系统上,netcat 将等待 10 秒,如果它在关闭到 [端口] 上的 [ip 或名称] 之前没有收到任何数据,然后将该数据通过管道传输到 dd 以将其写出。

  • Netcat 不使用带有这些选项的 UDP。 (2认同)