使用网络和 netcat (nc) 将硬盘或分区映像复制到另一个系统
netcat 实用程序(nc 命令)被视为 TCP/IP 瑞士军刀。它使用 TCP 或 UDP 协议跨网络连接读取和写入数据。它被设计为一个可靠的“后端”工具,可以直接使用或由其他程序和脚本轻松驱动。同时,它是一个功能丰富的网络调试和探索工具,因为它可以创建您需要的几乎任何类型的连接,并且具有几个有趣的内置功能。
我还安装了用于管理网络的 netcat 包,您想使用它的调试和网络探索功能。
我最喜欢的用法之一是使用 netcat 通过网络在两个服务器硬盘之间迁移数据。将完整的驱动器映像从一台服务器复制到另一台服务器非常容易。
您也可以使用 ssh 来实现相同的目的,但加密会增加其自身的开销。这是经过验证的可靠方法(感谢karl)。
确保已备份所有重要数据。
安装 netcat
nc 可能不会在 Redhat / CentOS / Debian Linux 下默认安装。
Redhat/CentOS/Fedora Linux 下安装 nc
使用yum命令如下:
# yum install nc
输出:
Loading "installonlyn" plugin Loading "rhnplugin" plugin Setting up Install Process Setting up repositories rhel-x86_64-server-vt-5 100% |=========================| 1.2 kB 00:00 rhel-x86_64-server-5 100% |=========================| 1.2 kB 00:00 Reading repository metadata in from local files Parsing package install arguments Resolving Dependencies --> Populating transaction set with selected packages. Please wait. ---> Downloading header for nc to pack into transaction set. nc-1.84-10.fc6.x86_64.rpm 100% |=========================| 6.9 kB 00:00 ---> Package nc.x86_64 0:1.84-10.fc6 set to be updated --> Running transaction check Dependencies Resolved ============================================================================= Package Arch Version Repository Size ============================================================================= Installing: nc x86_64 1.84-10.fc6 rhel-x86_64-server-5 56 k Transaction Summary ============================================================================= Install 1 Package(s) Update 0 Package(s) Remove 0 Package(s) Total download size: 56 k Is this ok [y/N]: y Downloading Packages: (1/1): nc-1.84-10.fc6.x86 100% |=========================| 56 kB 00:00 Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing: nc ######################### [1/1] Installed: nc.x86_64 0:1.84-10.fc6 Complete!
Debian / Ubuntu Linux netcat 安装
只需使用apt-get 命令:
$ sudo apt-get install netcat
如何使用 netcat 复制硬盘映像?
我们的示例设置
----------------------- HostA // 192.168.1.1 ------------------------ sda NETWORK sdb ------------------------ HostB // 192.168.1.2 -------------------------
你的任务是使用 netcat 命令将 HostA 的 /dev/sda 复制到 HostB 的 /dev/sdb。首先以 root 用户身份登录
在主机B上输入的命令(接收端~写入图像模式)
您需要使用 netcat 在 hostB 上打开端口,输入:
# netcat -p 2222 -l |bzip2 -d | dd of=/dev/sdb
其中,
- -p 2222:指定 nc 应使用的源端口,但要遵守权限限制和可用性。确保端口 2222 未被其他进程使用。
- -l:用于指定 nc 应该监听传入连接而不是启动与远程主机的连接。
- bzip2 -d:使用 Burrows-Wheeler 块排序文本压缩算法和 Huffman 编码压缩图像。这将加快网络传输速度(-d:强制解压模式)
- dd of=/dev/sda:/dev/sda 是您的硬盘。您也可以指定分区,例如 /dev/sda1
在主机A上输入的命令(通过网络发送数据~读取图像模式)
现在您要做的就是开始复制映像。再次以 root 身份登录并输入:
# bzip2 -c /dev/sda | netcat hostA 2222
或使用 IP 地址:
# bzip2 -c /dev/sda | netcat 192.168.1.1 2222
这个过程需要一定的时间。
关于最新 netcat 版本 1.84-10 及以上版本的说明
如果您使用的是最新的 nc / netcat 版本,则上述语法将生成错误。将 -l 选项与 -p、-s 或 -z 选项结合使用是错误的。此外,使用 -w 选项指定的任何超时都将被忽略。因此,请按如下方式使用 nc 命令。
在 hostA 上,输入:
# nc -l 2222 > /dev/sdb
在 hostB 上,输入:
# nc hostA 2222< /dev/sda
或者
# nc 192.168.1.1 2222< /dev/sda
使用第二台机器(hostB),连接到 2222(hostA)上的监听 nc 进程,并向其提供要传输的文件 (/dev/sda)。您可以按如下方式使用 bzip2。
在 hostA 上,输入:
# nc -l 2222 | bzip2 -d > /dev/sdb
在 hostB 上,输入:
# bzip2 -c /dev/sda | nc 192.168.1.1 2222
进一步阅读
- netcat 命令其他用法 -使用 netcat(nc)命令进行 Linux 端口扫描(也可以使用nmap 命令进行端口扫描)
- nc 和 bzip2 命令手册页
- 很好的netcat命令用法合集
- 另一个很好的 netcat 磁盘映像操作方法
我该如何提高绩效?
正如匿名用户所建议的:
您绝对应该使用 bs=16M 或类似的选项。否则,复制将花费很长时间。使用 bs=16M 通过 1 Gbps 交叉电缆复制 300 GB 硬盘大约需要 1 1/2 小时左右,如果没有此选项,同样的事情将需要大约 7 个小时。
总之使用命令如下:
# netcat -p 2222 -l |bzip2 -d | dd of=/dev/sdb bs=16M
已更新以提高准确性。