我目前有两台 CentOS 服务器。我需要知道如何以及最快的方法是“tar”图像目录并将其 SCP 过来?
这是我刚才建议的最快的方法吗,因为 tarring 需要很长时间......我运行了命令:
tar cvf imagesbackup.tar images
我正要把它 scp 过去。
如果有更快捷的方法请告诉我。我拥有两台机器的远程/SSH 访问权限。
答案1
您不需要使用 tar 写入本地磁盘,而是可以使用 ssh 通过网络直接写入远程服务器。
server1$ tar -zc ./path | ssh server2 "cat > ~/file.tar.gz"
任何跟在“ssh”命令后面的字符串都将在远程服务器上运行,而不是交互式登录。您可以通过 SSH 将这些远程命令的输入/输出管道传输到本地。将命令放在引号中可以避免任何混淆,尤其是在使用重定向时。
或者,您可以直接在另一台服务器上提取 tar 文件:
server1$ tar -zc ./path | ssh server2 "tar -zx -C /destination"
注意这个很少使用的-C
选项。它的意思是“在做任何事情之前先切换到这个目录。”
或者,也许您想从目标服务器“拉”:
server2$ tar -zx -C /destination < <(ssh server1 "tar -zc -C /srcdir ./path")
请注意 <(cmd)
构造是 bash 的新功能,在旧系统上不起作用。它运行程序并将输出发送到管道,并将该管道替换为命令,就像它是一个文件一样。
我可以轻松地将上述内容写如下:
server2$ tar -zx -C /destination -f <(ssh server1 "tar -zc -C /srcdir ./path")
或者如下:
server2$ ssh server1 "tar -zc -C /srcdir ./path" | tar -zx -C /destination
或者,你可以省去一些麻烦,直接使用 rsync:
server1$ rsync -az ./path server2:/destination/
最后,请记住,在传输之前压缩数据会减少带宽,但在非常快的连接上,它实际上可能会使操作需要更多时间。这是因为您的计算机可能无法压缩得足够快以跟上:如果压缩100MB 比发送100MB,则以未压缩的形式发送会更快。
或者,您可能想要考虑自己通过管道传输到 gzip(而不是使用 -z 选项),以便指定压缩级别。根据我的经验,在可压缩数据的快速网络连接上,在大多数情况下,使用级别 2 或 3(默认值为 6)的 gzip 可提供最佳的整体吞吐量。如下所示:
server1$ tar -c ./path | gzip -2 | ssh server2 "cat > ~/file.tar.gz"
答案2
我很想自己对它进行 rsync - 它可以进行压缩并很好地处理链接丢失。
答案3
如果您只是把它们涂上焦油而不做其他任何事情,这将浪费大量时间,而速度却只能得到微小的提升。
因此,使用 cvf 开关简单地打包文件实际上会耗费读取所有 55GB 图像并将其写回磁盘所需的时间。(实际上,这会浪费更多时间,因为会有相当大的开销)。
您在这里获得的优势只有一个,那就是上传许多文件的开销减少了。如果压缩图像,您可能会获得更快的传输时间(但我相信它们已经是压缩格式了,所以这不会有太大帮助)。只是浪费更多的计算时间。
通过网络传输巨大的 tar 档案的最大缺点是,如果出现问题,则可能意味着您必须重新开始。
我会用这种方式:
md5sum /images/* > md5sum.txt
scp -r images/* user@host:/images/
在新服务器上
md5sum /images/* > md5sum_new.txt
然后就好了diff
。由于 scp 支持动态压缩,因此无需单独的档案。
编辑
我会保留 MD5 信息,因为它对 OP 很有用。但一条评论让我有了新的见解。因此,经过一番搜索,我找到了这条有用的信息。 请注意这里的主题是 SFTP 而不是直接 SCP。
与 FTP 相比,SFTP 确实增加了文件传输的开销。当文件在客户端和服务器之间传输时,它会被分解成称为“数据包”的较小块。例如,假设每个数据包为 32KB。SFTP 协议在发送每个 32KB 文件时都会对其进行校验和,并将该校验和与该数据包一起包含在内。接收方获取该数据包并解密数据,然后验证校验和。校验和本身比 CRC32 校验和“更强大”。(因为 SFTP 使用 128 位或更高的校验和,例如 MD5 或 SHA,并且因为每个数据包都执行此操作,所以在传输过程中会进行非常细致的完整性检查。)因此,协议本身较慢(因为有额外的开销),但成功完成传输实际上意味着它已被完整传输,无需进行额外的检查。
答案4
有一点——并非所有主机都有 rsync,而且许多主机可能都有不同版本的 tar。因此,建议首先使用经常被忽视的 cpio。
您可以通过 ssh 使用 cpio 在主机之间临时复制文件/目录结构。这样,您可以更好地控制发送的内容,因为您需要“喂” cpio,nom-nom。它还更易于参数移植,cpio 不会发生太大变化 - 如果您在异构环境中照看多个主机,这一点很重要。
将 /export/home 和子目录复制到远程主机的示例:
cd /export/ find . home -print | cpio -oaV | ssh 10.10.10.10 'cd /export/home; cpio -imVd'
上述操作将把 /export/home 及其子目录的内容复制到远程主机上的 /export/home。
希望这可以帮助。