次のページ 前のページ 目次へ

4. RAID をルートとしてマウントするための initrd の解説

これは RAID の復旧ツール(rescue tools) を含む `initrd' RAMディスクを 作るための手続きです.

本文書では特に RAID1 と RAID5 の実装について説明を行います.

4.1 セキュリティに関する注意事項

復旧用のファイルシステムはスタンドアロンで使用できます.RAID アレイの マウントに失敗した場合,復旧システムがマウントされて動作します. ですからセキュリティには十分注意してください!

4.2 カーネルと RAID ツールの構築

最初の作業は,パッチを当ててカーネルを再構築することと RAID 操作ツール に慣れることです.付録 E の Gadi 氏の RAID 停止パッチ を確認し,カー ネルに含めてください.設定を行ってから RAID デバイスをマウント,テスト します.詳細な手順は raidtools パッケージに含まれていますが,本文 書でも後で述べます.

4.3 initrd による復旧及び起動ファイルシステムの構築

私は復旧/起動用のファイルシステムと仕事用のマシンのファイルシステムを 構築する際に Slackware-3.4 ディストリビューションを使いました.で すが,どの Linux ディストリビューションでも問題ないと思います.異なる ディストリビューションを使う場合には,手順のうち Slackware に特化した 部分を確認し,必要に応じて修正してください.

筆者は loadlin を使ってカーネルイメージとRAMディスクを DOS パーティショ ンから起動していますが,これは,単に DOS の設定ソフトウェアを使う困っ たデバイスを使っているからです.LILO でもうまく動作しますし,RAID/起動 ファイルと lilo レコードだけを含む小さい Linux パーティションも使 用できます.

筆者は最初に Slackware の `setup' スクリプトを使って最小限のRAMディス クシステムを作り,次にこのRAMディスク上の素のSlackware に `linuxthreads' パッケージと `raidtools' を上書きインストールすることに しました.私は仕事用のマシンを構築するときにも全く同じ手続きを用 いました.ですから,復旧システムと仕事用システムはほぼ同じ構成になって います.

このインストールによって`裸の'システムができます(ファイルのコピーを保 存しておきましょう).このシステムへ

        /lib/modules/2.x.x......
        /etc .... with a modified fstab, mdtab, raidX.conf, raidboot.conf
        /etc/rc.d
        /dev/md*

を現在使っているシステムから上書きコピーし,現在あるいはこれから動作さ せようとしているシステムに合わせてカスタマイズします.

これにより,起動/復旧システムを現在動作している RAID デバイスをルート にマウントしたシステムと同じにできます.ライブラリ等のバージョンは常に 最新にできますが,少し小さいシステムになります.

4.4 ステップ・バイ・ステップの手順

ユーザ root のホームディレクトリ(/root)で以下のコマンドを実行します:

        cd /root
        mkdir raidboot
        cd raidboot

マウントポイントを作成します.

        mkdir mnt
        mkdir mnt2

ファイルシステムをインストールするのに十分な大きさのファイルを作ります. これは最終的な復旧ファイルシステムよりずっと大きくなります.16メガバイ トでは十分ではなかったので,私は24メガバイト使うことにしました.

        dd if=/dev/zero of=build bs=1024k count=24
ファイルを loop デバイスとし,ext2 ファイルシステムをこのファイル上に 作成します.

        losetup /dev/loop0 build
        mke2fs -v -m0 -L initrd /dev/loop0
        mount /dev/loop0 mnt

4.5 ディストリビューションのインストール (Slackware の場合のみ)

Slackware にしか通用しない話題なので,Slackware 以外のディストリビュー ションを使う場合には 次の章に進んでください.

現在は空のファイルシステムが作られてマウントされている状態です. ここで"setup"を実行します.

'target' には

        /root/raidboot/mnt

を指定します.`source'には通常のインストール元を適宜指定します.パッケー ジ選択は自由に行ってかまいませんが,`configure' は行わないでください

プロンプトのモードとしては `EXPERT' を選択します.

私はシステムの最小構成の `A', `AP', `N' に加え,使い慣れていてサイズも 小さいエディタ(vi, jed, joe)を選択しました.

lqqqqqqqq SELECTING PACKAGES FROM SERIES A (BASE LINUX SYSTEM) qqqqqqqqk
x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x
x x   [X] aaa_base  Basic filesystem, shell, and utils - REQUIRED    x x
x x   [X] bash      GNU bash-1.14.7 shell - REQUIRED                 x x
x x   [X] devs      Device files found in /dev - REQUIRED            x x
x x   [X] etc       System config files & utilities - REQUIRED       x x
x x   [X] shadow    Shadow password suite - REQUIRED                 x x
x x   [ ] ide       Linux 2.0.30 no SCSI (YOU NEED 1 KERNEL)         x x
x x   [ ] scsi      Linux 2.0.30 with SCSI (YOU NEED 1 KERNEL)       x x
x x   [ ] modules   Modular Linux device drivers                     x x
x x   [ ] scsimods  Loadable SCSI device drivers                     x x
x x   [X] hdsetup   Slackware setup scripts - REQUIRED               x x
x x   [ ] lilo      Boots Linux (not UMSDOS), DOS, OS/2, etc.        x x
x x   [ ] bsdlpr    BSD lpr - printer spooling system                x x
x x   [ ] loadlin   Boots Linux (UMSDOS too!) from MS-DOS            x x
x x   [ ] pnp       Plug'n'Play configuration tool                   x x
x x   [ ] umsprogs  Utilities needed to use the UMSDOS filesystem    x x
x x   [X] sysvinit  System V-like INIT programs - REQUIRED           x x
x x   [X] bin       GNU fileutils 3.12, elvis, etc. - REQUIRED       x x
x x   [X] ldso      Dynamic linker/loader - REQUIRED                 x x
x x   [ ] ibcs2     Runs SCO/SysVr4 binaries                         x x
x x   [X] less      A text pager utility - REQUIRED                  x x
x x   [ ] pcmcia    PCMCIA card services support                     x x
x x   [ ] getty     Getty_ps 2.0.7e - OPTIONAL                       x x
x x   [X] gzip      The GNU zip compression - REQUIRED               x x
x x   [X] ps        Displays process info - REQUIRED                 x x
x x   [X] aoutlibs  a.out shared libs - RECOMMENDED                  x x
x x   [X] elflibs   The ELF shared C libraries - REQUIRED            x x
x x   [X] util      Util-linux utilities - REQUIRED                  x x
x x   [ ] minicom   Serial transfer and modem comm package           x x
x x   [ ] cpio      The GNU cpio backup/archiving utility            x x
x x   [X] e2fsbn    Utilities for the ext2 file system               x x
x x   [X] find      GNU findutils 4.1                                x x
x x   [X] grep      GNU grep 2.0                                     x x
x x   [ ] kbd       Change keyboard mappings                         x x
x x   [X] gpm       Cut and paste text with your mouse               x x
x x   [X] sh_utils  GNU sh-utils 1.16 - REQUIRED                     x x
x x   [X] sysklogd  Logs system and kernel messages                  x x
x x   [X] tar       GNU tar 1.12 - REQUIRED                          x x
x x   [ ] tcsh      Extended C shell version 6.07                    x x
x x   [X] txtutils  GNU textutils-1.22 - REQUIRED                    x x
x x   [ ] zoneinfo  Configures your time zone                        x x
x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x
`AP' シリーズからは私の好きなエディタ `JOE' とコンパクトで便利なファイ ル操作ツールである `MC' だけを選択しました.ここは必要に応じてユーティ リティを選択してください.
lqqqqqqqqq SELECTING PACKAGES FROM SERIES AP (APPLICATIONS) qqqqqqqqqk
x x     [ ] ispell    The International version of ispell          x x
x x     [ ] jove      Jonathan's Own Version of Emacs text editor  x x
x x     [ ] manpgs    More man pages (online documentation)        x x
x x     [ ] diff      GNU diffutils                                x x
x x     [ ] sudo      Allow special users limited root access      x x
x x     [ ] ghostscr  GNU Ghostscript version 3.33                 x x
x x     [ ] gsfonts1  Ghostscript fonts (part one)                 x x
x x     [ ] gsfonts2  Ghostscript fonts (part two)                 x x
x x     [ ] gsfonts3  Ghostscript fonts (part three)               x x
x x     [ ] jed       JED programmer's editor                      x x
x x     [X] joe       joe text editor, version 2.8                 x x
x x     [ ] jpeg      JPEG image compression utilities             x x
x x     [ ] bc        GNU bc - arbitrary precision math language   x x
x x     [ ] workbone  a text-based audio CD player                 x x
x x     [X] mc        The Midnight Commander file manager          x x
x x     [ ] mt_st     mt ported from BSD - controls tape drive     x x
x x     [ ] groff     GNU troff document formatting system         x x
x x     [ ] quota     User disk quota utilities                    x x
x x     [ ] sc        The 'sc' spreadsheet                         x x
x x     [ ] texinfo   GNU texinfo documentation system             x x
x x     [ ] vim       Improved vi clone                            x x
x x     [ ] ash       A small /bin/sh type shell - 62K             x x
x x     [ ] zsh       Zsh - a custom *nix shell                    x x
x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x
`N' パッケージからは TCP/IP だけを入れました.これは必ずしも必要ではあ りませんが,非常に便利ですし,ルートに RAID アレイがマウントされていな い状態で復旧や更新の作業を行う際にネットワークにアクセスできるようにな ります.TCP/IP には `A' に含まれるアプリケーションのいくつかが使用する `biff' も含んでいます.`N' をインストールしなかったとしても,biff パッ ケージは入れたくなると思います.
lqqqq SELECTING PACKAGES FROM SERIES N (NETWORK/NEWS/MAIL/UUCP) qqqqqk
x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x
x x    [ ] apache    Apache WWW (HTTP) server                      x x
x x    [ ] procmail  Mail delivery/filtering utility               x x
x x    [ ] dip       Handles SLIP/CSLIP connections                x x
x x    [ ] ppp       Point-to-point protocol                       x x
x x    [ ] mailx     The mailx mailer                              x x
x x    [X] tcpip     TCP/IP networking programs                    x x
x x    [ ] bind      Berkeley Internet Name Domain server          x x
x x    [ ] rdist     Remote file distribution utility              x x
x x    [ ] lynx      Text-based World Wide Web browser             x x
x x    [ ] uucp      Taylor UUCP 1.06.1 with HDB && Taylor configs x x
x x    [ ] elm       Menu-driven user mail program                 x x
x x    [ ] pine      Pine menu-driven mail program                 x x
x x    [ ] sendmail  The sendmail mail transport agent             x x
x x    [ ] metamail  Metamail multimedia mail extensions           x x
x x    [ ] smailcfg  Extra configuration files for sendmail        x x
x x    [ ] cnews     Spools and transmits Usenet news              x x
x x    [ ] inn       InterNetNews news transport system            x x
x x    [ ] tin       The 'tin' news reader (local or NNTP)         x x
x x    [ ] trn       'trn' for /var/spool/news                     x x
x x    [ ] trn-nntp  'trn' for NNTP (install 1 'trn' maximum)      x x
x x    [ ] nn-spool  'nn' for /var/spool/news                      x x
x x    [ ] nn-nntp   'nn' for NNTP (install 1 'nn' maximum)        x x
x x    [ ] netpipes  Network pipe utilities                        x x
x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x
インストールが終了したら,それ以外の項目には全て `no' と答え(全ての設 定項目に `no' と答える),スクリプトを終了します.

4.6 Linux pthreads のインストール

次に`linuxthreads-0.71' ライブラリをインストールしなければなりません. ここでは手作業によるインストールを詳しく説明する代わりに,linuxthreads の Makefile に対する差分パッチを示します.元の Makefile を保存してから diff コマンドでパッチを当て,そして make を行います.

        cd /usr/src/linuxthreads-0.71
  patch
        make
        make install
-------------------diff Makefile.old  Makefile.raid-----------------
2a3,13
> # If you are building "linuxthreads" for installation on a mount
> # point which is not the "root" partition, redefine 'BUILDIR' to
> # the mount point to use as the "root" directory
> # You may wish to do this if you are building an 'initial ram disk'
> # such as used with bootable root raid devices.
> # REQUIRES ldconfig version 1.9.5 or better
> # do ldconfig -v to check
> #
> BUILDIR=/root/raidboot/mnt
> #BUILDIR=
> 
81,82c92,93
<       install pthread.h $(INCLUDEDIR)/pthread.h
<       install semaphore.h $(INCLUDEDIR)/semaphore.h
---
>       install pthread.h $(BUILDIR)$(INCLUDEDIR)/pthread.h
>       install semaphore.h $(BUILDIR)$(INCLUDEDIR)/semaphore.h
84c95
<       test -f /usr/include/sched.h || install sched.h $(INCLUDEDIR)/sched.h
---
>       test -f $(BUILDIR)/usr/include/sched.h || install sched.h $(BUILDIR)$(INCLUDEDIR)/sched.h
86,89c97,103
<       install $(LIB) $(LIBDIR)/$(LIB)
<       install $(SHLIB) $(SHAREDLIBDIR)/$(SHLIB)
<       rm -f $(LIBDIR)/$(SHLIB0)
<       ln -s $(SHAREDLIBDIR)/$(SHLIB) $(LIBDIR)/$(SHLIB0)
---
>       install $(LIB) $(BUILDIR)$(LIBDIR)/$(LIB)
>       install $(SHLIB) $(BUILDIR)$(SHAREDLIBDIR)/$(SHLIB)
>       rm -f $(BUILDIR)$(LIBDIR)/$(SHLIB0)
>       ln -s $(SHAREDLIBDIR)/$(SHLIB) $(BUILDIR)$(LIBDIR)/$(SHLIB0)
> ifneq ($(BUILDIR),)
>       ldconfig -r ${BUILDIR} -n $(SHAREDLIBDIR)
> else
91c105,106
<       cd man; $(MAKE) MANDIR=$(MANDIR) install
---
> endif
>       cd man; $(MAKE) MANDIR=$(BUILDIR)$(MANDIR) install

4.7 RAID ツールのインストール

インストールの次のステップは,RAID ツール raidtools-0.42 のインストー ルです.

RAMディスクのファイルを構築するディレクトリを Makefile に教えるために "configure" スクリプトを実行します.

  cd /usr/src/raidtools-0.42
  configure --sbindir=/root/raidboot/mnt/sbin --prefix=/root/raidboot/mnt/usr
  make
  make install
ここで注意すべき点があります.インストールに使う Makefile は正しくない ので,これを直すために次の作業を行います.これは将来のリリースでは修正 され,再リンクは必要無くなる予定です.

インストールエラーの修正
正しく操作するためには Makefile の `LINKS' で指定されているファイルの リンクを削除し,張り直さなければなりません.
        cd /root/raidboot/mnt/sbin
        ln -fs mdadd mdrun
        ln -fs mdadd mdstop

4.8 新しいファイルシステムからの不要なディレクトリとファイルの削除

以下のディレクトリとファイルをファイルシステムから削除します. (注意: 誤って現在稼働中のシステムのファイルを消さないように.) このリストを見てファイルを消すだけなら簡単ですが,私がこのリストをどう やって作ったのかも考えてください!

        cd /root/raidboot/mnt
        rm -r home/ftp/*
        rm -r lost+found
        rm -r usr/doc
        rm -r usr/info
        rm -r usr/local/man
        rm -r usr/man
        rm -r usr/openwin
        rm -r usr/share/locale
        rm -r usr/X*
        rm -r var/man
        rm -r var/log/packages
        rm -r var/log/setup
        rm -r var/log/disk_contents

4.9 /dev/mdx の作成

最後のステップは,現在のファイルシステムから復旧ファイルシステムに /dev/md* デバイスをただコピーすることです.これは mknod でも行うことが できるでしょう.

        cp -a /dev/md* /root/raidboot/mnt/dev

4.10 initrd のための裸のファイルシステム作成

これでカスタマイズでき,再利用も可能なまっさらなファイルシステムができ ました.一度カスタマイズすると,復旧ディスクに使うことができるこのファ イルシステムは壊れてしまい,修正するためにはRAIDツールが必要となります. これは次の章で説明する linuxrc ファイルを追加することによって,ブート してルートにマウントする RAID デバイスに使うこともできます.

initrd ファイルのために小さいデバイスへシステムをコピーします.16メガ バイトもあれば十分でしょう.

小さいファイルシステムを作り,これをマウントします.

        cd /root/raidboot
        dd if=/dev/zero of=bare.fs bs=1024k count=16
ファイルを loop デバイスとし,このファイル上に ext2 ファイルシステム構 築します.
        losetup /dev/loop1 bare.fs
        mke2fs -v -m0 -L initrd /dev/loop1
        mount /dev/loop1 mnt2
`build'ファイルシステムを`bare.fs'にコピーします.
        cp -a mnt/* mnt2
後の更新を容易にするため,カスタマイズの前に `bare.fs' システムを保存 します.`build' ファイルシステムはもう必要ありませんので,消しても構い ません.
        cd /root/raidboot
        umount mnt
        umount mnt2
        losetup -d /dev/loop0
        losetup -d /dev/loop1
        rm build
        cp bare.fs rescue
        gzip -9 bare.fs

起動/復旧用の initrd ファイルシステムの作成

次に,作業用のマシンからカーネルに適合するシステム依存のファイルをコピー するか,ターゲットのシステムに適合するように復旧ファイルシステムのファ イルを手で修正するかします.

        losetup /dev/loop0 rescue
        mount /dev/loop0 mnt
etc ディレクトリに *~ ファイルや,core, ログファイルが無いことを 確認します.次の2つのコマンドはいくつかウォーニングを出しますが,無視 してください.
        cp -dp /etc/* mnt/etc
        cp -dp /etc/rc.d/* mnt/etc/rc.d

        mkdir  mnt/lib/modules
        cp -a  /lib/modules/2.x.x mnt/lib/modules <--- your current 2.x.x

復旧システムの修正

復旧システムの以下のファイルを修正します.ここで挙げるファイルの中には Slackware 特有のものもありますが,他のディストリビューションでも同等の ものがあるはずです.

        cd mnt

ネットワーク関係でないもの
        etc/fstab
        etc/mdtab       そのままで大丈夫でしょう
ネットワーク関係
        etc/hosts
        etc/resolv.conf 
        etc/hosts.equiv         及び関連ファイル
        etc/rc.d/rc.inet1       IPアドレス,ネットマスク,ゲイトウェイの設定を修正します
        etc/rc.d/rc.S           ファイルシステムのステータス関係の部分を全て削除します
                        # Test to see if the root partition is read-only
                の部分から
                        # remove /etc/mtab* so that mount will .....
                を含まない部分までを削除します.
                                これは RAMディスクが読み書き可能でマウン
                                トされると出るうるさいウォーニングを出
                                ないようにします.
        etc/rc.d/rc.xxxxx       必要ならば他のファイルも.本文書で後述します
        root/.rhosts            もし存在すれば
        home/xxxx/xxxx          必要ならば他のファイルも

    警告:       この作業で passwd と shadow のファイルは復旧システムに
                コピーされてしまいます!これはセキュリティ上の理由で好
                ましくない場合もあるでしょう.
必要に応じて /dev/disk をマウントするためのディレクトリを作ります. これはシステムで一意に決まらなければなりません.これらはシステムを起動 するためのマウントポイント(起動パーティションと起動パーティションのバッ クアップ)になります.筆者のシステムは loadlin を利用して DOS から 起動するようになっていますが,Linux パーティションや LILO でもうまく動 作します.筆者のシステムでは以下のようになっています.
        cd /root/raidboot/mnt           <— initrd のルート
        mkdir dosa                      DOS パーティションのマウントポイント
        mkdir dosb                      DOS のミラーのマウントポイント
復旧ファイルシステムはこれで出来上がりです!

復旧ファイルシステムのファイルを調べれば,まだ多くのファイルを消せる ことが分かると思います.この作業は複雑すぎることと,ほとんどの RAID シ ステムには十分なディスクとメモリがあることから,私はこれを行ってはいま せん.ファイルシステムをもっとスマートにしたければ,ご自分でやってくだ さい!

4.11 `initrd' で RAID デバイスから起動させる – linuxrc

復旧ディスクで RAID デバイスを起動するには,ただ次のスクリプトファイル

linuxrc

をデバイスのルートにコピーするだけです.

この linuxrc ファイルの動作についての話は 付録 G, linuxrc の動作についてで議論しま す.

もっと簡単で理解しやすい(動作もする) linuxrc は 付録 D にありますが,これは古い linuxrc と停止スクリプトで す.以下の部分を linuxrcとして作業ディレクトリにコピーしておきま しょう.

 -------------------- linuxrc ----------------------
#!/bin/sh
# ver 1.13 3-6-98
#
################# BEGIN 'linuxrc' ##################
#                DEFINE FUNCTIONS                  #
####################################################
# Define 'Fault' function in the event something 
# goes wrong during the execution of 'linuxrc'
#
FaultExit () {
# correct fstab to show '/dev/ram0' for rescue system
    /bin/cat /etc/fstab | {
    while read Line
    do  
        if [ -z "$( echo ${Line} | /usr/bin/grep md0 )" ]; then
            echo ${Line}
        else
            echo "/dev/ram0 / ext2 defaults 1 1"
        fi
    done
    } > /etc/tmp.$$
    /bin/mv /etc/tmp.$$ /etc/fstab
#       point root at /dev/ram0 (the rescue system)
        echo 0x100>/proc/sys/kernel/real-root-dev
        /bin/umount /proc
        exit
}

# Define 'Warning' procdure to print banner on boot terminal
#
Warning () {
    echo '*********************************'
    echo -e " $*"
    echo '*********************************'
}

# Define 'SplitKernelArg' to help extract 'Raid' related kernel arguments
SplitKernelArg () { eval $1='$( IFS=,; echo $2)' }

#Define 'SplitConfArgs' to help extract system configuration arguments
SplitConfArgs () {
    RaidBootType=$1
    RaidBootDevice=$2
    RaidConfigPath=$3
}
########################################################
################### MAIN linuxrc #######################
########################################################
# mount the proc file system
/bin/mount /proc

# Get the boot partition and configuration location from command line
CMDLINE=`/bin/cat /proc/cmdline`
for Parameter in $CMDLINE; do
    Parameter=$( IFS='='; echo ${Parameter} )
    case $Parameter in
        Raid*) SplitKernelArg $Parameter;;
    esac
done

# check for 'required raid boot'
if [ -z "${Raid_Conf}" ]; then
    Warning Kernel command line \'Raid_Conf\' missing
    FaultExit
fi
SplitConfArgs $Raid_Conf

# tmp mount the boot partition
/bin/mount -t ${RaidBootType} ${RaidBootDevice} /mnt

# get etc files from primary raid system
pushd /etc

# this will un-tar into 'etc' (see rc.6)
if [ ! -f /mnt/${RaidConfigPath}/raidboot.etc ]; then
# bad news, this file should be here
    Warning required file \'raidboot.etc\' \
    missing from ${RaidBootDevice}/${RaidConfigPath} \\n \
    \\tUsing rescue system defaults
else
    /bin/tar -xf /mnt/${RaidConfigPath}/raidboot.etc
fi
# get 'real' raidboot device for this boot
# status path, and name of raidX.conf
if [ ! -f /mnt/${RaidConfigPath}/raidboot.cfg ]; then
# bad news, this file should be here
    Warning required file 'raidboot.cfg' \
    missing from ${RaidBootDevice}/${RaidConfigPath}\\n \
    \\tUsing rescue system defaults
# Get the first raidX.conf file name in $RArg1
    RaidBootDevs=$RaidBootDevice
    RaidStatusPath=$RaidConfigPath
    for RaidConfigEtc in $( ls raid*.conf )
    do break; done
else
    {
    read RaidBootDevs
    read RaidStatusPath
    read RaidConfigEtc
    } < /mnt/${RaidConfigPath}/raidboot.cfg

fi
popd
/bin/umount /mnt

# Set a flag in case the raid status file is not found
#
RAIDOWN="raidboot.ro not found"
RAIDREF="raidgood.ref not found"
echo "Reading md0 shutdown status."

# search for raid shutdown status
for Device in ${RaidBootDevs}
do
#   these filesystem types should be in 'fstab' since
#   the partitions must be mounted for a clean raid shutdown
    /bin/mount ${Device} /mnt
    if [ -f /mnt/${RaidStatusPath}/raidboot.ro ]; then
        RAIDOWN=`/bin/cat /mnt/${RaidStatusPath}/raidboot.ro`
        RAIDREF=`/bin/cat /mnt/${RaidStatusPath}/raidgood.ref`
        /bin/umount /mnt
        break
    fi
    /bin/umount /mnt
done
# Test for a clean shutdown with array matching reference
if [ "${RAIDOWN}" != "${RAIDREF}" ]; then
    Warning shutdown ERROR ${RAIDOWN}
    FaultExit
fi

# The raid array is clean, remove shutdown status files
for Device in ${RaidBootDevs}
do
    /bin/mount ${Device} /mnt
    /bin/rm -f /mnt/${RaidStatusPath}/raidboot.ro
    /bin/umount /mnt
done

# Write a clean superblock on all raid devices

echo "write clean superblocks"
/sbin/mkraid -f --only-superblock /etc/${RaidConfigEtc}

# Activate raid array(s)
if [ -z "$Raid_ALT" ]; then
    /sbin/mdadd -ar
else
    /sbin/mdadd $Raid_ALT
fi

#  If there are errors - BAIL OUT and leave rescue running
if [ $? -ne 0 ]; then
   Warning some RAID device has errors
   FaultExit
fi

# Everything is fine, let the kernel mount /dev/md0
# tell the kernel to switch to /dev/md0 as the /root device
# The 0x900 value is the device number calculated by:
#  256*major_device_number + minor_device number
echo "/dev/md0 mounted on root"
echo 0x900>/proc/sys/kernel/real-root-dev
# umount /proc to deallocate initrd device ram space
/bin/umount /proc
exit
#------------------ end linuxrc ----------------------
`linuxrc' を initrd の起動デバイスに追加します.
        cd /root/raidboot
        chmod 777 linuxrc
        cp -p linuxrc mnt

4.12 シャットダウン用の rc スクリプトの修正

インストールの最後の手順は,シャットダウン時に md の状態を本当のルート デバイスに保存するさせるように rc スクリプトを修正することです.

Slackware の場合は,rc.0 から rc.6 です.Debian `bo' の場合は,これは 
`halt' 及び `reboot' になります.
もしこれ以外のディストリビューションで実行した場合は,この文書に追加す
るため,手順とサンプルファイルを筆者にメールで送ってください.
私はRAID 停止時の問題回避のための Bohumil Chalupa さんの方法を少し変 更したものを使っています.彼の示した元の方法は 付録Aで述べます.

私の仕事用システムには md0 以外の Linux パーティションは残ってい ないので,raidOK readonly のステータスを保存するために起動パーティ ションを使っています.筆者はシャットダウン時に md アレイのステータスを 含む起動パーティションとその複製の両方へファイルを書き込み,md デバイ スがリードオンリーで再マウントされたことを記録することにしました.これ はハードディスクのどれかが壊れたときの障害対策となります.

シャットダウンスクリプトは修正され, rc.raidown という名前になります.これは,正しく再起動して, RAID デバイスをマウントするために必要な情報を保存するためのものです. 各ディストリビューション用のシャットダウンスクリプトの例は 付録 Bで紹介します.

RAID アレイのシャットダウン時ののステータスを得るために,全ての case 文(もしあれば)の後で,かつ,実際のシャットダウン(kill, 状態 保存等)とファイルシステムのアンマウントの前の部分において rc.raidownを呼び出します.

############ Save raid boot and status info ##############
#
  if [ -x /etc/rc.d/rc.raidown ]; then
    /etc/rc.d/rc.raidown
  fi
################## end raid boot #########################
全てのファイルシステムがアンマウントされた後(ルートファイルシステムは アンマウント「されません」)かつ,電源断のステータスチェックの前に次の コマンドを入れます.
################ for raid arrays #########################
# Stop all known raid arrays (except root which won't stop)
  if [ -x /sbin/mdstop ]; then
    echo "Stopping raid"
    /sbin/mdstop -a
  fi
##########################################################
これによりルート以外の全ての RAID デバイスを安全に停止させることができ ます.ルートのステータスは raidstat.ro に記録され,次回の起動時に 参照されます.

rc ファイルを新しい RAID アレイ,まだ /root/raidboot/mnt に マウントされている復旧ファイルシステム,(もし同じマシンならば) 作業用システムのそれぞれにコピーします.

必要に応じて復旧ファイルシステムのetc/fstabの修正と,復旧ファ イルシステムの mdtab が正しいかどうかのチェックを行います.

さて,復旧ディスクを DOS パーティションにコピーすれば,RAID デバイスを ルートファイルシステムとしてシステムを起動する準備は終わりです.

        umount mnt
        losetup -d /dev/loop0
        gzip -9 rescue
起動パーティションに rescue.gz をコピーします.

残る作業は,設定ファイル raidboot.conf を作り,システムを再起動し て新しいファイルシステムをテストすることだけです.

4.13 Configuring RAIDBOOT - raidboot.conf

設定例の後のコメントは,設定ファイルの最初の3行のそれぞれについての説 明です.例は 4 ドライブの SCSI RAID5 アレイで,起動パーティションを sda1 と sdb1 ドライブに複製している場合のものです.実際に使用する場合 には,この代わりにファイルシステムに応じたパラメータを設定してください.

  /dev/sda1 /dev/sdb1
  linux
  raid5.conf
# コメントは3つの設定行の「後」にのみ記述することができます.
#
# このファイルは 'raidboot.conf' です.
#
# 1行目, 'initrd' RAID-復旧システムのあるパーティション
#       これらのパーティションから起動する必要はありませんが,復旧シス
#       テムはフロッピーディスクには入らないでしょうから,復旧システム
#       をどのパーティションからロードするのかわからなければなりません.
#
# 2行目, raidboot の設定情報へのパス
#       シャットダウン時のステータス等が起動時にどこにあるのか示します.
#       これはマウントポイントの情報は含まず,'パス'
#       /マウントポイント/'パス'のみを含みます.
#
# 3行目, RAID 設定ファイルのファイル名
#       現在の RAID 設定ファイルですから,つまり raid1.conf,
#       raid5.conf になります.

4.14 復旧,RAID システムの 'loadlin と LILO' のカーネルパラメータ指定

復旧とRAIDの2つのカーネルパラメータがありますが,指定する必要があるの は前者のみです.

いずれのパラメータも LILO や loadlin の起動パラメータファイルか, loadlin のカーネルコマンドラインで指定できます.しかし,コマンドライン で指定する場合には,行の最大の長さ(128文字)を越えないように注意してく ださい.

LILO で起動する場合には,LILO の設定ファイルへの記述は次のように なります.

append="Raid_Conf=msdos,/dev/sda1,raidboot"
append="Raid_ALT=-r,-p5,/dev/md0,/dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3"
より詳しくはman lilo.confを参照してください.

筆者は DOS の設定ユーティリティを必要とするハードウェアを持っているの で,システムに小さな DOS パーティションを作っています.したがって, 対になるディスク上にミラー(コピー)を持つ RAID5 システムを起動するのに loadlin を使っています.同じ方法を RAID1 システムでも使っています.以 下の例では loadlin を使っていますが,やり方は LILO とよく似ています.

必要に応じて loadlin の起動パラメータを編集したり,テスト中にスワップ ディスク上で Linux システムを起動できるように,DOS にルートを持つシス テムには小さいエディタを入れています.

DOS システムには Linux のために以下のようなファイルを持っています.

        c:\raidboot.bat
        c:\raidboot\loadlin.exe
        c:\raidboot\zimage
        c:\raidboot\rescue.gz
        c:\raidboot\raidboot.cfg
        c:\raidboot\raidboot.etc
        c:\raidboot\raidgood.ref
        c:\raidboot\raidstat.ro (only at shutdown)
linux.bat の内容は以下です.
---------------------- linux.bat ---------------------------
echo "Start the LOADLIN process:"
c:\raidboot\loadlin @c:\raidboot\boot.par
-------------------- end linux.bat -------------------------
boot.par の内容は以下です.
        # loadlin boot parameter file
        #
        # version 1.02 3-6-98

        # linux kernel image
        c:\linux\zimage

        # target root device
        root=/dev/md0
        #root=/dev/ram0
        #root=/dev/sdc5

        # mount root device as 'ro'
        ro

        # size of ram disk
        ramdisk_size=16384

        # initrd file name
        initrd=c:\raidboot\rescue.gz
        #noinitrd

        # memory ends here
        mem=131072k

        # points to raid boot device, configuration file
        # for floppy rescue boot, you may want to specify 
        # this on the command line instead of here
        # format 'filesystem-type,device,path-to-config-frm_mntpnt'
        Raid_Conf=msdos,/dev/sda1,raidboot

        # Alternate mdadd parameters
        # necessary when boot with non-redundant raid
        # otherwise, COMMENT OUT OR SPECIFY 'NULL'
        #Raid_ALT=-r,-p5,/dev/md0,/dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3

        # ethernet devices
        ether=10,0x300,eth0
***** >> 注意!! 復旧システムの起動と,RAID デバイスのマウントの場合で
            は,loadlin のパラメータが

                root=/dev/ram0          for the rescue system
                root=/dev/md0           for RAID

            のように異なるだけです.root=/dev/ram0 を指定すると,RAID 
            デバイスはマウントされず,必ず復旧システムが起動されます.
RAID アレイの認識に失敗すると,復旧システムはマウントされ,動作します.


次のページ 前のページ 目次へ