Hfspax を使った Mac OS X のバックアップ

0. はじめに

 Hfspax は Howard Oakley さんが UNIX ツールの pax を基にして作成した HFS+ ボリューム専用のバックアップツールである。Mac OS X は UNIX と Mac OS が混成しているためファイルの扱いがかなり複雑で、多数のファイルをバックアップする方法については試行錯誤している人が多いと思う。

 Hfspax は pax に HFS+ 特有のリソースフォーク・ファインダ情報の扱いを付け加えたもので、HFS+ ボリュームのバックアップが可能であるとうたっている。Mac OS 10.1 上で実験してみたところ、有望な結果が得られたので、まとめておきたい。

 注意! ここで紹介する操作はすべて Terminal を使い、root 権限で実行することになる。Terminal の操作に自信のない方にはお勧めできません。また、もしかするとどこかに間違いがあって、大事なデータを失ってしまうかも知れませんが、その際も筆者は責任をとることはできませんので、あらかじめご了解ください。あくまでも自己責任でお試しいただきたい。

 Hfspax は Howard Oakley さんのウェブサイトからダウンロードできる。インストール方法は付属ドキュメントに書いてある通りで、Terminal を立ち上げて

cd (解凍してできたディレクトリ); sudo ./hfspaxinstall

とすればよい。

1. 基本

バックアップ

 すべての操作は Terminal を使って行う(ごめん!)

hfspax -w [-v] [-ua] -f archive-name -x cpio file1 file2 ...

-ua は前回との差分のみバックアップするときに指定。このときはフォーマット指定の -x cpio は省略できる。-v は処理するファイルのリストを表示するときに指定。file1, file2, ... は現在のディレクトリからの相対パスで指定する。(そうしないとリストア時に絶対パスで同じところにあるファイルが上書きされてしまう)

リストア

hfspax -r [-v] -f archive-name [file1 file2 ...]

 file1, file2, ... は相対パスで指定し、現在のディレクトリからの対応する位置にファイルがリストアされる。たとえば、

cd ~/Documents hfspax -w -f /Volumes/Backup/backup.pax MyLetters

として作成したアーカイブを使って、

cd ~/AnotherFolder hfspax -r -f /Volumes/Backup/backup.pax MyLetters/ToMom.rtf

とすると、もともと ~/Documents/MyLetters/ToMom.rtf であったファイルが ~/AnotherFolder/MyLetters/ToMom.rtf としてリストアされる。

2. ボリューム全体のバックアップ

 ボリュームのバックアップは通常のファイル/ディレクトリのバックアップと同じようにはいかない。トップレベルにある /dev/Volumes を特別扱いする必要がある。たとえば起動ボリュームをバックアップする場合、次のようにする。

cd / ls -1a | grep -v '^\(\.\.\?\|dev\|Volumes\)$' | \ sudo hfspax -w [-v] [-ua] -f archive-name -x cpio

 ls -1a は現在のディレクトリ中のすべてのファイル/ディレクトリを1行に1つずつ表示する。次の grep は、ls の出力から ".", "..", "dev", "Volumes" を取り除く。このファイル名/ディレクトリ名リストを使って最後の sudo hfspax がバックアップを実行する。
 起動ボリューム以外のボリューム(たとえば MyVolume)なら、上の cd /cd /Volumes/MyVolume に変えればよい。

 ところで、上のサンプルを Terminal にコピー/ペーストしてもうまくいかないかも知れません。バックスラッシュの扱いがちょっと変。
 2行めの最後の '\' は行継続のためのエスケープ文字なので、'sudo...' 以下を続けて同じ行に書けば不要です。

3. ボリューム全体のリストア・起動可能ボリュームの作成

 上でバックアップしたアーカイブから元のボリュームを再生して、それを起動可能にするには次の手順に従う。

 このあと、「システム環境設定」の「起動ディスク」などで OSX_Test ボリュームを指定すると、そこから起動できる。

4. ボリュームのバックアップ・リストア専用シェルスクリプト

 上記 2, 3 の操作は手で打つと結構面倒で間違えやすいので、シェルスクリプトを書いてみた。

 バックアップ用:

#!/bin/sh case $# in 0) echo "Usage: $0 volume archive-file [options-to-hfspax]" 1>&2; exit 1 ;; esac case `whoami` in root) ;; *) echo "$0: you must be root to use this command." 1>&2; exit 2 ;; esac cd $1 FILE=$2 shift 2 ls -1a | grep -v '^devVolumes$' | hfspax -w "$@" -f $FILE -x cpio

 リストア用:

#!/bin/sh case $# in 0) echo "Usage: $0 volume archive-file [options-to-hfspax]" 1>&2; exit 1 ;; esac case `whoami` in root) ;; *) echo "$0: you must be root to use this command." 1>&2; exit 2 ;; esac cd $1 FILE=$2 shift 2 hfspax -r -pe "$@" -f $FILE mkdir -m 555 dev chown root:wheel dev bless -folder System/Library/CoreServices

 自分のホームディレクトリ(/Users/toshi_n など)の下に bin というディレクトリを作って、そこに上のスクリプトを backup_volume, restore_volume という名前でコピーし、実行可能にしておく。

mkdir ~/bin cp backup_volume ~/bin/backup_volume cp restore_volume ~/bin/restore_volume chmod +x ~/bin/backup_volume ~/bin/restore_volume

 使い方は次の通り。

sudo backup_volume ボリューム名 アーカイブ名 hfspaxのオプション

sudo restore_volume ボリューム名 アーカイブ名 hfspaxのオプション

 Hfspax のオプションとして、-f, -w, -r, -x cpio, -pe はスクリプトに組み込まれているので省略してよい。必要なのは、差分を追加するときの -ua と、ファイルリストを長々と出したいときの -v ぐらい。

 例:

# 新しくアーカイブを作って起動ディスクをバックアップ sudo backup_volume / /Volumes/Backup/whole.pax # 上で作ったアーカイブに差分を追加バックアップ sudo backup_volume / /Volumes/Backup/whole.pax -ua # このアーカイブを /Volumes/MyVolume にリストア sudo restore_volume /Volumes/MyVolume /Volumes/Backup/whole.pax

 Terminal での操作の常として、タイプミスをするとえらいことになるので十分に注意。とくに、root 権限で実行しているので、へまをしてもシステムは警告を出してくれないことが多い。

5. テスト結果

 HDD の一方に 10.1.1 がインストールしてあり、もう一方を2つのパーティションに分けて、片一方をバックアップファイルの置き場とし、もう一方のパーティションを空にしてここにリストアを試みた。

 速度的にはまったく申し分ない。リストアしたシステムは、一見したところもとのシステムと寸分違わないように見えた。詳しく使い込んでないのでどの程度問題点があるかは不明。特に、Mac OS のエイリアスがどう処理されているかは未確認。

 実は、この文章を BBEdit で書いて編集して、IE5.1 でプレビューして、Classic 環境で Fetch を立ち上げて ftp アップロードして、一息ついたところでふと気がつくと、いつものシステムじゃなくて今回リストアしたシステム上で間違って作業していたことがわかりました(笑) というわけで、まずまずちゃんと動いているみたい。ただ、Dock の動作がちょっと挙動不審なところがあったような気がする。

6. 感想など

 これ、十分使えると思う。本当に信頼性の高さと操作性の良さを求めるなら Retrospect の正式版が出るのを待った方がいいけど、それまでバックアップをとらずに放っておくわけにはいかないから、つなぎとして使ってみる価値はある。

 これから実装が望まれる機能をあげてみる。

 原作者の Howard Oakley さんは Cocoa で作った GUI ツールも計画しているらしい。また、彼は「十分にコードが熟したら hfspax をオープンソースにするつもりだ」とも言っている。どちらも楽しみである。

7. 情報元・参考文献など

Howard Oakley さんのサイト
・Darwin Development Mailing List Archive
Apple のサイト、および Darwinfo にもアーカイブがある。Hfspax の存在そのものもここを読んでいて見つけた。起動ディスクを作るための bless の使い方も。
・「UNIX プログラミング環境」(B. W. Kernighan & R. Pike, 石田晴久監訳、アスキー出版局)
古い本だけど、僕はこれがないと未だにシェルスクリプトが書けない。

付記 A. Cron を使ってボリュームの定期的なバックアップをとる

(2001.11.25. 追記)

 4. で書いたものよりももう少し高機能なシェルスクリプト HFSVolumePax を作成した。このファイル (.gz 圧縮、827 bytes) を展開して得られる HFSVolumePax~/bin にコピーし、chmod +x で実行可能にしておく。

cp HFSVolumePax ~/bin chmod +x HFSVolumePax

 使い方は次の通り。

HFSVolumePax [-d <path>] [-f <archive-file>] <mode> <volume-name> [options-to-hfspax]

 <mode>backup, update, restore のうちいずれか。backup は新規アーカイブを作成、update はすでにあるアーカイブに変更ファイルのみ追加、restore はアーカイブから全ファイルを復帰し、さらに dev の作成および bless 処理を行う。update の場合、アーカイブファイルが存在しなければ backup と同じ動作をする。

 <volume-name> はボリューム名。起動ボリュームは / と書き、 それ以外のボリュームは普通のボリューム名(/Volumes/ はつけない)をそのまま書く。<mode>backup, update の時はバックアップの対象ボリュームを指定し、restore の時はリストア先になるボリュームを指定する。restore の場合、そのボリューム上にある同名のファイルはすべて上書きされてしまうので、十分に注意すること。

 -d オプションは、アーカイブファイルを置くディレクトリを指定する。デフォルトでは /Volumes/Backup/Pax に置くようになっている。

 -f オプションは、アーカイブファイルの名前を指定する。デフォルトでは、起動ボリュームの場合は root.pax, それ以外の場合はボリューム名に拡張子 .pax をつけたものになる。

 その他 hfspax に与えるオプションがある場合は、<volume-name> の後に指定する。あまり美しい仕様ではないが、あまりオプションを使う必要もないと思われるのでご勘弁。

カスタマイズ

 次の値は変更しやすいようにスクリプトの初めの方に置いてある。

Cron を使った自動実行

 たとえば次のような運用を考える。

 この場合、毎週月曜日に新規バックアップが行われ、その週の間は差分バックアップ、そして次の月曜日に一週間分のアーカイブが別名で(圧縮して)保存され、また新規バックアップが行われる、というサイクルが続くことになる。

 上の HFSVolumePax スクリプト、および CronniXSven Schmidt さんが開発した cron への GUI フロントエンド。現在のバージョンでは E-wa さんの日本語リソースが付属している)を使えばこれは簡単に実現できる。

 まず CronniX をインストールして立ち上げ、root ユーザの設定を読み込む。

管理者パスワードを要求されるので、正しいパスワードを入力する。

 初めて設定するときは次のような警告が出るが、そのまま OK してよい。

 設定画面は次のようになっている。最初は空の設定が出てくるが、「新規」を2回押して、それぞれの行を下の図の通り編集する。1行目の /Users/toshi_n/bin/HFSVolumePax のところは HFSVolumePax スクリプトのフルパス名を書くこと。アーカイブファイルを置くディレクトリを -d オプションまたは HFSVolumePax の書き換えで変更している場合は、2行目の /Volumes/Backup/Pax/ のところも適当に書き直す必要がある。

 「保存」して CronniX を終了する。

コメント

 この方法はいくつか問題を含んでいる。最大の問題は、バックアップ用のハードディスクを常にマウントしておかなければならないため、特定ボリュームのファイルを全消去してしまうような誤操作(人間の誤操作、プログラムのバグなど。悪意あるウィルス等の攻撃も含む)に対しては無力という点である。また、圧縮せずにファイルデータを保持しているためアーカイブが巨大になってしまう。さらに、先日確認したのだが、Mac OS のエイリアスは現在の hfspax では完全には復旧できない。

 しかしながら、この程度のバックアップでもないよりは余程マシだろう。よりよいバックアップ戦略を立てるための出発点として参考にしていただければ幸いである。