rsync で Mac をバックアップするコマンド: rsync -aE --delete ~/Documents/ /Volumes/Backup/Documents/
-E は macOS 固有の部分で、付け忘れると拡張属性とリソースフォークが黙って失われます。
-a はアーカイブモードです: 再帰し、アクセス権、所有者、タイムスタンプ、シンボリックリンクを保持します。誰もが知っているフラグです。-E は macOS の拡張属性とリソースフォークを保持します。Finder のタグ、隔離フラグ、カスタムアイコン、多くのアプリケーションのメタデータはそこにあります。これがないと失われ、何も知らせてくれません。--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 を外しても解決しません。これまでのすべてのファイルが溜まり続け、それでも各ファイルのバージョンは1つだけで、どれが最新かもわからない宛先になります。
--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 の土台になっている考え方です。
注意点が2つあります。ハードリンクではコピーは独立していません: 元になるブロックが破損すると、それを共有するすべてのスナップショットに影響します。また、ハードリンクに対応したファイルシステムが必要なので、外付けドライブでは動きますが、ほとんどのクラウドフォルダの中では動きません。
rsync は保存データを何も暗号化しません。宛先がクラウドフォルダや建物の外に出るドライブなら、書き込む前に暗号化してください:
tar -cJf - ~/Documents | openssl enc -aes-256-cbc -pbkdf2 -out /Volumes/Backup/documents.tar.xz.enc
それは中身の見えないアーカイブ1つです。差分コピーはなく、1つのファイルを戻すにも全体を展開する必要があり、 すべてがパスフレーズ1つにかかっています。この代償は大きく、多くの人が自作をやめるのは ここです。
macOS には今も cron がありますが、サポートされているのは launchd です。~/Library/LaunchAgents/ に StartCalendarInterval を持つ plist を置けば、スクリプトを毎日実行します。書類とデスクトップの読み取りは保護されているので、macOS は実行するものにフルディスクアクセスを求めます。
何をスケジュールするにせよ、結果を実際に目にする場所に書き出し、バックアップが最近のものか確かめてください:
find /Volumes/Backup -type f -newermt '-7 days' | head
黙って止まるジョブこそが失敗の形です。画面にエラーを出して止まるのではなく、4か月前の夜中に止まっているのです。
上のコマンドはコピーをカバーします。カバーしないのは、何かがうまくいかなかった日に本当に欲しいものです: ミラーの実行後も残るバージョン、1ファイルだけ復元できる暗号化、すべての断片をハッシュと照合する読み戻し、そしてドライブが1週間見えていないと知らせてくれる仕組みです。
どれも週末を費やすスクリプト作りで、その後は自分で保守し続けることになります。Copy Shelter は同じ考え方にそれらを組み込んだもので、1か所なら無料です。
rsync のコピーで Finder のタグが失われるのはなぜですか?macOS では -a だけでは拡張属性が引き継がれないからです。-E を加えてください。ACL も必要なら -A を使い、システム版より確実に扱える Homebrew 版も検討してください。
はい。/Volumes の下にマウントした共有にも、SSH で NAS 自体にも保存できます。SSH のほうが速く、マウントの有無にも左右されません。多くの NAS には rsync が組み込まれています。
sudo は必要ですか?自分のホームフォルダなら不要です。ただし、macOS が書類、デスクトップ、ダウンロードの読み取りを許可するには、ターミナル、または launchd が実行するものにフルディスクアクセスを与える必要があります。
--delete は危険ですか?言われたとおりのことをしており、そこが危険なのです。最初は -n でドライランし、宛先のパスが正しいことを確かめてください: --delete を付けたまま誤ったディレクトリを指定すると、そこのファイルが削除されます。
はい、それこそ rsync の役目です。もう一度実行すれば、欠けているものと変わったものだけを転送します。--partial を加えると、途中まで転送された大きなファイルが残され、続きから再開されます。
次へ: コピーが本当に読めるか確認する方法。