これは RAID の復旧ツール(rescue tools) を含む `initrd' RAMディスクを 作るための手続きです.
本文書では特に RAID1 と RAID5 の実装について説明を行います.
復旧用のファイルシステムはスタンドアロンで使用できます.RAID アレイの マウントに失敗した場合,復旧システムがマウントされて動作します. ですからセキュリティには十分注意してください!
最初の作業は,パッチを当ててカーネルを再構築することと RAID 操作ツール に慣れることです.付録 E の Gadi 氏の RAID 停止パッチ を確認し,カー ネルに含めてください.設定を行ってから RAID デバイスをマウント,テスト します.詳細な手順は raidtools パッケージに含まれていますが,本文 書でも後で述べます.
私は復旧/起動用のファイルシステムと仕事用のマシンのファイルシステムを 構築する際に 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 デバイスをルート にマウントしたシステムと同じにできます.ライブラリ等のバージョンは常に 最新にできますが,少し小さいシステムになります.
ユーザ 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
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' と答える),スクリプトを終了します.
次に`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
インストールの次のステップは,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
以下のディレクトリとファイルをファイルシステムから削除します. (注意: 誤って現在稼働中のシステムのファイルを消さないように.) このリストを見てファイルを消すだけなら簡単ですが,私がこのリストをどう やって作ったのかも考えてください!
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
最後のステップは,現在のファイルシステムから復旧ファイルシステムに /dev/md* デバイスをただコピーすることです.これは mknod でも行うことが できるでしょう.
cp -a /dev/md* /root/raidboot/mnt/dev
これでカスタマイズでき,再利用も可能なまっさらなファイルシステムができ ました.一度カスタマイズすると,復旧ディスクに使うことができるこのファ イルシステムは壊れてしまい,修正するためには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
次に,作業用のマシンからカーネルに適合するシステム依存のファイルをコピー するか,ターゲットのシステムに適合するように復旧ファイルシステムのファ イルを手で修正するかします.
losetup /dev/loop0 rescue mount /dev/loop0 mntetc ディレクトリに
*~
ファイルや,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 シ ステムには十分なディスクとメモリがあることから,私はこれを行ってはいま せん.ファイルシステムをもっとスマートにしたければ,ご自分でやってくだ さい!
復旧ディスクで 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
インストールの最後の手順は,シャットダウン時に 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 を作り,システムを再起動し て新しいファイルシステムをテストすることだけです.
設定例の後のコメントは,設定ファイルの最初の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 になります.
復旧とRAIDの2つのカーネルパラメータがありますが,指定する必要があるの は前者のみです.
このパラメータは RAID 起動デバイスと設定ファイルを指定します.フロッピー ディスクの復旧システムを起動する場合には,カーネルのコマンドライン, loadlin あるいは LILO の起動ファイルにこの記述をします.
書式: 'ファイルシステムの種類,デバイス,マウントポイントから設定ファイルへのパス'
mdadd のパラメータの代わりになります.冗長でない RAID アレイから起動す るときに必要となります.mdadd のコマンドラインパラメータをコンマ 区切りで記述します.破損した/非冗長アレイを動かす必要があるとき以外に は,コメントアウトするか'ヌル文字列'を指定します.
すなわち Raid_ALT= を指定します.
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 アレイの認識に失敗すると,復旧システムはマウントされ,動作します.