Linux のバックアップを Time Capsule にとる

Nobuo Danjou
2012-02-10T01:06:40+0900

恥ずかしながら、自宅サーバーのバックアップをまじめにとるぞ!とやっと思い立ちまして、以下のような手順でやることにしました。

UPDATE!!!

こちらもご覧下さい。

time capsule のマウント

mount -t cifs -o pass='mypassword' //my_time_capsule.local/share /media/timecapsule

うちの Time Capsule は「装置パスワード」の設定にしていたので、こんな感じにパスワードを指定してマウントしました。

バックアップディスクの作成

Time Capsule を cifs でマウントして、そこにディレクトリを切って直接 rsync してバックアップしようとしたんですが、そうすると cifs の制限で symlink がつくれないとか chown できないとか問題があるようなのであきらめ。 Time Machine でやってるのと同じ感じで Time Capsule 内にディスクイメージを作って、それをマウントしてバックアップすることにしました。

cd /media/timecapsule
dd if=/dev/zero of=backup.img bs=1M count=10K
losetup /dev/loop0 backup.img
mkfs.ext4 /dev/loop0
losetup -d /dev/loop0

これで backup.img に ext4 のファイルシステムができたので、以下のようにすればマウントできます。

mount -o loop /media/timecapsule/backup.img /mnt/backup/

バックアップ

あとは http://d.hatena.ne.jp/dayflower/20090513/1242194477 を参考にスクリプトを書いてやればオッケー。若干バカっぽいですが気にしないでください。これを /etc/cron.daily/backup に置いて、一日一度バックアップをとってみます。うまくいくかなぁ。

#!/bin/sh

media_dir=/media/timecapsule
image_name=backup.img
backup_dir=/mnt/backup/

target='home var etc'
gens=4

date=`date +%Y%m%d%H%M%S`

mount -t cifs -o pass='mypassword' //my_time_capsule.local/share $media_dir
mount -o loop "$media_dir/$image_name" $backup_dir

backup_count=`/bin/ls -1t $backup_dir|grep -v 'lost+found'|wc -l`
if [ $backup_count -eq 0 ]
then
    for d in $target
    do 
        mkdir -p $backup_dir/$date/$d/
        rsync -av /$d/ $backup_dir/$date/$d/
    done
else
    if [ $backup_count -gt $gens ]
    then
        rm_count=`expr $backup_count - $gens + 1`
        for rm_dir in `/bin/ls -1t $backup_dir|grep -v 'lost+found'|tail -n$rm_count`
        do 
            /bin/rm -rf $backup_dir/$rm_dir
        done
    fi
    link_dest=`/bin/ls -1t $backup_dir|grep -v 'lost+found'|head -n1`
    for d in $target
    do 
        mkdir -p $backup_dir/$date/$d/
        rsync -av --delete --link-dest=../../$link_dest/$d /$d/ $backup_dir/$date/$d/
    done
fi

umount $backup_dir
umount $media_dir