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
とすればよい。
すべての操作は 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
としてリストアされる。
ボリュームのバックアップは通常のファイル/ディレクトリのバックアップと同じようにはいかない。トップレベルにある /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...'
以下を続けて同じ行に書けば不要です。
上でバックアップしたアーカイブから元のボリュームを再生して、それを起動可能にするには次の手順に従う。
/Volumes/OSX_Test
ディレクトリに移る。
cd /Volumes/OSX_Test
sudo hfspax -r -pe [-v] -f archive-name
オプションの-r
は「読み出し」、-pe
は「UNIX のファイル属性(ユーザ ID、グループ ID、パーミッション、ファイルアクセス時刻、ファイル更新時刻)を復元」の意味。-v
は書き込み時と同じくファイルのリストを(長々と)表示する。
dev
ディレクトリを作っておく。
sudo mkdir -m 555 dev sudo chown root:wheel dev
なぜ555
なのか、とか、なぜ root:wheel
なのか、というのは聞かないで下さい。標準インストールしたあとの /dev
のパーミッション/ユーザID/グループID に合わせただけです。
sudo bless -folder System/Library/CoreServices
このあと、「システム環境設定」の「起動ディスク」などで OSX_Test ボリュームを指定すると、そこから起動できる。
上記 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 権限で実行しているので、へまをしてもシステムは警告を出してくれないことが多い。
HDD の一方に 10.1.1 がインストールしてあり、もう一方を2つのパーティションに分けて、片一方をバックアップファイルの置き場とし、もう一方のパーティションを空にしてここにリストアを試みた。
速度的にはまったく申し分ない。リストアしたシステムは、一見したところもとのシステムと寸分違わないように見えた。詳しく使い込んでないのでどの程度問題点があるかは不明。特に、Mac OS のエイリアスがどう処理されているかは未確認。
実は、この文章を BBEdit で書いて編集して、IE5.1 でプレビューして、Classic 環境で Fetch を立ち上げて ftp アップロードして、一息ついたところでふと気がつくと、いつものシステムじゃなくて今回リストアしたシステム上で間違って作業していたことがわかりました(笑) というわけで、まずまずちゃんと動いているみたい。ただ、Dock の動作がちょっと挙動不審なところがあったような気がする。
これ、十分使えると思う。本当に信頼性の高さと操作性の良さを求めるなら Retrospect の正式版が出るのを待った方がいいけど、それまでバックアップをとらずに放っておくわけにはいかないから、つなぎとして使ってみる価値はある。
これから実装が望まれる機能をあげてみる。
原作者の Howard Oakley さんは Cocoa で作った GUI ツールも計画しているらしい。また、彼は「十分にコードが熟したら hfspax をオープンソースにするつもりだ」とも言っている。どちらも楽しみである。
(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>
の後に指定する。あまり美しい仕様ではないが、あまりオプションを使う必要もないと思われるのでご勘弁。
次の値は変更しやすいようにスクリプトの初めの方に置いてある。
BACKPATH=/Volumes/Backup/Pax
hfspax
のフルパス名:HFSPAX=/usr/bin/hfspax
たとえば次のような運用を考える。
update
モードでバックアップ。/Volumes/Backup/Pax
ディレクトリ中の root.pax
ファイルを圧縮して root.pax.gz
とし、root.pax
ファイル自体は消去する。この場合、毎週月曜日に新規バックアップが行われ、その週の間は差分バックアップ、そして次の月曜日に一週間分のアーカイブが別名で(圧縮して)保存され、また新規バックアップが行われる、というサイクルが続くことになる。
上の HFSVolumePax
スクリプト、および CronniX (Sven 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
では完全には復旧できない。
しかしながら、この程度のバックアップでもないよりは余程マシだろう。よりよいバックアップ戦略を立てるための出発点として参考にしていただければ幸いである。