昔作って動かしてたやつをメモ。しばらく使わにゃいので散逸しにゃいように。
#!/bin/sh
if [ $# -lt 2 ]; then
echo "usage: $0 <SOURCE> "
exit 1
fi
force_trailing_slash() {
case $1 in
*/) echo -n "$1" ;;
*) echo -n "$1/" ;;
esac
}
k=$2
SRC=`cd $1 && pwd`
DST=`cd $2 && pwd`
echo src = ${SRC}
echo dst = ${DST}
df=$(( $(df "${DST}" | tail -1 | awk '{print $4}') / 1024 / 1024 ))
while [ $df -le 2 ] ; do
echo df=$df delete
( cd ${DST} && rm -r $(ls | head -1) )
df=$(( $(df "${DST}" | tail -1 | awk '{print $4}') / 1024 / 1024 ))
done
mkdir -p ${DST}/0
last_dir=`ls ${DST} | tail -1`
rmdir ${DST}/0
echo last_dir = ${DST}/${last_dir}
olds=$(ls ${DST} | tail -6)
new_dir=`date +%G%m%d%H%M`
mkdir -p "${DST}/${new_dir}"
echo new_dir = ${DST}/${new_dir}
list=$( cd "${SRC}/" ; find . -mindepth 2 -maxdepth 2 -type d -printf "%P\n" )
echo "$list" | while read d ; do mkdir -p "${DST}/${new_dir}/$d" ; done
echo "$list" | grep -v "System Volume Information" | grep -v "RECYCLE.BIN" | grep -v "DfsrPrivate" |
while read d ; do
link_dest=$(echo "$olds"|sort -r| while read a ; do test -d "${DST}/${a}/${d}" && echo --link-dest="${DST}/${a}/${d}" ; done)
echo rsync -a --log-file=${DST}/${new_dir}/rsync.log --exclude= \
--link-dest="${DST}/${last_dir}/$d" ${link_dest} "${SRC}/$d/" "${DST}/${new_dir}/$d/"
rsync -av --log-file=${DST}/${new_dir}/rsync.log --exclude= \
--exclude="RECYCLE.BIN" --exclude="DfsrPrivate" --exclude="System Volume Information" \
--link-dest="${DST}/${last_dir}/$d" ${link_dest} "${SRC}/$d/" "${DST}/${new_dir}/$d/"
done
ls ${DST}/${new_dir}/ | grep -v rsync.log | grep . || ( rm ${DST}/${new_dir}/rsync.log && rmdir ${DST}/${new_dir} )
umount /mnt/backup/$k
umount /mnt/backup/$k
umount -f /mnt/backup/$k
umount -f /mnt/backup/$k
echo 1 > /proc/sys/vm/drop_caches
mount -a
環境依存しまくってるが、過去数回分のバックアップ先と比較して合致するファイルはlink-destしてる。
ディスク容量が不足したら最古の物から消す。
最終的にバックアップ先をunmountしてキャッシュクリアしてるのはバックアップ先をreiserfsで高速化してたから。大変高速だったが、ファイル数増えすぎるとメモリ不足ににゃるのでこのスクリプトを順次回していくといろいろ溜まっていくことににゃった対処跡。
部分的に変更された巨大ファイルにゃどには全く対応していにゃい。
同じことをNTFSでやったらhardlink数が64あたりからおかしくにゃったので、link数4桁とかに耐えられるFSを選ぶこと。
hardlinkしてるだけにゃのでどこかのファイルを変更すると全部変更されるので注意。まあしにゃいけど。
更新されてにゃいファイルはローカルでlnされるだけにゃのでバックアップ速度は高速。但しローカルでfind hoge/とかした時にFSが遅いと終わらにゃい。
同類の結果をもたらすバックアップ方法としては、
・NTFSに全部コピーしてdedupする(短時間で全容量コピー出来るI/O速度と残容量が必要)
・zfsに上書き同期してsnapshotする(dedupやcompressも併用して良い)
もちろんこれが動いてるvmをntfs dedupするという方向性も無くは無い。