Linux

rsync 不傳輸所有文件的原因?

  • February 26, 2021

有誰知道在 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% 的情況下在地獄中燃燒,直到你弄清楚這一點

引用自:https://unix.stackexchange.com/questions/109524