Evgeny Asked: 2009-08-08 09:32:46 +0800 CST2009-08-08 09:32:46 +0800 CST 2009-08-08 09:32:46 +0800 CST 如何使用 dd、netcat 和 ssh 隧道设置磁盘克隆? 772 我想dd通过 Linux 上的 ssh 加密通道使用 netcat 从主机 A 到 B 批量复制内容(使用重新映像磁盘)。 我应该在两端输入什么命令? ssh-tunnel 9 个回答 Voted Best Answer Rik Schneider 2009-08-08T11:14:32+08:002009-08-08T11:14:32+08:00 从源复制到目标运行 sshd 的目标: dd if=/dev/sda | gzip | ssh root@target 'gzip -d | dd of=/dev/sda' 当目标未运行 sshd 时,通过 sshd_host 从源复制到目标。 目标: nc -l -p 62222 | dd of=/dev/sda bs=$((16 * 1024 * 1024)) 资源: ssh -L 62222:target:62222 sshd_host & 资源: dd if=/dev/sda | nc -w 3 localhost 62222 dd - if=是源,of=是目标,bs=是块大小。不同的块大小可以提高性能。16 通常是一个相当合理的起点。您还可以使用count=来指示要复制的块数。 nc - -p表示用于服务的端口。 -l用于启动服务。 -w设置退出前等待管道中数据的时间。 ssh - -L在远程主机上建立隧道。参数的格式是,local_port:target_host:target_port。您的本地程序 (nc) 连接到 local_port,此连接通过隧道连接到 target_host 上的 target_port。 定义的选项只是用于此目的的选项。查看手册页以获取更多详细信息。 几点注意事项: 如果您通过 LAN 以外的任何设备执行此操作,我建议您使用 gzip 或 compress 压缩数据流。Bzip2 也可以,但它需要更多的 CPU 时间。第一个有这种用法的例子。 如果源分区未挂载或以只读方式挂载,则更好。如果不是,您将需要 fsck 目标图像。 除非其中一台机器有 netcat 但没有 ssh,否则这里并不需要 netcat。这种情况看起来像: source machine dd -> nc -> ssh -> ssh tunnel -> sshd server -> nc on target -> dd 如果源和目标大小相同,则 dd 效果最佳。如果不是,则目标必须是 2 中的较大者。 如果您使用的是 ext2/3 或 xfs,则转储(或 xfsdump)和恢复可能是更好的选择。它不会处理引导扇区,但是当目标和源大小不同时它可以工作。 pQd 2009-08-08T09:47:11+08:002009-08-08T09:47:11+08:00 不需要netcat。 在 src 机器上运行: dd if=/dev/sdX bs=1M | ssh root@dstMachine " dd of=/dev/sdY bs=1M" 我假设没有安装 sdX 和 sdY 上的分区。您可以使用knoppix或其他类似的 live 发行版启动这两个盒子。 dd - 从if [ 如果未提供 - 从 stdin ] 获取数据,将数据发送到[如果未提供 - 数据发送到 stdout ]。bs - 块大小......将加快速度。 ssh - 执行远程框上引号中提供的命令,所有泵送到 ssh 的标准输入的数据都将通过隧道传输到远程机器并作为标准输入提供给在那里执行的命令。 Bill Weiss 2009-08-08T09:48:30+08:002009-08-08T09:48:30+08:00 主机 A 是要映像的主机,主机 B 是要存储映像的主机: root@A# dd if=/dev/sda | ssh root@B "dd of=/some/file" 恢复到磁盘只会交换这两个。 Ali Mezgani 2009-08-08T10:11:20+08:002009-08-08T10:11:20+08:00 如果你想在没有 ssh 的情况下使用 netcat。我认为这是最快的方法而不是安全的方法,您可以像这样复制和恢复整个磁盘: 在 IP 192.168.0.1 的计算机 A 上 cat /dev/hdb | nc -p 9000 在计算机 B 上 nc -l 192.168.0.1 9000 > /dev/hdb 请记住,根据 man nc 的 -l 选项是: -l 用于指定 nc 应该侦听传入连接而不是启动到远程主机的连接。将此选项与 -p、-s 或 -z 选项结合使用 是错误的。 nik 2009-08-08T09:46:22+08:002009-08-08T09:46:22+08:00 此处描述了 netcat 的基本副本。 如果您需要让SSH参与其中,您可以使用端口转发, -R [bind_address:]port:host:hostport 但是,总的来说,您可以首先进行 SSH 传输(没有 netcat)。 Dominic D 2009-08-08T09:47:34+08:002009-08-08T09:47:34+08:00 只要文件系统都被卸载,dd 就可以正常工作。 (from server1) dd if=/dev/sda bs=32k | ssh <server2> dd of=/dev/sda bs=32k 您需要提前设置主机密钥身份验证,否则密码提示将导致复制失败。 在已安装的卷上执行此操作会产生较差的结果。 David Mackintosh 2009-08-08T18:00:14+08:002009-08-08T18:00:14+08:00 或者,您可以使用 clonezilla 并通过 sshfs “挂载”您的远程存储。 Edward Groenendaal 2013-07-30T21:13:46+08:002013-07-30T21:13:46+08:00 我尝试了上面提供的选项的组合,并与您分享结果。使用 dd 块大小、gzip 和 gzip 压缩算法的组合从最快到最慢。 如您所见,gzip 仅在将快速算法与 1M 块大小结合使用时给了我改进。 time dd bs=1M if=/dev/HypGroup00/stage-snapshot | gzip --fast | ssh hyp5 'gzip -d | dd bs=1M of=/dev/HypGroup00/stage' 12884901888 bytes (13 GB) copied, 326.045 s, 39.5 MB/s time dd if=/dev/HypGroup00/stage-snapshot | gzip --fast | ssh hyp5 'gzip -d | dd of=/dev/HypGroup00/stage' 12884901888 bytes (13 GB) copied, 370.158 s, 34.8 MB/s time dd if=/dev/HypGroup00/stage-snapshot | ssh hyp5 dd of=/dev/HypGroup00/stage 12884901888 bytes (13 GB) copied, 370.274 s, 34.8 MB/s time dd bs=1M if=/dev/HypGroup00/stage-snapshot | ssh hyp5 dd bs=1M of=/dev/HypGroup00/stage 12884901888 bytes (13 GB) copied, 372.906 s, 34.6 MB/s time dd bs=1M if=/dev/HypGroup00/stage-snapshot | gzip | ssh hyp5 'gzip -d | dd bs=1M of=/dev/HypGroup00/stage' 12884901888 bytes (13 GB) copied, 520.116 s, 24.8 MB/s 两台快速服务器通过企业 GigE 交换机使用本地磁盘通过 LVM 与 GigE 连接。 Tom Newton 2011-08-09T02:48:14+08:002011-08-09T02:48:14+08:00 看起来你在这里用大锤敲碎坚果 - 或者更好的类比是试图用剪刀剪草坪:) 我强烈建议您查看一些用于完成此类工作的工具,除非您有充分的理由在内部进行。 Trinity Rescue Kit是一个免费的 liveCD,它支持多播上的成像驱动器,并且可以做你想做的事情(或者实际上任何其他人在同一条线上思考),而无需使用全口径成像系统。
从源复制到目标运行 sshd 的目标:
dd if=/dev/sda | gzip | ssh root@target 'gzip -d | dd of=/dev/sda'
当目标未运行 sshd 时,通过 sshd_host 从源复制到目标。
nc -l -p 62222 | dd of=/dev/sda bs=$((16 * 1024 * 1024))
ssh -L 62222:target:62222 sshd_host &
资源:
dd if=/dev/sda | nc -w 3 localhost 62222
dd - if=是源,of=是目标,bs=是块大小。不同的块大小可以提高性能。16 通常是一个相当合理的起点。您还可以使用count=来指示要复制的块数。
nc - -p表示用于服务的端口。 -l用于启动服务。 -w设置退出前等待管道中数据的时间。
ssh - -L在远程主机上建立隧道。参数的格式是,
local_port:target_host:target_port
。您的本地程序 (nc) 连接到 local_port,此连接通过隧道连接到 target_host 上的 target_port。定义的选项只是用于此目的的选项。查看手册页以获取更多详细信息。
几点注意事项:
source machine dd -> nc -> ssh -> ssh tunnel -> sshd server -> nc on target -> dd
不需要netcat。
在 src 机器上运行:
我假设没有安装 sdX 和 sdY 上的分区。您可以使用knoppix或其他类似的 live 发行版启动这两个盒子。
dd - 从if [ 如果未提供 - 从 stdin ] 获取数据,将数据发送到[如果未提供 - 数据发送到 stdout ]。bs - 块大小......将加快速度。
ssh - 执行远程框上引号中提供的命令,所有泵送到 ssh 的标准输入的数据都将通过隧道传输到远程机器并作为标准输入提供给在那里执行的命令。
主机 A 是要映像的主机,主机 B 是要存储映像的主机:
恢复到磁盘只会交换这两个。
如果你想在没有 ssh 的情况下使用 netcat。我认为这是最快的方法而不是安全的方法,您可以像这样复制和恢复整个磁盘:
在计算机 B 上在 IP 192.168.0.1 的计算机 A 上
请记住,根据 man nc 的 -l 选项是:
此处描述了 netcat 的基本副本。
如果您需要让SSH参与其中,您可以使用端口转发,
但是,总的来说,您可以首先进行 SSH 传输(没有 netcat)。
只要文件系统都被卸载,dd 就可以正常工作。
您需要提前设置主机密钥身份验证,否则密码提示将导致复制失败。
在已安装的卷上执行此操作会产生较差的结果。
或者,您可以使用 clonezilla 并通过 sshfs “挂载”您的远程存储。
我尝试了上面提供的选项的组合,并与您分享结果。使用 dd 块大小、gzip 和 gzip 压缩算法的组合从最快到最慢。
如您所见,gzip 仅在将快速算法与 1M 块大小结合使用时给了我改进。
两台快速服务器通过企业 GigE 交换机使用本地磁盘通过 LVM 与 GigE 连接。
看起来你在这里用大锤敲碎坚果 - 或者更好的类比是试图用剪刀剪草坪:)
我强烈建议您查看一些用于完成此类工作的工具,除非您有充分的理由在内部进行。
Trinity Rescue Kit是一个免费的 liveCD,它支持多播上的成像驱动器,并且可以做你想做的事情(或者实际上任何其他人在同一条线上思考),而无需使用全口径成像系统。