Лупайте сю скалу...
Іван Франко


Wed 25 of Nov, 2009 [06:11 UTC]

Search Wiki PageName
Search
in:
Пані Маєш: <<Уроки>>
Тут зібрана різноманітна інформація з тих областей, які мене цікавлять. В основному це буде так чи інакше пов'язане моєю роботою (я все ще працюю системним адміністратором Юнікса) чи загальними інтересами, як то українська мова, література. Або ж з місцями мого перебування -- Київ, Токіо. Але немає ґарантії, що тут не з'явиться іще щось цікавеньке (як на мою особисту думку).

скрипт для snapshot'ів

print
Цей скрипт фактично базується на двох командах GNU версії cp і rsync. Він дозволяє створювати резерні копії (backup) файлових систем економно використовуючи дисковий простір — тільки зміни записуються на диск при повторних копіях. На файли, які не змінилися створюються тільки жорсткі посилання (hard links).

Скрипт базується на ідеях з статті http://www.mikerubel.org/computers/rsync_snapshots/.

Звантажити тут.

Текст скрипта
#!/bin/zsh

#
# Backup script. Backs up files from one filesyste (directory) to another
# (NFS-mounted or any other FS). Creates snapshot-like backups, with dated
# directories. Files that are not changed on source are hardlinked instead of
# copied. Changed files are RSYNC`d over.

# Based on article Easy Automated Snapshot-Style Backups with Linux and Rsync
# http://www.mikerubel.org/computers/rsync_snapshots/
#
# D. Kovalov, Sept 2005.
#

OS=$(uname -s)
if [ ${OS} = SunOS ]; then
	mail=/usr/bin/mailx
else
	mail=/bin/mail
fi

# Allow use of comments in list file
#DUMPLIST=$(cat /home/kovalodm/bin/dump.lst | grep -v \#)
DUMPLIST="/home/kovalodm"
ADDR="kovalov@company.com"
#DUMP_TO=/nfs/dump
DUMP_TO=/export/kovalodm.backup
KEEP_SNAPSHOTS=20
DEBUG=1
# ------------------------------------------------------------
debug () {
	[ ${DEBUG} = 0 ] && { return; }
	MSG=$1
	echo '********' $(date): $(basename $0): $MSG '********';
}

# ------------------------------------------------------------
error_mail () {
	local MSG=$1
	echo $MSG | ${mail} -s "Backup Error $(uname -n) $(date +%y%m%d)" $ADDR
}
# This doesn't work. Dirs preserve timestamps on destination, and there fore
# deleted right aftrer creation.
 # NO GO ## ------------------------------------------------------------
 # NO GO #clear_snapshots () {
 # NO GO #        local FS=$1
 # NO GO #	FS_FILE=$(slash_to_under $FS)
 # NO GO #	# ------------------------------  | year          | month  | day      | hour    | minute  |
 # NO GO #	local SNAPSHOT_FORMAT="${FS_FILE}\.2[0-9][0-9][0-9][01][0-9][0123][0-9][012][0-9][0-5][0-9]\.snap"
 # NO GO #
 # NO GO #	find ${DUMP_TO} -name ${SNAPSHOT_FORMAT}  -maxdepth 1 -mtime +${KEEP_DAYS} -print | \
 # NO GO #	while read DIR; do
 # NO GO #		debug "Deleting old snapshot directory ${DIR} "
 # NO GO #		rm -rf ${DIR}
 # NO GO #		debug "done"
 # NO GO #	done
 # NO GO #}
# ------------------------------------------------------------
clear_snapshots () {
        local FS=$1
	FS_FILE=$(slash_to_under $FS)
	# ------------------------------  | year          | month  | day      | hour    | minute  |
	local SNAPSHOT_FORMAT="${FS_FILE}\.2[0-9][0-9][0-9][01][0-9][0123][0-9][012][0-9][0-5][0-9]\.snap"
	find ${DUMP_TO} -name ${SNAPSHOT_FORMAT}  -maxdepth 1 -print | sed 's/ *//g' | \
		sort -r | \
		sed "1,${KEEP_SNAPSHOTS}d" | while read DIR 
		do
			debug "Deleting old snapshot directory ${DIR} "
			rm -rf ${DIR}
			debug "done"
		done
}
# ------------------------------------------------------------
prev_snapshot () {
        local FS_FILE=$1
	[ -z "$FS_FILE" ] && { echo "Provide a file name"; exit 10; }	
        local SNAPSHOT_NUMBER=$SNAPSHOTS
	# ------------------------------| year          | month  | day      | hour    | minute  |
	local SNAPSHOT_FORMAT="${FS_FILE}\.2[0-9][0-9][0-9][01][0-9][0123][0-9][012][0-9][0-5][0-9]\.snap"

        [ "$SNAPSHOTS" = 0 ] && { error_mail "Number of snapshots must be > than 0"; exit 20; }
	(cd ${DUMP_TO} && ls -1tr | egrep -e ${SNAPSHOT_FORMAT} 1> /dev/null ) || { return 1;}
	LAST_SNAPSHOT=$(cd ${DUMP_TO} && ls -1tr | egrep -e ${SNAPSHOT_FORMAT} | tail -1)

	echo "${DUMP_TO}/${LAST_SNAPSHOT}"
	return 0
}
# ------------------------------------------------------------
slash_to_under () {
 	local STRING=$1
	[ -z "$STRING" ] && { echo "Provide a filesystem name"; exit 10; }
	[ "${STRING}" = "/" ] && { STRING=root; }
	local OUT=$(echo $STRING | tr '/' '_' | sed 's;^_;;')
	echo $OUT
}
# ------------------------------------------------------------
snapshot_fs () {
	local FS=$1
	[ -z "${FS}" ] && { error_mail 	"Can not dump filesystem without a name."; exit 25; }
	FS_FILE=$(slash_to_under $FS)
	local PREV_SNAPSHOT=$(prev_snapshot $FS_FILE)
# debug "FS_FILE $FS_FILE"
# debug "prev_snapshot FS_FILE $(prev_snapshot $FS_FILE)"
# debug "PREV_SNAPSHOT $PREV_SNAPSHOT"	
	local PREV_SNAPSHOT_EXISTS=0
	[ -z "${PREV_SNAPSHOT}" ] && { PREV_SNAPSHOT_EXISTS=1; }
	local NEW_SNAPSHOT=${DUMP_TO}/${FS_FILE}.$(date +%Y%m%d%H%M).snap
# 	debug "Doing cp -al ${PREV_SNAPSHOT} ${NEW_SNAPSHOT}" 2
# 	debug "PREV_SNAPSHOT' $PREV_SNAPSHOT" 2
# 	debug "PREV_SNAPSHOT_EXISTS' $PREV_SNAPSHOT_EXISTS" 2
# 	debug "NEW_SNAPSHOT' $NEW_SNAPSHOT" 2
	#
	# Actual backup
	#
	[ "$PREV_SNAPSHOT" = "$NEW_SNAPSHOT" ] && { echo "Old snapshot is too new. "; exit 1; }
	if [ "${PREV_SNAPSHOT_EXISTS}" = 0 ] ; then
		debug "Hardlinking ${PREV_SNAPSHOT} to ${NEW_SNAPSHOT}"
		cp -al --one-file-system ${PREV_SNAPSHOT} ${NEW_SNAPSHOT} 
		debug "Doing rsync -a --delete --one-file-system ${FS}/ ${NEW_SNAPSHOT}/"
		rsync -a --delete --one-file-system ${FS}/ ${NEW_SNAPSHOT}/
	else
		debug "No previous backups found. Copying over"
		debug "Doing cp -a ${PREV_SNAPSHOT} ${NEW_SNAPSHOT}"
		mkdir -p ${NEW_SNAPSHOT}
		cp -a --one-file-system ${FS} ${NEW_SNAPSHOT}
	fi
	#
	debug "Backup of ${FS} finished"
}
# ------------------------------------------------------------

test_ls () {
	#
	# Test whether cp is GNU cp
	# 
	cp -l 2> /dev/null
	[ $? = 2 ] && { error_mail "I need to use a GNU cp command. Not Solaris one"; exit 10; }
}
test_dump_to () {
	local ERROR=/tmp/err.$(basename $0).$$
	cd ${DUMP_TO} 1> $ERROR 2> $ERROR || \
		error_mail "Can not cd to directory ${DUMP_TO} See errors in $ERROR"

}

# ********************************************************************************
# MAIN PART
#
test_ls
test_dump_to

#for FILESYSTEM in "/boot"
for FILESYSTEM in $DUMPLIST
do
	snapshot_fs   	${FILESYSTEM}
	clear_snapshots ${FILESYSTEM}
done

exit 0




List of attached files
  name desc uploaded size >
1 : 17 icon rsync_home Скрипт Wed 18 of Jan, 2006 [01:52 UTC] by dmytro 5.48 Kb 151

This is Tiki v1.8.5 (CVS) -Polaris- © 2002–2004 by the Tiki community     Created by: dmytro last modification: Wednesday 18 of January, 2006 [01:53:33 UTC] by dmytro





дмитро ковальов