使用 rsync 複製大檔案的一些誤解
有一種觀點認為,在 IT 行業工作的許多人經常從網路帖子裡複製和貼上。我們都幹過,複製貼上本身不是問題。問題是當我們在不理解它們的情況下這樣幹。
幾年前,一個曾經在我團隊中工作的朋友需要將虛擬機器模板從站點 A 複製到站點 B。他們無法理解為什麼複製的檔案在站點 A 上為 10GB,但是在站點 B 上卻變為 100GB。
這位朋友認為 rsync
是一個神奇的工具,應該僅“同步”檔案本身。但是,我們大多數人所忘記的是瞭解 rsync
的真正含義、用法,以及我認為最重要的是它原本是用來做什麼的。本文提供了有關 rsync
的更多資訊,並解釋了那件事中發生了什麼。
關於 rsync
rsync
是由 Andrew Tridgell 和 Paul Mackerras 建立的工具,其動機是以下問題:
假設你有兩個檔案,file_A
和 file_B
。你希望將 file_B
更新為與 file_A
相同。顯而易見的方法是將 file_A
複製到 file_B
。
現在,假設這兩個檔案位於通過慢速通訊連結(例如,撥號 IP 連結)連線的兩個不同的伺服器上。如果file_A
大,將其複製到 file_B
將會很慢,有時甚至是不可能完成的。為了提高效率,你可以在傳送前壓縮 file_A
,但這通常只會獲得 2 到 4 倍的效率提升。
現在假設 file_A
和 file_B
非常相似,並且為了加快處理速度,你可以利用這種相似性。一種常見的方法是僅通過連結傳送 file_A
和 file_B
之間的差異,然後使用這個差異列表在遠端端重建檔案。
問題在於,用於在兩個檔案之間建立一組差異的常規方法依賴於能夠讀取兩個檔案。因此,它們要求連結的一端預先提供兩個檔案。如果它們在同一臺計算機上不是同時可用的,則無法使用這些演算法。(一旦將檔案複製過來,就不需要做對比差異了)。而這是 rsync
解決的問題。
rsync
演算法有效地計算原始檔的哪些部分與現有目標檔案的部分匹配。這樣,匹配的部分就不需要通過連結傳送了;所需要的只是對目標檔案部分的引用。只有原始檔中不匹配的部分才需要傳送。
然後,接收者可以使用對現有目標檔案各個部分的引用和原始素材來構造原始檔的副本。
另外,可以使用一系列常用壓縮演算法中的任何一種來壓縮傳送到接收器的資料,以進一步提高速度。
我們都知道,rsync
演算法以一種漂亮的方式解決了這個問題。
在 rsync
的介紹之後,回到那件事!
問題 1:自動精簡配置
有兩件事可以幫助那個朋友瞭解正在發生的事情。
該檔案在其他地方的大小變得越來越大的問題是由源系統上啟用了自動精簡配置(TP)引起的,這是一種優化儲存區域網路(SAN)或網路連線儲存(NAS)中可用空間效率的方法。
由於啟用了 TP,原始檔只有 10GB,並且在不使用任何其他配置的情況下使用 rsync
進行傳輸時,目標位置將接收到全部 100GB 的大小。rsync
無法自動完成該(TP)操作,必須對其進行配置。
進行此工作的選項是 -S
(或 –sparse
),它告訴 rsync
有效地處理稀疏檔案。它會按照它說的做!它只會傳送該稀疏資料,因此源和目標將有一個 10GB 的檔案。
問題 2:更新檔案
當傳送一個更新的檔案時會出現第二個問題。現在目標僅接收 10GB 了,但始終傳輸的是整個檔案(包含虛擬磁碟),即使只是在該虛擬磁碟上更改了一個配置檔案。換句話說,只是該檔案的一小部分發生了更改。
用於此傳輸的命令是:
rsync -avS vmdk_file syncuser@host1:/destination
同樣,瞭解 rsync
的工作方式也將有助於解決此問題。
上面是關於 rsync
的最大誤解。我們許多人認為 rsync
只會傳送檔案的增量更新,並且只會自動更新需要更新的內容。但這不是 rsync
的預設行為。
如手冊頁所述,rsync
的預設行為是在目標位置建立檔案的新副本,並在傳輸完成後將其移動到正確的位置。
要更改 rsync
的預設行為,你必須設定以下標誌,然後 rsync
將僅傳送增量:
--inplace 原地更新目標檔案
--partial 保留部分傳輸的檔案
--append 附加資料到更短的檔案
--progress 在傳輸時顯示進度條
因此,可以確切地執行我那個朋友想要的功能的完整命令是:
rsync -av --partial --inplace --append --progress vmdk_file syncuser@host1:/destination
注意,出於兩個原因,這裡必須刪除稀疏選項 -S
。首先是通過網路傳送檔案時,不能同時使用 –sparse
和 –inplace
。其次,當你以前使用過 –sparse
傳送檔案時,就無法再使用 –inplace
進行更新。請注意,低於 3.1.3 的 rsync
版本將拒絕 –sparse
和 –inplace
的組合。
因此,即使那個朋友最終通過網路複製了 100GB,那也只需發生一次。以下所有更新僅複製差異,從而使複製非常高效。
via: https://fedoramagazine.org/copying-large-files-with-rsync-and-some-misconceptions/
作者:Daniel Leite de Abreu 選題:lujun9972 譯者:wxy 校對:wxy
訂閱“Linux 中國”官方小程式來檢視
相關文章
- rsync命令快速刪大檔案
- 複製檔案githubGithub
- 檔案過大無法複製到u盤怎麼解決
- rsync udr——遠端大檔案傳輸加速
- ubuntu下檔案複製Ubuntu
- 解決關於Mac不能複製複製檔案到隨身碟的問題Mac
- win10系統中複製iso檔案提示ISO檔案過大無法複製如何解決Win10
- Linux:檔案解壓、複製和移動的若干坑Linux
- 如何使用scp進行遠端複製檔案?
- win10複製檔案速度慢怎麼辦_win10複製檔案速度非常慢的解決教程Win10
- 檔案伺服器rsync伺服器
- Java-IO:複製檔案Java
- Go語言複製檔案Go
- mysql檔案複製遷移MySql
- netcdf檔案複製並修改
- 如何批量複製多個檔案到多個目錄中(批量複製檔案,多對多檔案高效操作的方法)
- Linux 檔案同步工具之 rsyncLinux
- win10複製小檔案速度太慢怎麼辦 win10複製檔案速度慢怎麼解決Win10
- 如何使用 rsync 透過 SSH 恢復部分傳輸的檔案
- git複製一份檔案Git
- [java IO流]之檔案複製Java
- MySQL innodb表使用表空間物理檔案複製表MySql
- linux複製檔案到另一個資料夾怎麼操作 linux複製檔案的命令介紹Linux
- 檔案太大不能複製到隨身碟怎麼辦 win10檔案過大無法複製到隨身碟Win10
- win10 將檔案複製到ftp伺服器時發生錯誤怎麼解決Win10FTP伺服器
- 基於rsync實現海量檔案高速傳輸的解決方案
- 簡單的多執行緒複製檔案執行緒
- 基於配置檔案的redis的主從複製Redis
- 遠端登入和複製檔案
- Linux 中複製和移動檔案Linux
- 檔案複製(Go語言實現)Go
- 如何同時複製、分類檔案
- win10 dos命令怎麼複製檔案_win10 dos命令複製檔案操作方法Win10
- win10 cmd複製檔案命令怎麼執行_win10 cmd命令如何複製檔案Win10
- VMware複製檔案產生的快取路徑快取
- win10複製不了檔案怎麼辦 win10不能複製資料夾解決方法Win10
- CentOS7 下使用 rsync+sersync 配置檔案自動同步CentOS
- win10檔案無法複製到U盤錯誤0x80071ac3怎麼解決Win10