2016年3月21日月曜日

システムバックアップその5

お次はバックアップが格納されるディレクトリの作成。
格納されるファイルは、大きく以下の種類になる。
  • アーカイブファイル本体(各種ファイルのアーカイブ)
  • バックアップ/リストアに用いるスクリプト
  • バックアップ/リストアに用いる設定ファイル
  • ディスク構成情報やLVM構成情報等の構成ファイル
これらを複数世代保持出来る必要がある。
今回は、以下のように設計した。
  • /backup/media
    • current
      • bin
        バックアップ/リストアスクリプト
      • etc
        バックアップ/リストア設定ファイル
      • config
        リストアに用いる構成情報ファイル
        • tune2fs
          ファイルシステムのパラメータ情報(取得はするけど参考情報)
        • blkid
          各ファイルシステムのblkidコマンドの結果(リストア時に使用)
      • archive
        バックアップファイル本体
      • snapshot
        バックアップ対象領域を一時的にマウントするマウントポイント
    • YYYYMMDDhhmmss
      過去のバックアップ
      • bin
      • etc
      • config
        • tune2fs
        • blkid
      • archive
      • snapshot
    • YYYYMMDDhhmmss
      ​過去のバックアップ
      • bin
      • etc
      • config
        • tune2fs
        • blkid
      • archive
      • snapshot
バックアップ処理の開始時に、currentディレクトリとその下のディレクトリを作成し、バックアップ処理が完了した時点で、currentディレクトリをその時の年月日時分秒(14桁)にリネームして保持する、という形だ。
ディレクトリ作成時に、既にcurrentディレクトリが存在している場合は、別途バックアップ処理が稼働中か、前回のバックアップ処理が失敗している可能性がある。
その場合はエラーとして処理を中断している。
 
また、binディレクトリとetcディレクトリは、バックアップ時に使用するディレクトリをそっくりそのままコピーしてしまうことを想定している。
 
以上のことを踏まえて、スクリプトを作成しよう。ファイル名は 0020_mkdir だ。
(前回と同様、sudo su - を実行して、rootユーザにスイッチしてから実行しよう。)
# cd
# cd backup/bin
# vi 0020_mkdir
--ファイルの中身はココから--
#!/bin/sh
 
BINDIR=`/usr/bin/dirname $0`
BINDIR=`/usr/bin/realpath ${BINDIR}`
ETCDIR=`/usr/bin/realpath ${BINDIR}/../etc`
 
. ${ETCDIR}/config
 
if [ -e ${BACKUPPOINT}/current ]
then
  exit 1
fi
/bin/mkdir ${BACKUPPOINT}/current
/bin/mkdir ${BACKUPPOINT}/current/archive
/bin/mkdir ${BACKUPPOINT}/current/config
/bin/mkdir ${BACKUPPOINT}/current/config/tune2fs
/bin/mkdir ${BACKUPPOINT}/current/config/blkid
/bin/mkdir ${BACKUPPOINT}/current/snapshot
/bin/cp -pr ${BINDIR} ${BACKUPPOINT}/current/
/bin/cp -pr ${ETCDIR} ${BACKUPPOINT}/current/

--ココまで--
ファイル内部で使用している変数は、前回と同じだ。そのため、特に解説はしない。
 
作成できたら、これまた前回と同様、実行パーミッションを付与しておこう。
# chmod +x 0020_mkdir
それではテストしてみよう。
テストは、前回作成した0010と組み合わせて行う。
# ./0010_mount
# ./0020_mkdir
# echo $?
(0と表示されるはず)
# ls /media/backup
# ls -R /media/backup/current
(作成されたディレクトリが表示される)
どうだろう、ちゃんと作成できているのが確認できただろうか?
 
では、既にcurrentディレクトリが存在する状態では?
# ./0020_mkdir
# echo $?
(1が表示されるかな?)
echo $? の結果が異なる(ゼロではない)ことが確認できただろうか?
一通り確認できたら、currentディレクトリを削除して、/media/backup はアンマウントしておこう。
# rm -rf /media/backup/current
# umount /media/backup
これで、ディレクトリ作成スクリプトは完成だ。
ここまでは簡単で、次回から少し難しくなる。頑張って進めよう。
 
というわけで今回は以上。
 
2016/03/23追記
スクリプト先頭の、${BINDIR}と${ETCDIR}を生成する部分のコマンドを、cdとpwdの組み合わせではなく、realpathコマンドに置き換えた。
こっちの方がソレっぽくてカッコイイ。(意味不明)

0 件のコメント:

コメントを投稿