ITPub博客

首页 > Linux操作系统 > Linux操作系统 > [20130110]linux传输文件-tar+nc+各种压缩方式.txt

[20130110]linux传输文件-tar+nc+各种压缩方式.txt

原创 Linux操作系统 作者:lfree 时间:2013-01-10 15:16:46 0 删除 编辑
[20130110]linux传输文件-tar+nc+各种压缩方式.txt

以前在linux下传输文件,特别一些大文件以及很多小文件,我个人经常喜欢tar+nc的传输方式。

实际上很简单:

在A机器上执行:
tar -cvzf - /data/orcl/users01.dbf | nc -l 55555

在B机器上执行:
nc A_IP 55555 | tar xvzf - -C /tmp

--注意:-czf 后面有一个-,我曾经忘记写,导致1个文件破坏(切记!!!)。这样解压在B机器的/tmp目录。
--也可以使用j参数替换z,这样解压缩采用bzip2.
--另外注意端口不要冲突(也就是没有别的应用软件不使用该端口)。

在A机器上执行:
tar -cvjf - /data/orcl.0000/users01.dbf | nc -l 55555

在B机器上执行:
nc A_IP 55555 | tar xvjf - -C /tmp

-- tar也可以指定别的压缩程序(有一些新版本还支持lzop压缩,我的测试centos 6.2)
-- -I, --use-compress-program=PROG
-- 使用lzop可以直接使用参数--lzop(好像一些版本没有这个参数)

-- 另外注意一点gzip等压缩工具,都是单线程的。如果压缩并行,可以提高效率,找到pigz可以实现。
-- 我下载的rpm包。 http://pkgs.repoforge.org/pigz/

tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | pigz   |nc -l 55555
解压:
nc A_IP 55555 | tar xvf - -C /tmp -I pigz

--为了获得良好的显示效果以及测试相关数据,必须安装pv软件包。执行如下:
tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | gzip   |nc -l 55555
tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | bzip2  |nc -l 55555
tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | lzop   |nc -l 55555
tar -cvf - /tmp/data/orcl_20121108.bak/users01.dbf | pv -s `du -sb /tmp/data/orcl_20121108.bak/users01.dbf | awk '{s += $1} END {print s}'` | pigz   |nc -l 55555

--我的测试结果:[不是太精确,我仅仅做2次每种压缩方式]
gzip   1.43GB 0:00:44 [32.6MB/s]
bzip2  1.43GB 0:02:52 [8.47MB/s]
lzop   1.43GB 0:00:25 [57.1MB/s]
pigz   1.43GB 0:00:10 [ 142MB/s]

-- 很明显bzip2很慢,而pigz最好[注意:也许服务器其他应用会受很大影响],我自己一直以为lzop感觉不明显,实际上效果也不错。

--这样传输文件还有一个缺点,要在两个机器上执行相关命令,参考:
http://intermediatesql.com/wp-content/uploads/2012/05/ncp.txt
http://intermediatesql.com/linux/scrap-the-scp-how-to-copy-data-fast-using-pigz-and-nc/

#! /bin/bash

FILE_FULL=$1
REMOTE_HOST=$2

FILE_DIR=$(dirname $FILE_FULL)
FILE_NAME=$(basename $FILE_FULL)
LOCALHOST=$(hostname)

ZIP_TOOL=pigz
NC_PORT=8888

tar -cf - -C $FILE_DIR $FILE_NAME | pv -s `du -sb $FILE_FULL | awk '{s += $1} END {printf "%d", s}'` | $ZIP_TOOL | nc -l $NC_PORT &
ssh $REMOTE_HOST "nc $LOCALHOST $NC_PORT | $ZIP_TOOL -d | tar xf - -C $FILE_DIR"

--写这样一个shell脚本,命名ncp! ,执行如下:
ncp! /tmp/data/orcl_20121108.bak/users01.dbf remote_host
-- 注意一点:脚本使用覆盖方式,远端的文件[相同路径的文件将会覆盖,并且这个目录要存在,不然会报错]将会覆盖!使用要注意这点。
-- 而且我做了一些修改.而且主机名必须存在/etc/hosts文件中,总之写的不是太严谨,谨慎使用!
-- 如果有错,可能要杀一些后台进程。

我做一点小修改:

#! /bin/bash

FILE_FULL=$1
REMOTE_HOST=$2

FILE_DIR=$(dirname $FILE_FULL)
FILE_NAME=$(basename $FILE_FULL)
LOCALHOST=$(hostname)

ZIP_TOOL=pigz
NC_PORT=55555

tar -cf - -C $FILE_DIR $FILE_NAME | pv -s `du -sb $FILE_FULL | awk '{s += $1} END {printf "%d", s}'` | $ZIP_TOOL | nc -l $NC_PORT &
ssh $REMOTE_HOST "mkdir -p $FILE_DIR; [-e $FILE_FULL ] || nc $LOCALHOST $NC_PORT | $ZIP_TOOL -d | tar xvf - -C $FILE_DIR"


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-752461/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7971366