Macでデスクトップ上のファイルを一定間隔でUSBメモリやSDカードにバックアップ
Macには純正のバックアップ機能としてTimeMachineがありますが、更新間隔は短くても1時間置きだったりします。
(間隔を変更できるソフトもあるそうですが、最短はやはり1時間のようです)
Macでは標準でrsync、cron、php等も入っているので、これらと こちらのスクリプト を利用して、もう少し短い間隔でUSBメモリ等にバックアップをとるようなスクリプトを作ってみました。
とりあえず、バックアップ元はデスクトップ上のファイルに限定、バックアップ先はUSBメモリやSDカードのような外部メディアを使い、更新間隔は1分で、10分置きに履歴バックアップを残しバックアップ先の容量が少なくなってきたら古いバックアップを削除して容量確保なども行なっています。
簡単に流用できるかと思いきや、macOSのセキュリティが結構厳しかったので設定はちょっと面倒な部分もあります。
USBメモリは、USB3.0以降に対応のものが読み書き速度も早くて良いです。USB2.0のみ対応のものでも使えますが、デスクトップ上のファイル数やサイズによっては遅さが目立ってきます。
■ USBメモリやSDカードをフォーマット
ユーティリティ → ディスクユーティリティを実行
左画面からバックアップに使用するUSBメモリやSDカードを選択して、上にある消去アイコンをクリック。
くれぐれも対象のディスクを間違えないように。
名前: desktop-backup
フォーマット: APFS または Mac OS拡張 (ジャーナリング)
方式: GUIDパーティションマップ
消去ボタンを押す。
方式でGUIDパーティションマップを選択すると、APFSとMac OS拡張では暗号化も選択できます。
デスクトップ上のファイルをUSBメモリへバックアップするという用途を考えると、盗難や紛失時のリスクを考えて暗号化ありを選択するのも良いかと思います。
FATとexFATはWindowsPCでも読み書きできるという利点はありますが、ハードリンクに対応しておらず、rsyncの--link-destオプションでの差分バックアップの際にも毎回フルバックアップ相当の容量を消費してしまうため今回の用途に限ってはおすすめしません。
フォーマットが終わるとdesktop-backupという名前でマウントされたドライブアイコンがデスクトップ上に表示されると思います。
終わったらディスクユーティリティも閉じて大丈夫です。
■ スクリプトの設定
上記ファイルをダウンロードして、フォーマットしたUSBメモリにコピーします。
ユーティリティ → ターミナルを開く
cd /volumes/desktop-backup
と入力して[enter]キーを押してUSBメモリーへ移動
unzip mac_desktop_backup.zip
と入力して[enter]キーで、zipファイルを解凍
(unzipコマンドを使わずzipファイルのアイコンからアーカイブユーティリティで解凍すると、USBメモリのルートに不要なフォルダができてその中に解凍されてしまいます)
chmod 0777 *.command
と入力して[enter]キーで、 *.command ファイルに実行権限付加
rm mac_desktop_backup.zip
と入力して[enter]キーで、不要になったzipファイル削除
終わったらターミナルは閉じて構いません。
■ ファイルの確認
USBメモリ(desktop-backup)のアイコンをダブルクリックしてファイル確認
set.command
reset.command
scripts/
|-- backup.php
|-- backup_sub.php
|-- backup_config.php
|-- capacity_check.php
|-- old_delete.php
上記ファイルがあればOKです。
(設定項目はとくにありません)
■ cronにスケジューリング設定
crontabで設定を行います。
設定の追加や削除はこのスクリプトが使用する範囲のみで変更していますが、既にcrontabで何らかのスケジュール設定をされている方は念のため現状の設定をバックアップしておいてください。
set.command ファイルをダブルクリックするとスケジュール登録されるのですが、ダウンロードしたファイルはセキュリティ関連で初回は弾かれて実行できないので、初回のみ set.command を選択、右クリックでメニューを開いて「開く」を選択で実行します。
「"ターミナル"がコンピュータを管理することを要求しています・…」のダイアログが出たら、[OK]をクリックします。
コマンド画面に「設定が完了しました。」と出ていたら、コマンド画面は閉じて構いません。
以降はファイルをダブルクリックで実行できるようになると思います。
登録完了するとUSBメモリに backup フォルダが作成されて、その中に更に日付をファイル名としたフォルダ、その中にデスクトップ上のファイルがバックアップされていきます。
backupフォルダの中に日付フォルダができない場合、cronでのディスクアクセスが許可されていない場合があります。
比較的最近のバージョンのmacOSだと(たしかcatalina辺りから)初期状態では無効になっているようです。
その場合は、
システム環境設定→セキュリティとプライバシー を開いて、
[プライバシー]タブ→左から[フルディスクアクセス]を選択、
左下の鍵アイコンをクリックしてロック解除(パスワードの入力が必要)
右側に「cron」があればチェックを入れる。
無ければ[+]ボタンを押して表示された画面でcommandキーとshiftキーを押しながらGキーで「フォルダの場所を入力」が出るので、そこへ /usr/sbin/cron を入力して[移動]ボタンを押すとcronが選択された状態になるので、そのまま[開く]ボタンを押します。
セキュリティーとプライバシー画面の右側でcronにチェックが付いた状態になったら、左下の鍵アイコンを閉じて完了です。
■ スケジュールの解除
reset.command ファイルをダブルクリックで、設定されたスケジュールを解除します。
初回は登録時と同じくダブルクリックでは弾かれるので、同様に右クリックメニューから「開く」で実行してください。
「設定の解除が完了しました。」が表示されたらコマンド画面は閉じて大丈夫です。
■ バックアップの挙動
1分置きに、いちばん新しい日付フォルダへデスクトップ上のファイルがバックアップされます。
デスクトップ上のファイルが多い場合は初回のバックアップに時間がかかる場合があります。
デスクトップ上で更新、削除されたファイルも同様にバックアップ上でも更新、削除されます。
1分置きに更新されていた日付フォルダは10分間隔で履歴として残され、新たな日付フォルダが作成されます。
異なる日付フォルダ間の同じファイルは変更されていない限りハードリンクとして作成されますので、日付フォルダが増えても完全バックアップ1つ分に加えて変更のあったファイル分のみのディスク消費で済みます。
macOSで扱えるファイルシステムのうち、このハードリンクを扱えるのが「MacOS拡張」か「APFS」のみなので最初にフォーマットしたわけです。
FATやexFATでフォーマットしたディスクでも動作はしますが、ハードリンクには対応していないため全く同一のファイルであっても日付フォルダの数だけディスク容量を消費してしまい、無駄が多くなります。
日付フォルダは、1日以上経過したものは0時台の00~09分のものを残して削除、1か月以上経過したものは1日に作成されたものを残して削除、1年以上経過したものは1月1日に作成されたものを残して削除という具合に間引きしていきます。
USBメモリの使用容量が90%を超えたら、90%を下回るまで古い日付フォルダから順に削除されます。
■ USBメモリを取り外す場合
可能な限り、アイコンの右クリックメニューから「"desktop-backup"を取り出す」を行なってから外してください。
スケジュール設定を止めていない場合は、USBメモリを接続すると再度バックアップが始まります。
USBメモリの名前を変更したり backup フォルダ自体を削除した場合は、再度 set.command を実行してスケジュールをセットし直す必要があります。
使用をやめる場合や長期間使用しない場合は、reset.command でスケジュールを解除しておいてください。