UNIXな生活
更新:2003/10/21  
Linuxな生活  FreeBSDな生活
 Solarisな生活
 JAVAな生活
 Practical use
 掲示版
CCDでソフトウェアミラー by FreeBSD 4.8 Release

FreeBSDでソフトウェアミラー構成を作成します。
今回は、ちと長丁場です。
ちなみにマシン構成は、以下の通り。

OS FreeBSD 4.8 Release
HD PrimaryIDE   Master=HD
                Slave=HD
   SeconderyIDE Master=CD-ROM
                Slave=HD

とりあえず、プライマリIDEには、同サイズのHDが搭載されているとします。また、セカンダリIDEのスレーブにもう一台HDをつけてあります。
こちらのHDでは、Dumpによるバックアップを実施します。
今後、各デバイスは以下の通り表記します。
PrimaryIDE   MasterHD=ad0
             SlaveHD=ad1
SeconderyIDE SlaveHD=ad3

*FreeBSDのCCDでは、"/"パーティションはミラー出来ません。とりあえずの逃げかたは記載してあります。

1.FreeBSDインストール時のパーティション構成。
まずはFreeBSDをインストールします。
ad0のパーティション構成は以下の通り。
/      150M
swap   800M
/usr  2400M
/home 4500M
/var  残りM

*Installはkernel-developerで!

2.ccdミラー用カーネルの作成
ccdを組み込んだカーネルを作成します。
#cd /usr/src/sys/i386/conf
#cp GENERIC CCDKERNEL


ここで、コピーしたCCDKERNELを編集します。
編集するのは以下の通り。

CPUを使用しているものにあわせます。
*いらないものをコメントアウト。
machine i386
#cpu   I386_CPU
#cpu   I486_CPU
#cpu   I586_CPU
cpu    I686_CPU


identの編集
#ident   GENERIC
ident   CCDKERNEL


CCDの組み込み
*最下行に以下を追加、(3=ミラーするスライス数)
pseudo-device ccd 3

カーネルファイルの配置
#/usr/sbin/config CCDKERNEL

コンパイルとインストール
#cd ../../compile/CCDKERNEL
#make depend
#make
#make install


新しいカーネルで立ち上げます。
#sync;sync;sync
#shutdown -r now


無事に立ち上がれば、カーネルの再構築は終了。
CCDの設定に移ります。

3.ccdの設定
無事に立ち上がれば、カーネルの再構築は終了。
CCDの設定に移ります。

CCDデバイスの作成
#cd /dev
#sh MAKEDEV ccd0
#sh MAKEDEV ccd1
#sh MAKEDEV ccd2



もう一度再起動、今度はsingleモードで、
#shutdown -r now

まずはad1のディスクにFreeBSD領域FDISKで作成します。
#/stand/sysinstall
Configure
Fdisk

で可能です。

ad0の内容をad1に複製します。
#dd if=/dev/rad0 of=/dev/rad1 bs=256b

ファイルシステムをマウントします。
/以外はad1をマウントしてください。
#mount /
#mount /dev/ad1s1e /usr
#mount /dev/ad1s1f /home
#mount /dev/ad1s1g /var



CCDの設定ファイルを作成。
/etc/ccd.confを作成、内容は以下の通り。この時点では、ad0をミラーなしで書く
ccd0  32  none  /dev/ad0s1e
ccd1  32  none  /dev/ad0s1f
ccd2  32  none  /dev/ad0s1g


設定を読み込ませます。
#ccdconfig -C

ccdデバイスにディスクラベルを書き込みます。
#disklabel ccd0 > /tmp/ccd0
#disklabel ccd1 > /tmp/ccd1
#disklabel ccd2 > /tmp/ccd2
#disklabel -Rr ccd0 /tmp/ccd0
#disklabel -Rr ccd1 /tmp/ccd1
#disklabel -Rr ccd2 /tmp/ccd2

 
newfsします
#newfs ccd0c
#newfs ccd1c
#newfs ccd2c


/etc/fstabの書き換え
ミラーする、/usr,/home/varをccdを使用するように書き換えます。
#/dev/ad0s1e  /usr    ufs   rw  2   2
#/dev/ad0s1f  /home   ufs   rw  2   2
#/dev/ad0s1g  /var    ufs   rw  2   2   
/dev/ccd0c    /usr    ufs   rw  2   2
/dev/ccd1c    /home   ufs   rw  2   2
/dev/ccd2c    /var    ufs   rw  2   2


ccdデバイスにデータをコピーします。

*/usrをコピー
#mount /dev/ccd0c /mnt
#cd /usr
#tar cf - . | (cd /mnt; tar xvf -)
#umount /mnt


*/homeをコピー
#mount /dev/ccd1c /mnt
#cd /home
#tar cf - . | (cd /mnt; tar xvf -)
#umount /mnt


*/varをコピー
#mount /dev/ccd2c /mnt
#cd /var
#tar cf - . | (cd /mnt; tar xvf -)
#umount /mnt


ミラー用ccd.confの作成。
今使っている/etc/ccd.confは片肺運転時に使用しますので、コピーしておきます。
#cp /etc/ccd.conf /etc/ccd.conf.single

で、/etc/ccd.confを編集します。
ccd0  32  6  /dev/ad0s1e  /dev/ad1s1e
ccd1  32  6  /dev/ad0s1f  /dev/ad1s1f
ccd2  32  6  /dev/ad0s1g  /dev/ad1s1g


これで一応設定は終了しました。
マシンをシングルユーザーモードで再起動します。
sync;sync;sync
shutdown -r now


起動したら、もう一回ディスク内容を複製しておきます。
#dd if=/dev/rad0 of=/dev/rad1 bs=256b

で、再起動、今度はマルチユーザーモードで、
ccdがうまくマウントできたらOK!
#sync;sync;sync
#shutdown -r now

*この状態で、ad0とad1のミラーは完成しました。
ソフトのインストール、ユーザーの追加などとりあえず使用する環境を構築します。


4.運用に対する注意点

まず、”/”はミラーしていないことに注意してください。
すなわち、/etcなどを書き換えると、もう一方のデスクには反映されません。
で、どうするか。
"/"に含まれるところを変更したら、シングルモードで立ち上げて、ddでもう一方のディスクに流し込みます。
#dd if=/dev/rad0s1a of=/dev/rad1s1a bs=256b


5.障害復旧手順
1.ad0(Masterディスク)が死んだら 
 A.ad1(Slave)をMasterに差し替えます。
    ジャンパースイッチの切り替えも忘れずに!
  B.シングルユーザーモードで立ち上げ。
  C./を書き込みできるようにマウント。
     #mount /
 D./etc/ccd.conf.singleを/etc/ccd.confとしてコピーします。
     *元のccd.confはリネームしてとっておいてください。
     #mv /etc/ccd.conf /etc/ccd.conf_back
     #cp /etc/ccd.conf.single /etc/ccd.conf

  E.再起動して、マルチユーザーで立ち上げ。
    #sync;sync;sync
     #shutdown -r now


2.ad1(Slaveディスク)が死んだら
  A.シングルユーザーモードで立ち上げ。
  B./を書き込みできるようにマウント。
     #mount /
 C./etc/ccd.conf.singleを/etc/ccd.confとしてコピーします。
     *元のccd.confはリネームしてとっておいてください。
     #mv /etc/ccd.conf /etc/ccd.conf_back
     #cp /etc/ccd.conf.single /etc/ccd.conf

   D.再起動して、マルチユーザーで立ち上げ。
     #sync;sync;sync
     #shutdown -r now


3.デスクの復旧方法。
 *少なくとも、ミラー元(ad0)よりミラー先(ad1)のディスクサイズは大きい物を使用してください。
 A.新しいディスクをad1(Slave)に取り付けます。
  B.シングルユーザーモードで立ち上げます。
  C.ad1のディスクにFreeBSD領域FDISKで作成します。
    #/stand/sysinstall
     Configure
     Fdisk

     で可能です。
 D.ddでディスク内容を流し込みます。
    #dd if=/dev/rad0 of=/dev/rad1 bs=256b
  E.ad0の/を書き込みできるようマウントします。
    #mount /
  F./etc/ccd.confをミラー用の物に置き換えます。
    #cp /etc/ccd.conf_back /etc/ccd.conf
  G.再起動します。
    #sync;sync;sync
    #shutdown -r now




6.dumpによるBackupとリストア

まずはdump
dumpはシングルモードで行うのがベストですが、稼働中にdumpしてもおそらく問題はないでしょう。
ちなみに、PostgreSQL,Apache,Tomcat環境では、正常に復旧出来ました。(保証はしません(^_^))

まず、ad3のデスクを使用できるようにします。
#/stand/sysinstallから
Configure
Fdisk

で、ad3をFreeBSDファイルシステム領域として確保します。

newfsします。
#newfs /dev/ad3c

マウントは以下のようにします。
#mount /dev/ad3c /mnt

/etc/fstabに記入
/dev/ad3c    /mnt    ufs   rw,noauto  2   2


スケジュールは以下の通り。
日曜日夜間にフルdump、その後は毎日、日曜日からの差分をdumpします。
dump先デバイスは、ad3です。
dump時の指定オプションは以下のお通り。
0=Full_dump(レベル0ダンプ)
4=0に対する差分を取る指示(レベル4ダンプ)
u=dump日時を/etc/dumpdatesに記録、差分dumpを使用する場合に必要
f=デバイスの指定。

*dumpコマンドの例
日曜夜間のFullDump
/      dump 0uf - /dev/rad0s1a > /mnt/root.dump
/usr   dump 0uf - /dev/rccd0c > /mnt/usr.dump
/home  dump 0uf - /dev/rccd1c > /mnt/home.dump
/var   dump 0uf - /dev/rccd2c > /mnt/var.dump
日曜夜間以外の差分Dump
/      dump 4uf - /dev/rad0s1a > /mnt/root.4.dump
/usr   dump 4uf - /dev/rccd0c  > /mnt/usr.4.dump
/home  dump 4uf - /dev/rccd1c  > /mnt/home.4.dump
/var   dump 4uf - /dev/rccd2c  > /mnt/var.4.dump

ちなみに、今回はCCDミラーされている物をdumpしますので、'/var','/home','/usr'はrccdデバイスよりdumpします。


dumpバックアップ用のスクリプトファイルの準備。
*ad3はdump時のみmountしています。また、CCDミラーではない状態でのバックアップスクリプトも'nonccd'として作成しておきます。

'backup0'ファイル
#!/bin/sh
/sbin/mount /mnt
/bin/sleep 3
/sbin/dump 0uf - /dev/rad0s1a > /mnt/root.dump
/bin/sleep 60
/sbin/dump 0uf - /dev/rccd0c > /mnt/usr.dump
/bin/sleep 600
/sbin/dump 0uf - /dev/rccd1c > /mnt/home.dump
/bin/sleep 600
/sbin/dump 0uf - /dev/rccd2c > /mnt/var.dump
/bin/sleep 60
/sbin/umount /mnt

'backup4'ファイル
#!/bin/sh
/sbin/mount /mnt
/bin/sleep 3
/sbin/dump 4uf - /dev/rad0s1a > /mnt/root.4.dump
/bin/sleep 60
/sbin/dump 4uf - /dev/rccd0c > /mnt/usr.4.dump
/bin/sleep 600
/sbin/dump 4uf - /dev/rccd1c > /mnt/home.4.dump
/bin/sleep 600
/sbin/dump 4uf - /dev/rccd2c > /mnt/var.4.dump
/bin/sleep 60
/sbin/umount /mnt

'backup0nonccd'ファイル
#!/bin/sh
/sbin/mount /mnt
/bin/sleep 3
/sbin/dump 0uf - /dev/rad0s1a > /mnt/root.dump
/bin/sleep 60
/sbin/dump 0uf - /dev/rad0s1e > /mnt/usr.dump
/bin/sleep 600
/sbin/dump 0uf - /dev/rad0s1f > /mnt/home.dump
/bin/sleep 600
/sbin/dump 0uf - /dev/rad0s1g > /mnt/var.dump
/bin/sleep 60
/sbin/umount /mnt

'backup4nonccd'ファイル
#!/bin/sh
/sbin/mount /mnt
/bin/sleep 3
/sbin/dump 4uf - /dev/rad0s1a > /mnt/root.4.dump
/bin/sleep 60
/sbin/dump 4uf - /dev/rad0s1e > /mnt/usr.4.dump
/bin/sleep 600
/sbin/dump 4uf - /dev/rad0s1f > /mnt/home.4.dump
/bin/sleep 600
/sbin/dump 4uf - /dev/rad0s1g > /mnt/var.4.dump
/bin/sleep 60
/sbin/umount /mnt


これを、/usr/local/binにコピーしておきます。当然ですが、実行権限を付加しておいてください。


次に、cronでスクリプトを実行するように設定します。
cronの設定はこのコマンドで。
#crontab -e
エディタが立ち上がるので、以下の内容で記入(ccd稼働時)
0  5  *  *  0 /usr/local/bin/backup0
0  5  *  *  1 /usr/local/bin/backup4
0  5  *  *  2 /usr/local/bin/backup4
0  5  *  *  3 /usr/local/bin/backup4
0  5  *  *  4 /usr/local/bin/backup4
0  5  *  *  5 /usr/local/bin/backup4
0  5  *  *  6 /usr/local/bin/backup4

更新内容を保存すると、cronが反映されます。

*tips1.圧縮したい場合は
   "/"の場合、
   ダンプ----dump 0uf - /dev/rad0s1a | gzip -9 > /mnt/root.dump.gz
   リストア--gzcat /mnt/root.dump.gz | restore rf -

*tips2.dump内容の確認
   #restore tf - < /mnt/usr.dump

*tips3."/"をrestoreしたファイルは、kernelが含まれています。
 これを削除するためには、以下のコマンドで行ってください。
  */home/rootにrestoreした場合。
  #cd /home/root
 #chflags noschg kernel
  #cd ../
  #rm -rf root


リストア
リストアは、比較的簡単です。
この手順は、ミラーされているad0,ad1が壊れ、ccd構成は取らず、単に新しいディスクをad0としてつなげた時の手順でです。
1.まず、もとと同じバージョンのFreeBSDをインストールします。
  この時、ダンプした時と同じパーティション構成にしてください。
  *容量は、依然よりも少なくとも大きくすることが必要です。

2.リストアするため、シングルモードで立ち上げます。

3.dumpファイルのある、ad3をmountします。
 #mount /dev/ad3c /mnt

4.”/”からリストアします。
  #mount /
  #cd /
 #restore rf - < /mnt/root.dump
  #restore rf - < /mnt/root.4.dump


5.続けて、/usr,/home,/varをリストアします。
  #mount /dev/ad0s1e /usr
  #cd /usr
 #restore rf - < /mnt/usr.dump
  #restore rf - < /mnt/usr.4.dump
  #mount /dev/ad0s1f /home
  #cd /home
  #restore rf - < /mnt/home.dump
  #resotre rf - < /mnt/home.4.dump
  #mount /dev/ad0s1g /var
  #cd /var
  #restore rf - < /mnt/var.dump
  #restore rf - < /mnt/var.4.dump


6./etc/fstabを書き換えます。
 ミラーするため、ccdを使用するようになっているので、通常のデバイスを使うようにする。
  /dev/ad0s1e  /usr    ufs   rw  2   2
  /dev/ad0s1f  /home   ufs   rw  2   2
  /dev/ad0s1g  /var    ufs   rw  2   2   
  #/dev/ccd0c    /usr    ufs   rw  2   2
  #/dev/ccd1c    /home   ufs   rw  2   2
  #/dev/ccd2c    /var    ufs   rw  2   2


7.再起動します。
 #sync;sync;sync
  #shutdown -r now


8.Backup用crontabを書き換えます。
  通常cronで仕込まれているバックアップはccd(ミラーデバイス)から行っています。
  で、これをccdを使わない用のスクリプトに変更します。
  cronの設定は以下の通り。
  #crontab -e
  エディタが起動するので、以下のように編集
  0  5  *  *  0 /usr/local/bin/backup0nonccd
 0  5  *  *  1 /usr/local/bin/backup4nonccd
 0  5  *  *  2 /usr/local/bin/backup4nonccd
 0  5  *  *  3 /usr/local/bin/backup4nonccd
 0  5  *  *  4 /usr/local/bin/backup4nonccd
 0  5  *  *  5 /usr/local/bin/backup4nonccd
 0  5  *  *  6 /usr/local/bin/backup4nonccd

  更新内容を保存すると、cronが反映されます。


*実は、もしあなたがApacheを使用しているなら、apacheのpidファイルが残っていて、再起動時にapacheが正常に起動しません。
 これは、apacheを起動したままdumpした弊害です。
 で、/usr/local/apache/logs/httpd.pidを削除して、Apacheのみ起動し直します。
 #rm /usr/local/apache/logs/httpd.pid
  #/usr/local/apache/bin/apachectl start



いやー、久しぶりに長編を作ってしまいました。
FreeBSDでのCCDミラーやdump,restorはシンプルでよくできており、見通しが良いのでおすすめです。
CCDでは、今自分がどのディスクでなにをしているのか、その都度整理しながら構築することをおすすめします。
いろいろディスクをいじくり回してますが、やってることは非常に単純です。
これで安上がりでいながら、一人前のサーバらしい環境が出来ました。
存分にご活用ください。


Producted by Tomoya Sakurai