rsync 備份 Mac命令:rsync -aE --delete ~/Documents/ /Volumes/Backup/Documents/
-E 是 macOS 特有的那一半,漏掉它會悄悄丟失擴展屬性和資源分支。
-a 是歸檔模式:遞歸,並保留權限、所有權、時間戳和符號連結。這是人人都知道的參數。-E 保留 macOS 擴展屬性和資源分支。Finder 標籤、隔離標記、自定義圖示以及大量 App 元資料都存放在那裡。沒有它,這些就會丟失,而且沒有任何提示。--delete 會在檔案從源端消失後,將其從目標中刪除。正是它讓副本成為映像,也是最需要慎重考慮的參數。-v 用於輸出,-n 用於試執行。含有 --delete 的命令,第一次一定要先試執行。~/Documents 會把資料夾本身複製到目標中,得到 /Volumes/Backup/Documents/Documents。~/Documents/ 複製的是它的內容,這幾乎總是你想要的。在同時帶有 --delete 的命令里,弄錯這一點會刪除目標中原有的其他內容。--exclude 用於不值得複製的內容:--exclude '.DS_Store'、--exclude 'node_modules'、--exclude 'Library/Caches'。macOS 自帶的 rsync 版本足以勝任。如果你想要更新的上游版本,Homebrew 里有,而且它在 macOS 上處理 ACL 更好。
rsync 讓目標看起來與源一樣。那是副本,而副本不是歷史記錄。你上週二刪除的文件,下次執行後就從備份中消失了。你後來覆蓋掉的檔案的好版本也一樣,勒索軟體在任務執行前碰過的一切也一樣。
去掉 --delete 也解決不了。它只會讓目標堆積你曾有過的所有檔案,每個檔案仍然只有一個版本,而且無法分辨哪些是當前的。
--link-dest 保留版本標準做法是每次執行都新建一個帶日期的目錄,並把未更改的檔案硬連結到上一個目錄,這樣相同的檔案不佔任何空間:
DEST=/Volumes/Backup
TODAY=$(date +%F)
rsync -aE --delete \
--link-dest="$DEST/latest" \
~/Documents "$DEST/$TODAY"
ln -snf "$DEST/$TODAY" "$DEST/latest"
現在每個帶日期的資料夾看起來都是完整備份,而只有更改過的檔案佔用空間。這大致就是 Time Machine 的建置思路。
兩點注意。硬連結意味著副本並不獨立:底層資料塊損壞會影響所有共享它的快照。而且它需要支援硬連結的檔案系統,所以在外接磁碟上可行,在大多數雲端資料夾中不行。
rsync 不會對靜態資料進行任何加密。如果目標是雲端資料夾或會離開家門的磁碟,請在寫入前加密:
tar -cJf - ~/Documents | openssl enc -aes-256-cbc -pbkdf2 -out /Volumes/Backup/documents.tar.xz.enc
那是一個看不到內部的封存檔:沒有增量複製,不解開全部內容就無法回復單一檔案,而你和一切之間只隔著一組密碼。這個取捨很重要,也是大多數人不再自己動手的地方。
macOS 上仍然有 cron,但 launchd 才是官方支援的方式。在 ~/Library/LaunchAgents/ 中放一個帶 StartCalendarInterval 的 plist,就能每天執行你的指令碼。macOS 會要求為執行它的程式授予「完全磁碟訪問權限」,因為讀取「文稿」和「桌面」受到保護。
無論你怎麼定時,都讓它把結果寫到你真正會看到的地方,並檢查備份是最近的:
find /Volumes/Backup -type f -newermt '-7 days' | head
靜默的任務才是故障所在。它不會在你螢幕上報錯停止,而是在四個月前的某個夜裡悄悄停了。
上面的命令涵蓋了複製。它們沒有涵蓋的,正是出問題那天你真正需要的:能挺過映像執行的版本、仍能復原單個檔案的加密、用雜湊檢查每個資料塊的讀回,以及在磁碟一周沒出現時告訴你的東西。
每一項都要花一個週末寫指令碼,之後還得由你維護。Copy Shelter 是同樣的理念,並內建了這些部分,一個位置免費。
rsync 副本會丟失 Finder 標籤?因為在 macOS 上單用 -a 不會帶上擴展屬性。加上 -E。如果還需要 ACL,請用 -A,並考慮 Homebrew 版本,它處理 ACL 比系統自帶版本更可靠。
可以,寫入 /Volumes 下裝載的共享,或透過 SSH 直接寫入 NAS。透過 SSH 更快,也不依賴共享是否已裝載,而且很多 NAS 內建了 rsync。
sudo 嗎?備份你自己的主資料夾不需要。但你需要為終端機或 launchd 執行的程式授予「完全磁碟訪問權限」,macOS 才會允許它讀取「文稿」「桌面」和「下載」。
--delete 危險嗎?它完全照你的要求做,危險就在這裡。第一次先用 -n 試執行,並確保目標路徑正確:帶 --delete 的命令一旦打錯字指向錯誤目錄,就會刪除那裡的檔案。
可以,這正是 rsync 的用途。再次執行,它只傳輸缺失或更改的內容。加上 --partial,傳輸到一半的大檔案會被保留並續傳。
下一篇:如何檢查副本確實可讀。