2011年3月19日土曜日

dump & restore スクリプト紹介

先日のウェブサーバーで使用した dump & restore のスクリプトを紹介したいと思います。(この辺りの話題です。

スライス(windows や Linux のパーティションのようなもの)毎に同じ作業の繰り返しなので間違え防止を兼ねて以前からスクリプトを組んで使用していました。私もすでに若くはなく、同じ単純作業を正確に繰り替えして行う能力や気力が消失していますのでスクリプトを活用するのはとても大切なことだと思っています。

このスクリプトは無保証です。ハードディスクをフォーマットするコマンドも含まれていますので設定を間違えるともう後戻りができない状況にもなってしまいます。安易に使用すると大変痛い思いをすると思います。スクリプトの意味が解る人だけが使用してください。

まずこのスクリプトの前提です。
新しいハードディスクは /dev/sd6 と仮定しています。そしてパーティションは第一パーティションと仮定しています。これは事前にハードディスクを FreeBSD のシステム上で整備しておきます。通常の FreeBSD 標準インストールされた状態を仮定しています。なおハードディスクのデバイス名はスクリプトの冒頭部分の変数設定部分で変更することができます。このデバイス名はとても大切なものですので実際にコピー作業を行うマシンの上でコピーされるハードディスクとそのデータを受けるハードディスクを接続して確認をしておいてください。

使い方
シングルユーザーモードで起動させます。
そして /etc/fstab に記述されているデバイスをマウントさせます。
# mount -a
そしてこのスクリプトのあるディレクトリへ移動します。スクリプトの実行権限があることを確認します。以下のコマンドを実行させます。後は神様に祈りを捧げてください。一番容量の大きな /usr ( /dev/sd6s1f ) が最後にコピーされます。ここが一番時間が掛かります。800GB で12時間程度掛かりました。
# ./diskdump.sh


スクリプト紹介
ファイル名:diskdump.sh -- root:wheel 700



#! /bin/sh

drv="ad6"
label="s1"

cd /

# / dump & restore
echo "--------------/${drv}${label}a / drive dump & restoe---------------"
if [ -e "/dev/${drv}${label}a" ];
then
newfs /dev/${drv}${label}a
mount /dev/${drv}${label}a /mnt
dump 0af - / | ( cd /mnt ; restore rf - )
umount /mnt
else
echo "drive /${drv}${label}a error"
fi
wait

# /var dump & restore
echo "-------------------/${drv}${label}d /var drive dump & restoe--------------"
if [ -e "/dev/${drv}${label}d" ];
then
newfs -U /dev/${drv}${label}d
mount /dev/${drv}${label}d /mnt
dump 0af - /var | ( cd /mnt ; restore rf - )
umount /mnt
else
echo "drive /${drv}${label}d error"
fi
wait

# /usr dump & restore
echo "-------------------/${drv}${label}f /usr drive dump & restoe--------------"
if [ -e "/dev/${drv}${label}f" ];
then
newfs -U /dev/${drv}${label}f
mount /dev/${drv}${label}f /mnt
dump 0af - /usr | ( cd /mnt ; restore rf - )
umount /mnt
else
echo "drive /${drv}${label}f error"
fi
wait

# /tmp format
echo "-------------------/${drv}${label}e /tmp format---------------------------"
if [ -e "/dev/${drv}${label}e" ];
then
newfs -U /dev/${drv}${label}e
mount /dev/${drv}${label}e /mnt
chmod 1777 /mnt
umount /mnt
else
echo "drive /${drv}${label}e error"
fi



このスクリプトは見てのとおり通常仮想端末で打ち込むコマンドを単純に羅列したものです。これがスクリプトの基本的な形だと思っています。人間がいかに楽をするか?利便性の追求こそパソコンの真髄だと思っています。

if 文でスクリプトが分岐している部分がありますが、これはデバイスが存在するかどうかを確認しているだけです。スクリプトも使いつづけるといろいろと問題点が見えてきますのでその部分だけを少しずつ修正してスクリプトを成長させています。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。