2016年3月20日日曜日

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

さて、ようやくバックアップ本体の方の話に。
その前に、ファイルの構成を考えないといけない。
ファイル構成は大きく…
  • スクリプト本体
    • バックアップスクリプト
    • リストアスクリプト
  • 設定ファイル
    • バックアップ/リストア全体に関わる設定
    • 個々の領域(ファイルシステム領域)に関する設定
に分けられる。
設定ファイルとスクリプトが同じディレクトリに配置されると、結構ごちゃごちゃしてメンテナンスしにくくなるため、ディレクトリを分ける。
Unix系OSの流儀に従うのならば、スクリプト本体は実行形式のファイルのため bin ディレクトリに、設定ファイルは etc ディレクトリに配置される。
今回は、rootのホームディレクトリ(/root)に、backupというディレクトリを作成し、その下に bin と etc の両ディレクトリを作成することにする。
とその前に、今後はrootでの作業が多く発生するので、都度sudoでroot権限を借り受けるよりは、rootにスイッチしておこう。
$ sudo su -
(ここで聞かれるパスワードはrootのパスワードではなく、自分自身のアカウントのパスワードだ)
rootにスイッチ出来たら、ディレクトリを作成していこう。
# cd
# mkdir backup
# mkdir backup/bin
# mkdir backup/etc
# ls -l backup
合計 8
drwxr-xr-x 2 root root 4096  3月 14 23:03 bin
drwxr-xr-x 3 root root 4096  3月 10 22:37 etc
また、個々のファイルシステムに関する設定は、同じような内容のファイルを各領域毎に作成することになるため、それは etc の下に別のディレクトリを用意して、そちらに配置するようにしよう。(今回は、fsconfig というディレクトリにした)
# mkdir backup/etc/fsconfig
ではスクリプトと設定ファイルを作っていこう。
スクリプトは、大きなファイルを作るのではなく、小さな単位で作成して、それを組み合わせて行く方が、品質も高く、作るのもテストするのも楽だ。これはスクリプトに限った話ではなく、コンパイル言語でも同様だ。
そのため、小さな単位で作っていく。
ただ、スクリプトの数が増えるのも管理がしにくくなるので、スクリプトファイル名はその機能を表す名前にする。
また、呼び出す順番を把握しやすくしたいため、ファイル名の先頭に、4桁の数字をつける。
これは、あくまで自分の好みのやり方だ。
スクリプト数が全体でいくつぐらいになるのか、最初のうちはまったくわからない。ま、100や200なんて数にはならないはずだ。
とは言え、作っていく過程で、「3番と4番の間に、もう一つ別のスクリプト差し込みたい」という要求も出てくるはずなので、ファイル名のナンバリングは10置きにしている。
というわけで一つ目。
一つ目は、バックアップ用領域のマウントだ。
以下の手順で作成しよう。
# cd backup/bin
# vi 0010_mount
--ファイルの中身はココから--
#!/bin/sh
 
BINDIR=`/usr/bin/dirname $0`
BINDIR=`/usr/bin/realpath ${BINDIR}`
ETCDIR=`/usr/bin/realpath ${BINDIR}/../etc`
 
. ${ETCDIR}/config
 
/bin/mountpoint -q ${BACKUPPOINT}
RET=$?
 
if [ ${RET} -ne 0 ]
then
  /bin/mount ${BACKUPPOINT}
else
  /bin/mount -o remount,rw ${BACKUPPOINT}
fi

--ココまで--
作成し終わったら、実行パーミッションを付与しておこう
# chmod +x 0010_mount
このスクリプトには、3つの変数が出てくる。
3つというのは${BINDIR}、${ETCDIR}と${BACKUPPOINT}だ。
  • ${BINDIR}
    スクリプト本体が格納されているディレクトリ。これはスクリプト自身で生成している。
  • ${ETCDIR}
    設定ファイルが入っているディレクトリ。${BINDIR}から想定して生成している。
  • ${BACKUPPOINT}
    こちらがスクリプト内部では生成していない変数だ。
    これは、バックアップ領域がマウントされるマウントポイント(これまでの記述で、/media/backupにマウントされる前提だ)で、利用者の都合に合わせて変更できるように、設定ファイルに記載するようにした。
マウントポイントは、バックアップ/リストア全体に関わる内容なので、etcディレクトリ直下にある設定ファイル(ファイル名については今まで記載していなかったが、configという名前にした。安直すぎるけど。)に記載する形にしよう。
configファイルを以下の手順で作成する。(今は bin ディレクトリにいると思うので、相対パスで ../etc/config を編集する。)
# vi ../etc/config
--中身はこんな感じ--
#
# BACKUPPOINT:
# Mount point of the backup area.
# At the start of the backup process, it mounts the backup disk here.
# The /etc/fstab, that it should be specified with noauto option.
#
BACKUPPOINT=/media/backup
--中身ココまで--
書き上がったらテストしてみよう。
/media/backup がマウントされていない状態で実行してみる。
# mount | grep /media/backup
# ./0010_mount
# mount | grep /media/backup
(ズラズラとマウントされた情報が出てくるはず)
この時に、マウントされているオプションに rw という情報も含まれていることを確認しよう。(read / write モードってことね。)
では、既にマウントされているこの状態で、もう一度実行してみたらどうなるか?
# ./0010_mount
# mount | grep /media/backup
(マウント情報に変化はない、はず…)
次に、一旦アンマウントして、リードオンリーモードでマウントしておき、同じようにスクリプトを実行してみよう。
# umount /media/backup
# mount -o ro /media/backup
# mount | grep /media/backup
(先ほどは rw だったオプションが、ro になっているはず)
# ./0010_mount
# mount | grep /media/backup
(再び、rw モードでマウントされた)
何らかの理由で、バックアップ領域をマウントして確認することもあり、マウントしたままでバックアップを実行してしまうこともあり得るので、そういった自体を想定した作りにしてある。
 
これでファイルシステムのマウント部分は完成だ。アンマウントしておこう。
# umount /media/backup
また、作業が終わったら、root権限で不用意にコマンド実行をしないように、rootから抜けておこう。
# exit
次回は、バックアップ領域にデータ格納用ディレクトリや、構成情報格納用ディレクトリを作成する部分を作る。
 
というわけで、今回はココまで。
 
2016/03/23追記
スクリプトの先頭部分の、${BINDIR}変数、${ETCDIR}変数を生成する部分を、cdとpwdの組み合わせから、realpathコマンドを使うように変更。
こっちの方がカッコイイと思うから。

0 件のコメント:

コメントを投稿