rsync 不傳輸所有文件的原因?
有誰知道在 Ubuntu 10.04 LTS 設置上使用 rsync 備份我的 LARGE 主目錄時傳輸的文件數量差異如此大的常見原因?機器很穩定,所有捲都是乾淨的 ext4 —— fsck.ext4 沒有錯誤。
Number of files: 4857743 Number of files transferred: 4203266
那是 654,477 個文件的差異!!!
我想將我的 FULL 主文件夾備份到外部磁碟,這樣我就可以完全擦除並重新格式化我的系統,然後從這個 rsync 備份中恢復我的家,但我擔心我失去了重要的數據文件。
我以 root 身份登錄並使用 rsync 將我的 /home/hholtmann/* 目錄備份到 /mnt/wd750/c51/home/ 中的備用備份驅動器
這是我用作 root 的命令行
root@c-00000051:~# pwd /root root@c-00000051:~# rsync -ah --progress --stats /home/hholtmann /mnt/wd750/c51/home/ -v
從 rsync 擷取的摘要輸出
Number of files: 4857743 Number of files transferred: 4203266 Total file size: 487.41G bytes Total transferred file size: 487.41G bytes Literal data: 487.41G bytes Matched data: 0 bytes File list size: 102.48M File list generation time: 0.001 seconds File list transfer time: 0.000 seconds Total bytes sent: 487.75G Total bytes received: 82.42M
只是為了比較 rsync 後我家中的一個重要項目子目錄:
使用源子目錄和目標子目錄之間的字節差異
du
root@c-00000051:~# du -cs /home/hholtmann/proj/ 18992676 /home/hholtmann/proj/ 18992676 total root@c-00000051:~# du -cs /media/wd750/c51/home/hholtmann/proj/ 19006768 /mnt/wd750/c51/home/hholtmann/proj/ 19006768 total
但是:相同的源子目錄和目標子目錄之間沒有文件計數差異
root@c-00000051:~# find /home/hholtmann/proj/ -type f -follow | wc -l 945937 root@c-00000051:~# find /mnt/wd750/c51/home/hholtmann/proj/ -type f -follow | wc -l 945937
為什麼會有這樣意想不到的結果?文件就是文件……尤其是在使用者的主目錄中!
我錯過了什麼?或者這是我準備好管理的標誌!?!
解決方案和回答:
下面選擇的答案解釋了字節數差異和我對 rsync 摘要數據的錯誤期望。考慮到兩個卷都是具有預設塊大小的 ext4,我只是對這個字節差異感到驚訝。我只是假設每個文件在數字方面都會佔用相同的空間
du
。通過添加到 rsync 並再次執行,我確實找到了一些不是rsync 的文件,方法是向 rsync 添加更詳細的輸出。
-vv
我看到的是來自 rsync 的錯誤,指出由於文件上的“擴展屬性”,它無法將我的任何 DROPBOX 目錄文件寫入目標。rsync 正在跳過我所有的保管箱路徑文件。
最後我的 /home 卷是使用
user_xattr
/etc/fstab 文件中的 ext4 掛載選項掛載的:/dev/mapper/vg1-lv_home /home ext4 nobarrier,noatime,user_xattr 0 2 # I HAD to add the ,user_xattr option to match my home volume /dev/sda1 /mnt/wd750 ext4 nobarrier,noatime,user_xattr 0 2
在第三次執行另一個完整的 rsync 之後,我決定讓文件計數在我的完整主文件夾上執行一整夜並 rsync’d 備份:
root@c-00000051:~# find /home/hholtmann/ -type f | wc -l 4203266 root@c-00000051:~# find /mnt/wd750/c51/home/hholtmann/ -type f | wc -l 4203266
完美匹配的文件
結論:
** 始終確保使用與源完全相同的文件系統掛載選項掛載您的備份卷,並使用 rsync 打開完整日誌記錄,以便以後進行 grep 分析以搜尋長文件列表中的任何錯誤!**
這個問題有兩個部分。首先,為什麼“文件數”和“傳輸的文件數”之間存在差異。這在 rsync 手冊頁中有解釋:
文件數:是所有“文件”(一般意義上)的計數,包括目錄、符號連結等。
傳輸的文件數:是通過 rsync 的 delta-transfer 算法更新的普通文件的計數,不包括創建的目錄、符號連結等。
這裡的差異應該等於目錄、符號連結、其他特殊文件的總數。那些不是“轉移”的,而是重新創建的。
現在對於第二部分,為什麼與 du 有大小差異。du 顯示文件使用的磁碟空間量,而不是文件的大小。同一個文件可以佔用不同數量的磁碟空間,例如,如果文件系統的塊大小不同。
如果您仍然擔心數據完整性,一個簡單的確定方法是為所有文件創建雜湊並進行比較:
( cd /home/hholtmann && find . -type f -exec md5sum {} \; ) > /tmp/hholtmann.md5sum ( cd /media/wd750/c51/home/ && md5sum -c /tmp/hholtmann.md5sum )
致所有其他在深夜度假中工作的可憐迷失的靈魂,
--checksum
使 rsync 實際檢查文件中是否有更改,否則它會檢查時間戳和文件大小並稱之為一天,這在 99.9% 的情況下就足夠了,讓你在剩下的 0.01% 的情況下在地獄中燃燒,直到你弄清楚這一點