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