日常運維頻繁面臨「幾萬個小文件跨服務器遷移」場景,單純 cp/scp 極慢。本文總結「打包+傳輸+解包」一體化管道技巧,對比 nc、ssh、scp、本地 tar|tar 多種方案優劣,給出最佳實踐建議。
tar 打包成單一數據流,消除元數據操作開銷。tar cf - src | 传输 | tar xf -,無需臨時存儲完整壓縮包,節省磁盤空間與時間。nc(無加密開銷),公網/需認證用 ssh/scp,本地用管道。適用: 可信內網、大數據量、追求極致速度。
# 接收端 B (192.168.1.10) 監聽 5555 端口,解包到 /data/dest
nc -l 5555 | tar -xzf - -C /data/dest
# 發送端 A 打包壓縮並發送
tar -czf - /data/src | nc 192.168.1.10 5555
-z gzip 壓縮(CPU 換帶寬,千兆網卡通常不壓縮更快)。-l 監聽,-p 指定端口(部分版本)。適用: 所有場景(公網/內網),需 SSH 密鑰免密登錄。
# A 打包發送,B 解包(最常用)
tar -czf - /data/src | ssh user@192.168.1.10 "tar -xzf - -C /data/dest"
# A 打包發送,B 保存為壓縮包(便於校驗/二次分發)
tar -czf - /data/src | ssh user@192.168.1.10 "cat > /backup/src_$(date +%F).tar.gz"
# B 發起拉取(反向,適合 B 權限高、A 只開放 SSH)
ssh user@192.168.1.10 "tar -czf - /data/src" | tar -xzf - -C /data/dest
# 開啟 SSH 壓縮(-C)適合低帶寬
tar -cf - /data/src | ssh -C user@192.168.1.10 "tar -xf - -C /data/dest"
# A 打包通過 scp 標準輸入傳輸,B 解包
tar -czf - /data/src | scp - user@192.168.1.10:/data/dest.tar.gz
# B 端需手動解包,或配合 ssh 執行遠程命令
不如 ssh 管道靈活,一般不推薦。
# 最推薦的生產級同步命令
rsync -avzP --delete /data/src/ user@192.168.1.10:/data/dest/
# -a 保留屬性 -v 詳情 -z 壓縮 -P 進度/斷點續傳 --delete 目標端刪除源無文件
--bwlimit=10000 (KB/s)。# tar 管道(保留所有屬性,適合跨文件系統)
cd /src && tar -cf - . | (cd /dest && tar -xpf -)
# cp -a(同文件系統下通常更快,利用 reflink/clone)
cp -a /src/. /dest/
# rsync 本地(同樣優秀)
rsync -aHAX /src/ /dest/
| 命令 | 關鍵參數 | 保留內容 |
|---|---|---|
| cp | -a (=-dR --preserve=all) | 權限、時間戳、擁有者、軟鏈接、擴展屬性、ACL |
| tar | -p (--preserve-permissions) | 權限、擁有者(需 root 解包保留擁有者) |
| rsync | -a (=-rlptgoD) + -H 硬鏈接 + -A ACL + -X xattr | 最完整 |
# pv (Pipe Viewer) 顯示管道吞吐進度
tar -cf - /data/src | pv | ssh user@host "tar -xf - -C /data/dest"
# 或 rsync 自帶進度
rsync -avzP --info=progress2 /src/ user@host:/dest/
stunnel 或 SSH 隧道。cd /src && tar -cf - .,解包指定 -C /dest,否則解包還原絕對路徑覆蓋系統文件。tar -S、rsync --sparse 處理虛擬機磁盤鏡像等稀疏文件。sha256sum 對比,或 rsync -c 校驗和模式。是否需增量/斷點續傳/屬性完整保留? → 是 → rsync (首選)
否 → 是否內網極速/臨時一次性? → 是 → nc + tar (無加密最快)
否 → 是否公網/需安全/通用? → 是 → ssh + tar (標準安全)
否 → 本地跨文件系統? → tar | tar 或 rsync -aHAX
否 → 本地同文件系統? → cp -a (最快,支持 reflink)
作者補充: 「在使用一個工具完成任務前,先思考:是否有更適合的工具?工具是否有特殊技巧提效?(查閱 man 手冊常有意外收穫)」