Skip to content

Instantly share code, notes, and snippets.

@lo48576
Last active October 7, 2015 12:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lo48576/3163282 to your computer and use it in GitHub Desktop.
Save lo48576/3163282 to your computer and use it in GitHub Desktop.
動作中のLinuxシステムの/が含まれるパーティションのバックアップ。
#!/bin/bash
# 動作中のLinuxシステムの/が含まれるパーティションのバックアップ。/data1/はシステムとは別のパーティション(可能なら別の物理メディア)にあるべき。
mnt_root="/mnt/root"
hostname="`hostname`"
get_mnt_backup() {
echo "/data1/backup/${1}/root"
}
usage() {
echo "usage:`basename "$0"` backup"
echo " back up / to `get_mnt_backup "${hostname}"`/backup0"
echo " `basename "$0"` restore <hostname> <dst_path>"
echo " restore most recent backup to <dst_path>"
echo " `basename "$0"` archive <date> <backup_num>"
echo " make archive of backup <backup_num>"
}
complete_func() {
# beep -f 784 -n -f 1000 -n -f 1568
echo "done."
}
backup_exec() {
mnt_backup="`get_mnt_backup "${hostname}"`"
echo "backup mode"
echo "hostname: ${hostname}"
echo "dest: ${mnt_backup}/backup0"
mount -o bind / "$mnt_root"
rm -rf "${mnt_backup}/backup4"
echo "rm done."
mv "${mnt_backup}/backup3" "${mnt_backup}/backup4"
mv "${mnt_backup}/backup2" "${mnt_backup}/backup3"
mv "${mnt_backup}/backup1" "${mnt_backup}/backup2"
mv "${mnt_backup}/backup0" "${mnt_backup}/backup1"
echo "mv done."
# rsync -a --delete --exclude='/tmp/**' --exclude='/var/tmp/portage/**' --exclude='/usr/portage/packages/**' --exclude="/var/backups" --exclude="/user_tmp" --link-dest="${mnt_backup}/backup1" "${mnt_root}/" "${mnt_backup}/backup0/"
rsync -a --delete --link-dest="${mnt_backup}/backup1" --exclude='/var/tmp/portage/**' --exclude='/usr/portage/packages/**' --exclude="/var/backups" "/bin" "/boot" "${mnt_root}/dev" "/etc" "${mnt_root}/home" "/lib" "/lib32" "/lib64" "${mnt_root}/media" "${mnt_root}/mnt" "/opt" "${mnt_root}/proc" "/root" "${mnt_root}/run" "/sbin" "${mnt_root}/sys" "/usr" "/var" "${mnt_backup}/backup0/"
echo "rsync done."
umount -l "$mnt_root"
complete_func
}
backup_restore() {
hostname="$1"
src_backup="`get_mnt_backup "${hostname}"`/backup0"
dst_root="$2"
echo "restore mode"
echo "hostname: ${hostname}"
echo "source: ${src_backup}"
echo "dest: ${dst_root}"
countdown_5s
sudo rsync -a --delete "${src_backup}/" "${dst_root}/"
complete_func
}
make_archive() {
DATE="$1"
NUM="${2:-0}"
mnt_backup="`get_mnt_backup "${hostname}"`"
ARCHIVE_BASENAME="backup_${hostname}_root_${DATE}"
ARCHIVE_DIR="/mars/backup/kaputnik-gentoo/${DATE}"
SRC_DIR="${mnt_backup}/backup${NUM}/"
cd "${SRC_DIR}"
mkdir "${ARCHIVE_DIR}"
echo "start..."
tar --use-compress-program=pbzip2 --exclude-from ../tar_backup_exclude -cvpf "${ARCHIVE_DIR}/${ARCHIVE_BASENAME}.tar.bz2" . | tee "${ARCHIVE_DIR}/${ARCHIVE_BASENAME}_filelist" | pbzip2 --stdout -9 >"${ARCHIVE_DIR}/${ARCHIVE_BASENAME}.bz2"
echo "done."
}
countdown_5s() {
echo -n "countdown: 5..." >&2
sleep 1
echo -n " 4..." >&2
sleep 1
echo -n " 3..." >&2
sleep 1
echo -n " 2..." >&2
sleep 1
echo -n " 1..." >&2
sleep 1
echo -n " start." >&2
}
echo "cmdline: $0 $@"
case ${1} in
backup|restore|archive)
;;
*)
usage
exit 0
;;
esac
UID_="`id -u`"
case ${UID_} in
0|999)
# super user
# 999: ubuntu live cd user
case ${1} in
backup)
backup_exec
;;
restore)
backup_restore "$2" "$3"
;;
archive)
make_archive "$2" "$3"
;;
esac
;;
*)
# not super user
# change to super user
echo "UID: ${UID_}"
exec sudo $0 "$@"
;;
esac
#!/bin/bash
# 動作中のLinuxシステムの/が含まれるパーティションのバックアップ。/saturnはシステムとは別の物理メディアのZFSファイルシステム。
mnt_root="/mnt/root"
hostname="`hostname`"
datetime="`date '+%Y%m%d-%H%M%S'`"
backup_subdir="root"
# rate_limit: [Kbps]
# 1250Kbps == 10MB/s
#rate_limit="--bwlimit=600"
rate_limit=""
get_backup_dest() {
echo "/saturn/backups/backup_${1}"
}
get_backup_dest_zfs() {
echo "saturn/backups/backup_${1}"
}
iecho() {
echo "$@"
} >&2
usage() {
echo "usage:`basename "$0"` backup [--snapshot]"
echo " back up / to `get_backup_dest "${hostname}"`/root ."
echo " `basename "$0"` restore <hostname> <dst_path>"
echo " restore most recent backup to <dst_path>."
#echo " `basename "$0"` archive <datetime> <backup_dir>"
echo " `basename "$0"` archive <datetime>"
echo " make archive of backup which was made on <datetime>."
}
complete_func() {
# beep -f 784 -n -f 1000 -n -f 1568
iecho "done."
}
backup_exec() {
option_snapshot="$1"
backup_dest="`get_backup_dest "${hostname}"`"
backup_dest_zfs="`get_backup_dest_zfs "${hostname}"`"
iecho "backup mode"
iecho "hostname: ${hostname}"
iecho "dest: ${backup_dest}/${backup_subdir}/"
iecho "snapshot: ${backup_dest_zfs}@${datetime}"
mount -o bind / "$mnt_root"
# change this line for your environment.
# #rsync -av --delete --exclude='/tmp/**' --exclude='/var/tmp/portage/**' --exclude='/usr/portage/packages/**' --exclude="/var/backups" --exclude="/user_tmp" --link-dest="${mnt_backup}/backup1" "${mnt_root}/" "${mnt_backup}/backup0/"
rsync -av --delete --inplace ${rate_limit} --exclude='/var/tmp/portage/**' --exclude='/usr/portage/packages/**' --exclude="/var/backups" --exclude="/var/cache/squid/**" "/bin" "/boot" "${mnt_root}/dev" "/etc" "${mnt_root}/home" "/lib" "/lib32" "/lib64" "${mnt_root}/media" "${mnt_root}/mnt" "/opt" "${mnt_root}/proc" "/root" "${mnt_root}/run" "/sbin" "${mnt_root}/sys" "/usr" "/var" "${backup_dest}/${backup_subdir}/"
iecho "rsync done."
# take a snapshot
if [ "x${option_snapshot}" == "x--snapshot" ] ; then
zfs snapshot "${backup_dest_zfs}@${datetime}"
iecho "zfs snapshot done."
fi
umount -l "$mnt_root"
complete_func
}
backup_restore() {
hostname="$1"
src_backup="`get_mnt_backup "${hostname}"`"
dst_root="$2"
iecho "restore mode"
iecho "hostname: ${hostname}"
iecho "source: ${src_backup}"
iecho "dest: ${dst_root}"
countdown_5s
sudo rsync -av ${rate_limit} --numeric-ids --delete "${src_backup}/" "${dst_root}/"
complete_func
}
make_archive() {
# FIXME
DATETIME_SPECIFIED="$1"
#NUM="${2:-0}"
mnt_backup="`get_mnt_backup "${hostname}"`"
ARCHIVE_BASENAME="backup_${hostname}_root_${DATETIME_SPECIFIED}"
ARCHIVE_DIR="/mars/backup/kaputnik-gentoo/${DATETIME_SPECIFIED}"
SRC_DIR="${mnt_backup}/backup${NUM}/"
cd "${SRC_DIR}"
mkdir "${ARCHIVE_DIR}"
iecho "start..."
tar --use-compress-program=pbzip2 --exclude-from ../tar_backup_exclude -cvpf "${ARCHIVE_DIR}/${ARCHIVE_BASENAME}.tar.bz2" . | tee "${ARCHIVE_DIR}/${ARCHIVE_BASENAME}_filelist" | pbzip2 --stdout -9 >"${ARCHIVE_DIR}/${ARCHIVE_BASENAME}.bz2"
iecho "done."
}
countdown_5s() {
echo -n "countdown: 5..."
sleep 1
echo -n " 4..."
sleep 1
echo -n " 3..."
sleep 1
echo -n " 2..."
sleep 1
echo -n " 1..."
sleep 1
echo " start."
} >&2
echo "cmdline: $0 $@"
case ${1} in
backup|restore|archive)
;;
*)
usage
exit 0
;;
esac
UID_="`id -u`"
case ${UID_} in
0|999)
# super user
# 999: ubuntu live cd user
case ${1} in
backup)
backup_exec "$2"
;;
restore)
backup_restore "$2" "$3"
;;
archive)
make_archive "$2" "$3"
;;
esac
;;
*)
# not super user
# change to super user
iecho "UID: ${UID_}"
exec sudo $0 "$@"
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment