転載・引用について

ユーザ用ツール

サイト用ツール


tweet:2014:0609_01

NetBSDとCentOSのBackupスクリプト

Backupを色々考えていたら、望むようなBackup取得手法が見当たらず、ついかっとなって作ってしまった。後悔はしていない。

Backupの前提

今回のBackup Scriptは、以下を前提にしている

  • Backup保存先は/nfs/bkup Confに記載できるようにした
  • システム全域のBackupは対象にしていない(出来なくはないけど、それならdumpとrestore使えばいい)
  • システム毎の差は設定ファイルで吸収する
  • あまり難しいことはしない
  • 出来るだけSystem標準のCommandだけでBackupが取れる
    • uname, cat, mv, gzip, grep, cut, tar, mysqldump を利用する
  • やっつけなので、あんまり頑張らない
  • 追加Packageはyumとpkgsrc「しか」考慮しない (将来、portsは対応するかも)

要するに、OSが入ったVMが立ち上げ、必要なpackage(pkgsrcやyum)を導入してしまえば、Backupからの書き戻しで概ねOKになるようにしたということ。 但し、Linux(CentOS)の場合、単純に/etc/を上書きしてよいかは、疑問が残る。

はまったこと

  • Configurationの読み込みの段階で、コマンドをPipeでつないで突っ込んだら、SubShell実行になって反映されなかった。
    • この事象の回避の為に、Tempolary Fileを作成せざるを得なかった。美しくない…
  • 外部コマンドを呼び出し過ぎ
    • やはり、shellは文字列操作が苦しい。awkやPerlを使えば…とは思うが、たいした量でもないので、これでいいことにする。
  • shellで数値演算する部分にちょっと Portability上の問題があるかも。
    • expr $var + n を使う手も考えたが、NetBSDの/bin/shやCentOS上のbashは $ ( ( expression ) ) 記法が使えるので、とりあえずこれで。

気に入らない点

  • awkなりperlなりを利用すれば、もっと無駄がなくなるはずだが…
    • システム標準で頑張ることにすると、awkはぎりぎり大丈夫だとは思うが、それもそれなりに怪しい
  • Configuration Fileがいい加減じゃね?
    • まぁ、エラーチェックはいい加減です。いちいちDirの存在とかの確認もしてないし。
    • 自分が使うんだから、このくらいでいいことにする。
  • FreeBSDとかは?
    • まぁ、対応は恐らく簡単なので、(unameとpackageのBackupの部分を追加するだけ)必要になったら。
  • PostgreSQLとかは?
    • そんなの、Script読めばどうすればいいか解るでしょ。
  • MySQLで、DB毎にBackupを取りたい
    • 対応が面倒。loopまわせばいいだけだけど、そのloop判断が….Configで指定する手も有るけど、ミスが増えそう
  • ConfigurationにPasswordを書かなければならない
    • これは悩ましいけど、まぁ、諦めるしか今のところ(自分で使える手段としての)解決策はないね。

ScriptとConfig File

言うまでもないことですが、一応。

このWikiに掲載されている全てのコンテンツの例に漏れず、本Scriptは無保証である。従って、本Scriptを利用したもしくは利用できないに関わらず、作者は一切の責を負わない。

bkup.sh
#! /bin/sh
# @(#) This script is my personal backup script.
#
# Personal Backup Script.
#
#	Written by seirios@seirios.org
#
#	Need bkup.conf.
#
#	***WARNING***
#	This script runs on NetBSD 6 or CentOS 6.
#
# $Id:$
#
 
echo "System backup start."
 
##### Prepare to run.
 
# DEBUGGING.
#DEBUG=1
# Under debugging, only show all command line. not execute
if [ "x"$DEBUG = "x" ]; then
	EVAL="eval"
else
	EVAL="echo"
fi
 
CONF=./bkup.conf
 
# Tempolary file.
CONFTMP=".conftmp"; [ -f $CONFTMP ] && rm -f $CONFTMP
BKDIR="./.bkdir";   [ -f $BKDIR ] && rm -f $BKDIR
BKMYSQL="MYSQL";    [ -f $BKMYSQL ] && rm -f $BKMYSQL
 
UNAME=`which uname`;         [ "x"$DEBUG != "x" ] && echo "uname     : $UNAME"
CAT=`which cat`;             [ "x"$DEBUG != "x" ] && echo "cat       : $CAT"
GREP=`which grep`;           [ "x"$DEBUG != "x" ] && echo "grep      : $GREP"
CUT=`which cut`;             [ "x"$DEBUG != "x" ] && echo "cut       : $CUT"
TAR=`which tar`;             [ "x"$DEBUG != "x" ] && echo "tar       : $TAR"
GZIP=`which gzip`;           [ "x"$DEBUG != "x" ] && echo "gzip      : $GZIP"
MV=`which mv`;               [ "x"$DEBUG != "x" ] && echo "mv        : $MV"
MYSQLDUMP=`which mysqldump`; [ "x"$DEBUG != "x" ] && echo "mysqldump : $MYSQLDUMP"
 
OSNAME=`$UNAME -s`;
 
ROTATE=""			# Log rotate generation.
MYSQL="0"			# Backup MySQL?
MYSQLPASS=""			# MySQL Password
 
##### Parse commandline argument.
 
[ $# -gt 1 ] && echo "Too match argument. exit." && exit
[ $# -eq 1 ] && CONF=${1}
[ ! -f $CONF ] && echo "Configuration file is not found. exit." && exit
                             [ "x"$DEBUG != "x" ] && echo "Conf      : $CONF"
 
##### Parse configuration file.
 
# ***WARNING***: while loop must runs current shell(not subshell), so runs exec.
$CAT $CONF | $GREP -v '^#' | $GREP -v '^$' > $CONFTMP
exec < $CONFTMP
while read line; do
	FLAG=`echo ${line} | $CUT -d " " -f 1`
 
	INIT=`echo ${line} | $CUT -b 1`
	if [ $INIT = "[" ]; then
		[ $FLAG = "[CONF]" ]  && BLOCK="CONF"   && continue
		[ $FLAG = "[FILE]" ]  && BLOCK=$BKDIR   && continue
		[ $FLAG = "[MYSQL]" ] && BLOCK=$BKMYSQL && continue
		echo "Unknown BLOCK. Check Configuration." && exit
	fi
 
	[ x"$BLOCK" = "x" ] && echo "BLOCK is invalid. Check Configuration." && exit
 
	# Configuratin.
	if [ $BLOCK = "CONF" ]; then
		[ $FLAG = "LOGGEN" ]  && ROTATE=`echo ${line} | $CUT -d " " -f 2`
		[ $FLAG = "BKUPDIR" ] && BKUPDIR=`echo ${line} | $CUT -d " " -f 2` && \
			[ ! -d $BKUPDIR ] && echo "Backup Dir is not exist" && exit
	fi
 
	# File BLOCK
	[ $BLOCK = $BKDIR ] && [ $FLAG -eq 1 ] && \
		echo "`echo ${line} | $CUT -d " " -f 2`" >> $BLOCK
 
	# MySQL BLOCK
	[ $BLOCK = $BKMYSQL ] && [ $FLAG -eq 1 ] && \
		MYSQL=1
		MYSQLPASS=`echo ${line} | $CUT -d " " -f 2`
done
 
[ "x"$DEBUG != "x" ] && \
	echo "OS name   : $OSNAME" &&		\
	echo "Log gen   : $ROTATE" &&		\
	echo "MySQL Bkup: $MYSQL" &&		\
	echo "MySQL Pass: $MYSQLPASS" &&	\
	echo "Target Dir: see $BKDIR";
 
##### Rotate Backup File
[ "x"$DEBUG != "x" ] && echo "===== Rotate Backup ====="
ROTATE=$(( $ROTATE - 1 ))
while (true); do
	ROTATEFROM=$(( $ROTATE - 1 ))
	[ -f $BKUPDIR/bkup.tgz.$ROTATEFROM ] && \
		$EVAL "$MV $BKUPDIR/bkup.tgz.$ROTATEFROM $BKUPDIR/bkup.tgz.$ROTATE"
	[ -f $BKUPDIR/pkg.txt.$ROTATEFROM ] && \
		$EVAL "$MV $BKUPDIR/pkg.txt.$ROTATEFROM $BKUPDIR/pkg.txt.$ROTATE"
	[ -f $BKUPDIR/mysqldump.sql.gz.$ROTATEFROM ] && \
		$EVAL "$MV $BKUPDIR/mysqldump.sql.gz.$ROTATEFROM $BKUPDIR/mysqldump.sql.gz.$ROTATE"
	ROTATE=$ROTATEFROM
	[ $ROTATE -lt 2 ] && break
done
[ -f $BKUPDIR/bkup.tgz ] && \
	$EVAL "$MV $BKUPDIR/bkup.tgz $BKUPDIR/bkup.tgz.1"
[ -f $BKUPDIR/pkg.txt ] && \
	$EVAL "$MV $BKUPDIR/pkg.txt $BKUPDIR/pkg.txt.1"
[ -f $BKUPDIR/mysqldump.sql.gz ] && \
	$EVAL "$MV $BKUPDIR/mysqldump.sql.gz $BKUPDIR/mysqldump.sql.gz.1"
 
##### File backup
[ "x"$DEBUG != "x" ] && echo "===== File Backup ====="
$EVAL "$TAR -cz -T $BKDIR -f $BKUPDIR/bkup.tgz"
 
##### Installed package list
[ "x"$DEBUG != "x" ] && echo "===== Get package List ====="
[ $OSNAME = "NetBSD" ] && $EVAL "/usr/sbin/pkg_info -a > $BKUPDIR/pkg.txt"
[ $OSNAME = "Linux" ]  && $EVAL "/usr/bin/yum list installed > $BKUPDIR/pkg.txt"
 
##### MySQL backup.
[ "x"$DEBUG != "x" ] && echo "===== MySQL Backup ====="
if [ $MYSQL != "0" -a "x"$MYSQLDUMP != "x" -a "x"MYSQLPASS != "x" ]; then
	$EVAL "$MYSQLDUMP -u root -A -a -e --password=\"$MYSQLPASS\" | $GZIP -9c > $BKUPDIR/mysqldump.sql.gz"
fi
 
##### Cleanup
[ "x"$DEBUG != "x" ] && [ -f $CONFTMP ] && rm -f $CONFTMP
[ "x"$DEBUG != "x" ] && [ -f $BKDIR ]   && rm -f $BKDIR
[ "x"$DEBUG != "x" ] && [ -f $BKMYSQL ] && rm -f $BKMYSQL
 
echo "done."
bkup.conf
#
# System Backup Configuration File.
#	This is part of bkup.sh script.
#
#	Written by seirios@seirios.org
#
# Syntax
# flag [TAB]+ context
# flag: 1 = Target, 0 = Not target.

# System Configuration.
[CONF]
LOGGEN		7			# Not rotate if 0
BKUPDIR		/nfs/bup001/bkup	# Backup Storage

# File block: Context = target Dir or file
#
[FILE]
1	/etc
1	/usr/pkg/etc
1	/var
1	/home
0	/export/home

# MySQL Block: Context = MySQL connection password
# Must need MySQL Administrator(such as root) Password.
# *** WARNING ***
# Need MYSQL ADMINISTRATOR PASSWORD, not System root password.
#
[MYSQL]
0	MySQL_PASSWORD
このウェブサイトはクッキーを使用しています。 Webサイトを使用することで、あなたはあなたのコンピュータにクッキーを保存することに同意します。 また、あなたはあなたが私たちのプライバシーポリシーを読んで理解したことを認めます。 同意しない場合はウェブサイトを離れてください。クッキーに関する詳細情報
tweet/2014/0609_01.txt · 最終更新: 2018/05/14 13:43 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki