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

lfree發表於2013-01-10
[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包。

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感覺不明顯,實際上效果也不錯。

--這樣傳輸檔案還有一個缺點,要在兩個機器上執行相關命令,參考:



#! /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部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-752461/,如需轉載,請註明出處,否則將追究法律責任。

相關文章