asrコマンドの --erase オプションの動作がいまいち気に入らないのでシェルスクリプトを書いてくるくる

MacOSX 10.4 の asr コマンドを使って、バックアップを取ろうと色々やってみたのですが、どうも気に入らないんです。
それは、

  • ターゲットのボリューム名がソースと同じになる

ことです。


例えば、起動ディスクを「OSX」、バックアップディスクを「backup」としておいて、以下のコマンドを実行します。

/usr/sbin/asr restore --source / --target /Volumes/backup \
                      --erase --noprompt

すると、バックアップディスクの「backup」が「OSX」になってしまい、デスクトップに「OSX」というディスクが2つ出てきます。
どっちがメインでどっちがバックアップだかわかりゃしない。


気に入らないので、とうとうスクリプトを書きました。
特に難しいことはしてなくて、単純にターゲットを消去してから、--eraseオプション無しでasrを実行するだけです。
cronに仕掛けて毎日バックアップ取る予定です。そのため、多少分かりやすいように、説明も出力します。
最初、ソースとターゲットは、/devエントリで記述するように作っていたのですが、どうやら/devエントリは再起動時に順番が入れ替わることがあるようです。特に、CDをドライブに入れっぱなしにしている場合。
なので、ディレクトリで指定するようにしました。

ソースとターゲットは、「/」か「/Volumes/backup」などの /Volumes 以下のフォルダで指定してください。

#!/bin/bash
#
# backup.sh
#
#  Usage: backup.sh source_dir target_dir
#
echo %%% $0 $*

SOURCE=$1
TARGET=$2

if [ ! `/bin/df -k -P | /usr/bin/grep " ${SOURCE}\$" | awk '{ print $1 }'` ]
then echo "error: the source directory is not device root. : ${SOURCE}"
     echo "Usage: $0 source_dir target_dir"
     exit 1
fi

if [ ! `/bin/df -k -P | /usr/bin/grep " ${TARGET}\$" | awk '{ print $1 }'` ]
then echo "error: the target directory is not device root. : ${TARGET}"
     echo "Usage: $0 source_dir target_dir"
     exit 1
fi

echo %%% /usr/sbin/diskutil reformat \"${TARGET}\"
/usr/sbin/diskutil reformat "${TARGET}"

echo %%% /usr/sbin/asr restore --source \"${SOURCE}\" --target \"${TARGET}\" --noprompt
/usr/sbin/asr restore --source "${SOURCE}" --target "${TARGET}" --noprompt

echo %%% /usr/sbin/diskUtil mount \"${TARGET}\"
/usr/sbin/diskUtil mount "${TARGET}"


使い方は、こんな感じ。

./backup.sh / /Volumes/backup

これで、起動ディスクを backup というボリュームへバックアップできます。


ちなみに、asrを使って --eraseオプション 無しで起動ディスクをコピーすると、以下のようなメッセージが出ますが、気にしなくていいそうです。

asr: did not copy blessed information to target, 
which may have missing or out-of-date blessed folder information.

こちらのサイトで教えていただきました。
ありがとうございますです。