天天看點

[20130110]linux傳輸檔案-tar+nc+各種壓縮方式.txt

[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.

--另外注意端口不要沖突(也就是沒有别的應用軟體不使用該端口)。

tar -cvjf - /data/orcl.0000/users01.dbf | nc -l 55555

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

--我的測試結果:[不是太精确,我僅僅做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檔案中,總之寫的不是太嚴謹,謹慎使用!

-- 如果有錯,可能要殺一些背景程序。

我做一點小修改:

NC_PORT=55555

ssh $REMOTE_HOST "mkdir -p $FILE_DIR; [-e $FILE_FULL ] || nc $LOCALHOST $NC_PORT | $ZIP_TOOL -d | tar xvf - -C $FILE_DIR"

繼續閱讀