From 0eefd2dd9a6e7bb7dbced82eed49cf97bf99ef29 Mon Sep 17 00:00:00 2001 From: gleblanc <> Date: Wed, 3 May 2000 22:08:14 +0000 Subject: [PATCH] Updated docs --- .../Qmail-VMailMgr-Courier-imap-HOWTO.sgml | 126 +- LDP/howto/linuxdoc/Root-RAID-HOWTO.sgml | 4774 +++++++++-------- 2 files changed, 2483 insertions(+), 2417 deletions(-) diff --git a/LDP/howto/linuxdoc/Qmail-VMailMgr-Courier-imap-HOWTO.sgml b/LDP/howto/linuxdoc/Qmail-VMailMgr-Courier-imap-HOWTO.sgml index 400c6131..2a672f40 100644 --- a/LDP/howto/linuxdoc/Qmail-VMailMgr-Courier-imap-HOWTO.sgml +++ b/LDP/howto/linuxdoc/Qmail-VMailMgr-Courier-imap-HOWTO.sgml @@ -1,6 +1,6 @@ - +
Qmail VMailMgr and Courier-Imap HOWTO @@ -9,14 +9,13 @@ Dan Kuykendall <dan@kuykendall.org> </author> <date> - v1.2, 19 April 2000 + v1.4, 23 April 2000 </date> <abstract> This document is about building a mail server that will support virtual domain hosting and provide smtp, pop3 and imap services, using a powerful alternative to sendmail. </abstract> - <toc> <sect>Introduction<label id="Introduction" > <p> @@ -134,8 +133,8 @@ get your email system up and running. Combinations that work for me are: <itemize> - <item> RedHat 6.2, Linux 2.2.14, Qmail 1.03+patches-12, VMailMgr 0.96.5, Courier-imap 0.31 - <item> Mandrake 7.0, Linux 2.2.13, Qmail 1.03+patches-12, VMailMgr 0.96.5, Courier-imap 0.31 + <item> RedHat 6.2, Linux 2.2.14, Qmail 1.03+patches-12, VMailMgr 0.96.6, Courier-imap 0.31 + <item> Mandrake 7.0, Linux 2.2.13, Qmail 1.03+patches-12, VMailMgr 0.96.6, Courier-imap 0.31 </itemize> <sect1>History<label id="History" > @@ -145,7 +144,7 @@ </p> <sect1>New versions <p> - The newest version of this can be found on my homepage <url url="http://www.clearrivertech.com/linux"> in its SGML source. + The newest version of this can be found on my homepage <url url="http://www.clearrivertech.com/linux/HOWTO"> as SGML source, as HTML and as TEXT. Other versions may be found in different formats at the LDP homepage <url url="http://www.linuxdoc.org/">. </p> <sect1>Comments @@ -195,34 +194,26 @@ <item>Built proper SGML version. </itemize> </p> -<sect1>Copyrights and Trademarks <p> - (c) 2000-2001 Dan Kuykendall -</p> -<p> - This manual may be reproduced in whole or in part, without fee, subject - to the following restrictions: + v1.4 (April 23, 2000) </p> <p> <itemize> - <item>The copyright notice above and this permission notice must be preserved - complete on all complete or partial copies - <item>Any translation or derived work must be approved by the author in writing - before distribution. - <item>If you distribute this work in part, instructions for obtaining the complete - version of this manual must be included, and a means for obtaining a complete - version provided. - <item>Small portions may be reproduced as illustrations for reviews or quotes - in other works without this permission notice if proper citation is given. + <item>Updated the Courier-IMAP setup information for new VMailMgr version. + <item>Switched the license to the GNU FDL. + <item>Other minor additions and corrections. </itemize> </p> +<sect1>Copyrights and Trademarks <p> - Exceptions to these rules may be granted for academic purposes: Write to - the author and ask. These restrictions are here to protect us as authors, not - to restrict you as learners and educators. Any source code (aside from the - SGML this document was written in) in this document is placed under the GNU - General Public License, available via anonymous FTP from - <url url="ftp://ftp.gnu.org/GNU/COPYING" name="the GNU archive">. + Copyright (c) Dan Kuykendall. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 + or any later version published by the Free Software Foundation +</p> +<p> + A copy of the license is available at + <url url="http://www.gnu.org/copyleft/fdl.txt" name="GNU Free Documentation License">. </p> <sect1>Acknowledgements and Thanks <p> @@ -252,7 +243,7 @@ <item> daemontools-0.70-1.src.rpm - <url url="http://em.ca/~bruceg/rpms/daemontools/"> <item> supervise-scripts-2.4-1.src.rpm - <url url="http://em.ca/~bruceg/supervise-scripts/"> <item> qmail-1.03+patches-12.src.rpm - <url url="http://em.ca/~bruceg/qmail+patches/"> - <item> vmailmgr-0.96.5-1.src.rpm - <url url="http://em.ca/~bruceg/vmailmgr/"> + <item> vmailmgr-0.96.6-1.src.rpm - <url url="http://em.ca/~bruceg/vmailmgr/"> <item> courier-imap-0.31.tar.gz - <url url="http://www.inter7.com/courierimap/"> </itemize> For Courier-imap you must build the source rpm from the tar @@ -273,7 +264,7 @@ <item> daemontools-0.70-1.i386.rpm - <url url="http://em.ca/~bruceg/rpms/daemontools/"> <item> supervise-scripts-2.4-1.i386.rpm - <url url="http://em.ca/~bruceg/supervise-scripts/"> <item> qmail-1.03+patches-12.src.rpm - <url url="http://em.ca/~bruceg/qmail+patches/"> - <item> vmailmgr-0.96.5-1.src.rpm - <url url="http://em.ca/~bruceg/vmailmgr/"> + <item> vmailmgr-0.96.6-1.src.rpm - <url url="http://em.ca/~bruceg/vmailmgr/"> <item> courier-imap-0.31.tar.gz - <url url="http://www.inter7.com/courierimap/"> </itemize> For Courier-imap you must build the binary rpm from the tar @@ -287,7 +278,7 @@ <item> daemontools-0.70.tar.gz - <url url="http://cr.yp.to/daemontools/daemontools-0.70.tar.gz"> <item> supervise-scripts-2.4.tar.gz - <url url="http://em.ca/~bruceg/supervise-scripts/"> <item> qmail-1.03.tar.gz - <url url="http://cr.yp.to/software/qmail-1.03.tar.gz"> (*) - <item> vmailmgr-0.96.5.tar.gz - <url url="http://em.ca/~bruceg/vmailmgr/"> + <item> vmailmgr-0.96.6.tar.gz - <url url="http://em.ca/~bruceg/vmailmgr/"> <item> courier-imap-0.31.tar.gz - <url url="http://www.inter7.com/courierimap/"> </itemize> @@ -478,76 +469,39 @@ make install </code> </p> - <sect1>Install VMailMgr -<p> - At the time of this writing Bruce had not released a binary version of VMailMgr - that included Courier-imap support. This means until the next version of - VMailMgr is release, you will be required to build the RPMS yourself. - <sect2>Install with RPMS <sect3>Compiling SRC.RPM's <p> - Now for the fun part, since VMailMgr needs the courier-imap sources during - its compile to build the auth lib, I had to take the following steps. - (please edit to suit your environment) - - 1) copy the courier-imap-0.31.tar.gz to non-root users home dir - - <tt>cp courier-imap-0.31.tar.gz ~user1/ </tt> - - 2) with my user account: untar, run config and make -<verb> - su user1 - cd ~/ - tar zxf courier-imap-0.31.tar.gz - cd courier-imap-0.31 - ./configure - make -</verb> - - 3) Install the VMailMgr sources and modify the spec file to support courier-imap -<verb> - rpm -ivh VMailMgr-0.96.5-1.src.rpm - edit /usr/src/redhat/SPECS/VMailMgr-0.96.5.spec - on the ./configure line (line 49) add the following text to the end - --with-courier-imap=/home/user1/courier-imap-0.31/ -</verb> - - 4) Compile VMailMgr based on the modified spec file - <tt>rpm -bb /usr/src/redhat/SPECS/VMailMgr-0.96.5.spec</tt> - - * I will mention again, that I have built the binaries, and if you email me * - * at dan@kuykendall.org, I will email them back to you. * - + Simply run the following command + <verb>rpm --rebuild <package.src.rpm></verb> + -Example- +<code> + rpm --rebuild vmailmgr-0.96.6-1.src.rpm +</code> +</p> <sect3>Installing RPM's <p> - After compiling the source rpms, the binaries will be located + If you compiled the source rpm, the binaries will be located in <tt>/usr/src/redhat/RPMS/i386/</tt> or something similar. Simply run the following command for each package -<verb> - rpm -ivh <location>/<package.i386.rpm> -</verb> + <verb>rpm -ivh <location>/<package.i386.rpm></verb> + -Example- <code> - rpm -ivh /usr/src/redhat/RPMS/i386/VMailMgr-0.96.5-1.i386.rpm - rpm -ivh /usr/src/redhat/RPMS/i386/VMailMgr-daemon-0.96.5-1.i386.rpm + rpm -ivh /usr/src/redhat/RPMS/i386/vmailmgr-0.96.6-1.i386.rpm + rpm -ivh /usr/src/redhat/RPMS/i386/VMailMgr-daemon-0.96.6-1.i386.rpm </code> - +</p> <sect2>Install with source <p> - Since VMailMgr needs the courier-imap sources during its compile to build the - auth lib, and since your using the compiling source, you will need to have kept - your courier-imap sources from where you compiled it. If you deleted them, redo - the steps up to the make command. -<p> - Run the following command + Run the following commands <verb> (As non-root user) tar zxf <package.tar.gz> cd <newly created dir> - ./configure --with-courier-imap=<courier-imap sources> + ./configure make (As root) make install @@ -555,12 +509,12 @@ -Example- <code> (As non-root user) - tar zxf vmailmgr-0.96.5.tar.gz - cd vmailmgr-0.96.5 - ./configure --with-courier-imap=/home/user1/courier-imap-0.31/ + tar zxf vmailmgr-0.96.6.tar.gz + cd vmailmgr-0.96.6 + ./configure make (As root) - make install + make setup check or make install </code> That should do it. </p> diff --git a/LDP/howto/linuxdoc/Root-RAID-HOWTO.sgml b/LDP/howto/linuxdoc/Root-RAID-HOWTO.sgml index 9418638b..19045be6 100644 --- a/LDP/howto/linuxdoc/Root-RAID-HOWTO.sgml +++ b/LDP/howto/linuxdoc/Root-RAID-HOWTO.sgml @@ -1,2331 +1,2443 @@ -<!doctype linuxdoc system> - -<!-- - v1.07 add generic 'linuxrc' and raid5 support - v1.06 add 'rm /etc/mtab' to fail over rescue boot - in 'linuxrc' - v1.05 upgrade to linuxthreads-0.71 - v1.04 initial release ---> - -<article> - -<!-- Title information --> -<title>Root RAID HOWTO cookbook -<author>Michael A. Robinton, <url url="mailto:michael@bzs.org" - name="michael@bzs.org"> -<date>v1.07, 25 March 1998 -<abstract> -This document provides a cookbook for creating a root mounted raid -filesystem and companion fallback rescue system using linux initrd. There -are complete step-by-step instruction for both raid1 and raid5 md0 devices. -Each step is accompanied by an explanation of it's purpose. -Included with this revision is a generic <bf/linuxrc/ initrd file which may -be configured with a single three line <ref id="raidboot-conf" -name="/etc/raidboot.conf"> file for -raid1 and raid5 configurations. -</abstract> -<!-- Table of contents --> -<toc> - -<sect>Introduction - -<p> -The reader is assumed to be familiar with the various types of raid -implementations, their advantages and drawbacks. This is not a tutorial, -just a set of instructions on how to implement root mounted raid on a linux -system. All -of the information necessary to become familiar with linux raid is listed -here directly or by reference, please read it before send e-mail questions. - -<sect1>Where to get Up-to-date copies of this document. - -<p> -Root-RAID-HOWTO -<p> -Available in LaTeX (for DVI and PostScript), plain text, and HTML. -<quote> <url url="http://sunsite.unc.edu/mdw/HOWTO/" - name="sunsite.unc.edu/mdw/HOWTO/"> -</quote> -Available in SGML and HTML. -<quote> <url url="ftp://ftp.bizsystems.com/pub/raid/" - name="ftp.bizsystems.com/pub/raid/"> -</quote> - -<sect1>Bugs -<p> -As of this writing, the problem of stopping a root mounted RAID device has -not yet been solved in a satisfactory way. A work-around proposed by Ed -Welbon and implemented by Bohumil Chalupa is incorporated into this document -which eliminates the need for a long ckraid at each boot for raid1 and raid5 -devices. Without the workaround, it is necessary to <bf/ckraid/ the <bf/md/ device -each time the system is re-booted. On a large array this can cause a severe -availability performance degradation. On my 6 gig RAID1 device running on a -Pentium 166 with 128 megs of ram, it takes well over half an hour to ckraid -:-( -after each re-boot. It takes over an hour on my 13 gig RAID5 array with a -20mb/sec scsi adaptor. -<p> -The workaround stores the status of the array at -shutdown on the <bf/real/ boot device and compares it to a reference status -placed there when the system is first built. If the status's match at -reboot, the superblock on the array is rebuilt on the next boot, otherwise -the operator is notified of the status error and the rescue system is left -running with all the raid tools available. -<p> -Rebuilding the superblock causes -the system to ignore that the array was powered down without mdstop by -marking all the drives as <bf/OK/, as if nothing happened. This only works if -all the drives are OK at shutdown. If the array was operating with a bad -drive, the operator must remove the bad drive prior to restarting the md -device or the data can be corrupted. -<p> -None of this applies to raid0 which -does not have to be mdstopped before shutdown. - -Final proposed solutions to this problem include a <bf/finalrd/ similar to -<bf/initrd/, and <bf/mdrootstop/ which writes the <bf/clean/ flags to the array -during shutdown when it is mounted read only. I am sure there are others. - -In the mean time, the problem has been by-passed for now -Please let me know when this problem is solved more cleanly!!! - -<sect1>Acknowledgements - -<p> -The writings and e-mail from the following individuals helped to make this -document possible. Many of the ideas were <it/stolen/ from the helpful work of -others, I have just tried to put it all in <bf/COOKBOOK/ form so that it is -straightforward to use. My thanks to: -<itemize> -<item><url name="Linas Vepstas" url="mailto:linas@linas.org"> - <it> for the RAID howto that explained most of this to me.</it> -<item><url name="Gadi Oxman" url="mailto:gadio@netvision.net.il"> - <it> for answering my dumb 'newbie' questions.</it> -<item><url name="Ed Welbon" url="mailto:welbon@bga.com"> - <it> for the execellent <bf/initrd.md/ package that inspired me to write this.</it> -<item><url name="Bohumil Chalupa" -url="mailto:bochal@apollo.karlov.mff.cuni.cz"> <it> for implementing the -re-boot 'workaround' that allows -</it> <bf>root-mounted-raid</bf><it> to -work in a production environment.</it> -<p> -<item>and many others who contributed to this work in one way or another. -</itemize> - -<sect1>Copyright Notice - -<p> -This document is GNU copyleft by Michael Robinton -<url url="mailto:michael@bzs.org" name="michael@bzs.org">. -<p> - Permission to use, copy, distribute this document for any - purpose is hereby granted, provided that the author's / editor's - name and this notice appear in all copies and/or supporting - documents; and that an unmodified version of this document is - made freely available. This document is distributed in the hope - that it will be useful, but WITHOUT ANY WARRANTY, either - expressed or implied. While every effort has been taken to - ensure the accuracy of the information documented herein, the - author / editor / maintainer assumes NO RESPONSIBILITY for any - errors, or for any damages, direct or consequential, as a result - of the use of the information documented herein. - -<sect>What you need BEFORE YOU START - -<p> -The packages you need and the documentation that answers the most common -questions about setting up and running raid are listed below. Please review -them throughly. - -<sect1>Required Packages - -<p> -You need to obtain the most recent versions of these packages. -<itemize> -<item>a linux kernel that supports raid, initrd and /dev/loopx -<quote> I used <url name="linux-2.0.33" - url="ftp://sunsite.unc.edu/pub/Linux/kernel/"> - from sunsite</quote> -<item><url name="raid145-971022-2.0.31" - url="ftp://ftp.kernel.org/pub/linux/daemons/raid/"> - patch adds support for raid1/4/5 -<item><url name="raidtools-pre3-0.42" - url="ftp://ftp.kernel.org/pub/linux/daemons/raid/"> - tools to create and maintain - raid devices (documentation too). -<item><ref id="Appendix-E" name="Gadi's raid stop patch"> in Appendix E. -<item><url name="linuxthreads-0.71" - url="ftp://ftp.inria.fr/INRIA/Projects/cristal/Xavier.Leroy"> - required threads package. Use ftp, browser doesn't work -ftp.inria.fr/INRIA/Projects/cristal/Xavier.Leroy -<item>A Linux distribution, ready to install. -<quote> I used <url name="Slackware-3.4" url="ftp://ftp.cdrom.com/pub/linux"> -</quote> -</itemize> -Helpful but not required -<itemize> -<item><url name="raidboot-0.01.tar.gz" -url="ftp://ftp.bizsystems.com/pub/raid/"> - pre-built raid rescue/boot system. -</itemize> -<p> -The detailed instructions in this document are based on the above packages. -If the packages have been updated or you use a different linux distribution, -you may have to modify the procedures you find here. -<p> -The patches, tool assortment, etc... may vary with 2.1 kernels. -Please check the most recent documentation at: - -<quote><url url="ftp://ftp.kernel.org/pub/linux/daemons/raid/" - name="ftp.kernel.org/pub/linux/daemons/raid/"></quote> - -<sect1>Other similar implementations. - -<p> -I chose to include in the kernel all of the pieces necessary -to run from boot without loading any modules. My kernel image is -a little over 300k compressed. - -Take a look at <url name="Ed Welbon's" url="mailto:welbon@bga.com"> -<bf/initrd.md.tar.gz/ for another -way to make a bootable raid device. He uses loadable modules. -A look at his concise scripts will show you how it is done -if you need a very small kernel with modules. - -<quote><url url="http://www.realtime.net/~welbon/initrd.md.tar.gz" -name="http://www.realtime.net/~welbon/initrd.md.tar.gz"></quote> - -<sect1>Documentation -- Recommended Reading - -<p> -<bf/Please read:/ -<quote><bf>/usr/src/linux/Documentation/initrd.txt</bf></quote> - -<p> -as well as the documentation and man pages that accompany -the raidtools set. In particular, read <bf/man mdadd/ as well as the -<bf/QuickStart.RAID/ document included in the raidtools package. - -<p> -You may also wish to review: -<itemize> -<item><url url="http://sunsite.unc.edu/mdw/HOWTO/BootPrompt-HOWTO.html" - name="BootPrompt-HOWTO"> -<item><bf/man lilo/ -<item><bf/man lilo.conf/ -</itemize> - -<sect1>RAID resources - -<p> -<itemize> -<item><url url="http://sunsite.unc.edu/mdw/HOWTO/mini/Software-RAID" - name="sunsite.unc.edu/mdw/HOWTO/mini/Software-RAID"> -<item><url url="http://www.ssc.com/lg/issue17/raid.html" - name="www.ssc.com/lg/issue17/raid.html"> -<item><url url="http://linas.org/linux/raid.html" - name="linas.org/linux/raid.html"> -<item><url url="ftp://ftp.kernel.org/pub/linux/daemons/raid/" - name="ftp.kernel.org/pub/linux/daemons/raid/"> -<item><url url="http://www.realtime.net/~welbon/initrd.md.tar.gz" - name="www.realtime.net/~welbon/initrd.md.tar.gz"> -<item><url url="http://luthien.nuclecu.unam.mx/~miguel/raid/" - name="luthien.nuclecu.unam.mx/~miguel/raid/"> -</itemize> -Mailing lists can be joined at: -<itemize> -<item><url name="majordomo@nuclecu.unam.mx" - url="mailto:majordomo@nuclecu.unam.mx"><it> send a message to</it> - <bf/subscribe raiddev/<p> - send mail to: <url name="raiddev@nuclecu.unam.mx" - url="mailto:raiddev@nuclecu.unam.mx"> -<item><url name="majordomo@vger.rutgers.edu" - url="mailto:majordomo@vger.rutgers.edu"><it> send a message to</it> - <bf/subscribe linux-raid/<p> - send mail to: <url name="linux-raid@vger.rutgers.edu" - url="mailto:linux-raid@vger.rutgers.edu"> - <it>(this seems to be the most active list)</it> -</itemize> - -<sect>Quick Start for ROOT RAID -<p> -If you don't want to try and build and debug the rescue system, you can get -a generic one created from Slackware-3.4 from: -<quote><url url="ftp://ftp.bizsystems.com/pub/raid/" - name="ftp.bizsystems.com/pub/raid/raidboot-0.01.tar.gz"> -</quote> -Perform the following steps: -<itemize> -<item>Compile the raid enabled kernel with -built in support for your disk subsystem -<item>Test that the raid array will configure and mount correctly -<item>Build your OS on the raid system -<item>Correct the entries in <bf/fstab/ to show <bf>/dev/md0</bf> as the -root device. Make sure that the partition(s) you use for booting are included in -<bf/fstab/. -<item>Modify your shutdown halt and reboot script(s) (mine is /etc/rc.d/rc.6) as shown in -<ref id="modify_shutdown" name="Modifying the rc-scripts for SHUTDOWN"> -<item>Copy the following from you development filesystem -to the rescue system AND the new raid system - -<verb> - cd /root/raidboot - mkdir mnt - gzip -d rescue.clean - losetup /dev/loop0 rescue.clean - mount /dev/loop0 mnt - -copy these files - - cp -p /etc/* mnt/etc - cp -p /etc/rc.d/* mnt/etc/rc.d - {or as appropriate for your system} - cp -a /lib/modules/* mnt/lib/modules -</verb> -</itemize> -Correct the entries in <bf/fstab/ to show <bf>/dev/md0</bf> as the root -device. Make sure that the partition(s) you use for booting is included in -<bf/fstab/. -<p><label id="raidboot-conf"> -Create <bf>/etc/raidboot.conf</bf> which describes the raid boot -configuration. This file may <bf/NOT/ contain comments in the first three -lines, after that it doesn't matter. -<p> -raidboot.conf -<verb> - /dev/sda1 /dev/sda2 - raidboot - raid5.conf -# comments may only be placed 'after' the three -# configuration lines. -# -# This is 'raidboot.conf' -# -# line one, the partition(s) containing the 'initrd' raid-rescue system -# It is not necessary to boot from these partitions, however, -# since the rescue system will not fit on floppy, it is necessary -# to know which partitions are to be used to load the rescue system -# -# line two, the path to the raidboot config information -# Where the shutdown status, etc... is located at boot time -# It does NOT include the mount point information, only 'path' -# /mntpoint/'path' -# -# line -3-, name of the raid configuration file -# Current raid configuration file i.e. raid1.conf, raid5.conf -</verb> -A few more things to do and the raid systems is ready to boot. -<p> -Create <ref id="Appendix-F" name="rc.raidown">, as described in Appendix F, -and copy it to /etc/rc.d on the rescue, development, and raid system. -Unmount the rescue system and zip it. -<verb> - umount mnt - losetup -d /dev/loop0 - mv rescue.clean rescue - gzip rescue -</verb> -Copy the rescue file to the raidboot partitions. -<verb> - cp rescue.gz /mnt_point(1)/raidboot - cp rescue.gz /mnt_point(2)/raidboot -</verb> -Activate the raid array. -<verb> - mdadd -ar -</verb> -Save the <bf/good/ reference status to the raidboot partition -<verb> - cat /proc/mdstat | grep md0 > /mnt_point(1)/raidboot/raidgood.ref - cat /proc/mdstat | grep md0 > /mnt_point(1)/raidboot/raidgood.ref -</verb> -Lastly, configure the boot program as outlined in <ref id="raidboot-conf" -name="Boot Time Configuration Parameters"> and reboot your system onto the -raid array. - - - -<sect>initrd‐ Cookbook for root mounted RAID - -<p> -This is the procedure to make an 'initrd' ramdisk with rescue tools for raid. -<p> -Specifically, this document referrs to RAID1 and RAID5 implementations. -<sect1>Security Reminder - -<p> -The rescue file system may be used stand alone. Should your raid array -fail to mount, you are left with the rescue system mounted and running. -TAKE THE APPROPRIATE SECURITY PRECAUTIONS!!! - -<sect1>Build the Kernel and Raid Tools - -<p> -The first thing that must be done is to patch and build your kernel -and become familiar with the raid tools. Make sure and include -<ref id="Appendix-E" name="Gadi's raid stop patch"> in Appendix E. -Configure, mount and test your raid device(s). The details of how to do this -are included in the <bf/raidtools/ package and briefly reviewed later in -this document. - -<sect1>Build the <it/initrd/ Rescue and Boot filesystem - -<p> -I used the <bf/Slackware-3.4/ distribution to build both the Rescue/Boot -filesystem and the filesystem for the production machine. Any linux -distribution should work fine. If you use a different distribution, review -the Slackware specific portion of this procedure and modify it to suit your needs. - -<p> -I use loadlin to boot the kernel image and ramdisk from a dos partition -simply because there are oddball devices in my system that have dos -configuration software. Lilo will work just as well and a small linux -partition can be used instead containing only the raid/boot files and the -<bf/lilo/ record. - -For the raid boot/rescue system, -I chose to create a minimum ramdisk system using the Slackware 'setup' -script followed by installing the 'linuxthreads' package and 'raidtools' -over the clean Slackware installation on my ramdisk. I used the -<it><bf/identical/</it> procedure to build the production system. So the -rescue and production systems are very similar. -<p> -This installation process gives me a 'bare' system -(save a copy of the file) to which I overlay - -<verb> /lib/modules/2.x.x...... - /etc .... with a modified fstab, mdtab, raidX.conf, raidboot.conf - /etc/rc.d - /dev/md*</verb> -<p> -from my current system to customize it for the particular kernel -and machine that it is/will-be running on. -<p> -This makes the boot/rescue system the same system that is running -on the root mounted raid device, just skinnyed down a bit, while -allowing the library, etc... revisions to always be current. - -<sect1>Start the STEP by STEP instructions - -<p> -From the root home directory (/root): - -<verb> cd /root - mkdir raidboot - cd raidboot</verb> -<p> -Create a mountpoints to work on - -<verb> mkdir mnt - mkdir mnt2</verb> - -<p> -Make a file large enough to do the file system install. This -will be a lot larger than the final rescue file system. -I chose 24 megs since 16 megs is not large enough -<verb> - dd if=/dev/zero of=build bs=1024k count=24 -</verb> -associate the file with a loop device -and generate an ext2 file system on the file - -<verb> losetup /dev/loop0 build - mke2fs -v -m0 -L initrd /dev/loop0 - mount /dev/loop0 mnt -</verb> -<sect1>Install the distribution - Slackware Specific -<p> -<ref id="threads" name="...skip Slackware Specific stuff"> -and go to next section. -<p> -Now that an empty filesystem is created and mounted, run "setup". -<p> -<verb>Specify /root/raidboot/mnt</verb> -<p> -as the <bf/'target'/. The source is whatever you normally install from. -Select the packages you wish to install and proceed but <bf/DO NOT/ configure. -<p> -Choose 'EXPERT' prompting mode. -<p> -I chose 'A', 'AP, and 'N' installing only the minimum to run the system -plus an editor I am familiar with (vi, jed, joe) that is reasonably compact. -<verb> -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 -</verb> -From the 'AP series, I use only 'JOE', and editor I like, and 'MC' a -small and useful file management tool. You choose the utilities you -will need on your system. -<verb> -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 -</verb> -From the 'N' package I only loaded TCPIP. This isn't really necessary, -but is very handy and allows access to the network while working on a -repair or update with the root raid array dismounted. TCPIP also -contains 'biff' which is used by some of the applications in 'A'. If -you don't install 'N' you might want to install the biff package anyway. -<verb> -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 -</verb> -With the installation complete, say no to everything else (no to all -configuration requests) and exit the script. - -<sect1>Install linux <bf/pthreads/<label id="threads"> - -<p> -Now you must install the 'linuxthreads-0.71' library. -I have included this diff for the linuxthreads Makefile rather -than explain the details of the -installation by hand. Save the original Makefile, apply the diff -and then: - -<verb> cd /usr/src/linuxthreads-0.71 - patch - make - make install -</verb><label id="thrdiff"><verb> --------------------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 -</verb> - -<sect1>Install Raid Tools - -<p> -The next step is the installation of the raid tools. -raidtools-0.42 -<p> -You must run the "configure" script to point the Makefile -at the build directory for the ramdisk files -<verb> - cd /usr/src/raidtools-0.42 - configure --sbindir=/root/raidboot/mnt/sbin --prefix=/root/raidboot/mnt/usr - make - make install -</verb> -Now!! the Makefile for install is not quite right so do the following -to clean up. This will be fixed in future releases so that the re-linking -will not be necessary. - -<quote>Fix the make install error</quote> - -The file links specified in the Makefile at 'LINKS' must be removed -and re-linked to operate properly. -<verb> - cd /root/raidboot/mnt/sbin - ln -fs mdadd mdrun - ln -fs mdadd mdstop -</verb> - -<sect1>Remove un-needed directories and files from new filesystem. - -<p> -Delete the following directories from filesystem -(CAUTION DON'T DELETE FROM YOUR RUNNING SYSTEM) -it's easy to do, guess how I found out!!! -<verb> - 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 -</verb> - -<sect1>Create /dev/md<it/x/ - -<p> -The last step simply copies the /dev/md* devices from the current file system -onto the rescue file system. You could create these with mknode. -<verb> - cp -a /dev/md* /root/raidboot/mnt/dev -</verb> -<sect1>Create a bare filesystem suitable for <it/initrd/ - -<p> -Now you have a clean re-useable filesystem ready for customization. -Once customized, this file system can be used for rescue should the raid -device(s) become corrupted and the raid tools needed to fix them. It will -also be used to boot and root-mount the raid device by adding the linuxrc -file which will be discussed next. -<p> -Copy the file system to a smaller device for the initrd file, -16 megs should be large enough. -<p> -Create the smaller file system and mount it -<verb> - cd /root/raidboot - dd if=/dev/zero of=bare.fs bs=1024k count=16 -</verb> -associate the file with a loop device -and generate a ext2 file system on the file -<verb> - losetup /dev/loop1 bare.fs - mke2fs -v -m0 -L initrd /dev/loop1 - mount /dev/loop1 mnt2 -</verb> -Copy the 'build' file system to 'bare.fs' -<verb> - cp -a mnt/* mnt2 -</verb> -Save the 'bare.fs' system before customization so later update is easy. -The 'build' file system is no longer needed and may be deleted. -<verb> - 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 -</verb> -<sect2>Create the BOOT/RESCUE <it><bf/initrd/</it> filesystem - -<p> -Now copy the system dependent items that match the kernel from the -development platform, or you can manually modify the files in the -rescue file system to match your target system. -<verb> - losetup /dev/loop0 rescue - mount /dev/loop0 mnt -</verb> -Make sure your etc directory is clean of <tt/*~/, core and log files. -The next 2 commands creates some warning messages, ignore them. -<verb> - 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 -</verb> -Edit the following files to correct them for your rescue system. -<verb> - cd mnt - -Non-network - etc/fstab - etc/mdtab should work OK -Network - etc/hosts - etc/resolv.conf - etc/hosts.equiv and related files - etc/rc.d/rc.inet1 correct ip#, mask, gateway, etc... - etc/rc.d/rc.S remove entire section on file system status - from: - # Test to see if the root partition isread-only - to but not including: - # remove /etc/mtab* so that mount will ..... - This avoids the annoying warning that - the ramdisk is mounted rw. - etc/rc.d/rc.xxxxx others as required, see later on in this doc - root/.rhosts if present - home/xxxx/xxxx others as required - - WARNING: The above procedure moves your password and shadow - files onto the rescue disk!!!!! - - WARNING: You may not wish to do this for security reasons. -</verb> -Create any directories for mounting /dev/disk... as may be required -that are unique to your system. These are the mountpoints for booting -the system (boot partition and backup boot partition). My system boot from -dos using <bf/loadlin/, however linux partition(s) and lilo will work fine. -My system uses: -<verb> - cd /root/raidboot/mnt <--- initrd root - mkdir dosa dos partition mount point - mkdir dosb dos mirror mount point -</verb> -The rescue file system is complete! -<p> -You will note upon examination of the files in the rescue file -system, that there are still many files that could be deleted. -I have not done this since it would overly complicate this -procedure and most raid systems have adequate disk and memory. -If you wish to skinny down the file system, go to it! - -<sect1>Making 'initrd' boot the RAID device - linuxrc - -<p> -To make the rescue disk boot the raid device, you need only copy -the executable script file: - -<quote><bf/linuxrc/</quote> - -to the root of the device. -<p> -The theory of operation for this <bf/linuxrc/ file is discussed in -<ref id="Appendix-G" name="Appendix G, linuxrc theory of operation">. -<p> -A very simple and much easier to understand (working) linuxrc is -included in <ref id="Appendix-D" name="Appendix D">, -<it/obsolete linuxrc and shutdown scripts/. Copy the following text to -<bf/linuxrc/ and save in your development area. - -<label id="linuxrc"> -<verb> - -------------------- 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 ---------------------- -</verb> -Add 'linuxrc' to initrd boot device -<verb> - cd /root/raidboot - chmod 777 linuxrc - cp -p linuxrc mnt -</verb> - -<sect1>Modifying the rc-scripts for SHUTDOWN <label id="modify_shutdown"> - -<p> -To complete the installation, modify the rc scripts to save -the md status to the real root device when shutdown occurs. -<verb> -In slackware this is rc.0 -> rc.6 -In debian 'bo' this is in both 'halt' and 'reboot' - -If you implement this in another distribution, please e-mail -the instructions and sample files so they can be included here. -</verb> -I have modified Bohumil Chalupa's raid stop work-around slightly. His -original solution is presented in <ref id="Appendix-A" name="Appendix A">. -<p> -Since there are no linux partitions left on the production system except -<bf/md0/, the boot partitions are used to store the <bf/raidOK readonly/ status. -I chose to write a file to each of the duplicate boot partitions containing the -status of the md array at shutdown and signifying that the -md device has been remounted RO. This allows the system to be fail safe -when any of the hard drives die. -<p> -The shutdown script is modified to call <ref id="Appendix-F" -name="rc.raidown"> which saves the necessary -information to successfully reboot and mount the raid device. Examples of -shutdown scripts for various linux distributions are shown in -<ref id="Appendix-B" name="Appendix B">. - -<p> -To capture the raid array shutdown status insert a call to -<ref id="Appendix-F" name="rc.raidown"> -after any <bf/case/ statements (if present) but before the actual shutdown -(kills, status saves, etc...) begins and before the file systems are -dismounted. -<verb> -############ Save raid boot and status info ############## -# - if [ -x /etc/rc.d/rc.raidown ]; then - /etc/rc.d/rc.raidown - fi -################## end raid boot ######################### -</verb> -After all the file systems are dismounted (the root file system -'will not' dismount) but before any powerfail status check add: -<verb> -################ 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 -########################################################## -</verb> -This will cleanly stop all raid devices except root. Root status -is passed to the next boot in <bf/raidstat.ro/. - -<p> -Copy the rc file to your new raid array, the rescue file system that is -still mounted on <bf>/root/raidboot/mnt</bf> and the development system -if it is on the same machine. - -Modify rescue <bf>etc/fstab</bf> as needed -and make sure rescue <bf/mdtab/ is correct. -<p> -Now copy the rescue disk to your dos partition and everything should -be ready to boot the raid device as root. -<verb> - umount mnt - losetup -d /dev/loop0 - gzip -9 rescue -</verb> -Copy rescue.gz to your boot partitions. -<p> -All that remains is to creat the configuration file <bf/raidboot.conf/ -and test the new file system by rebooting. - -<sect1>Configuring RAIDBOOT - raidboot.conf <label id="raidboot-conf"> -<p> -The comments following the example configuration file explain each of the -three lines. This example file is for a 4 drive raid5 scsii array with -duplicate boot partitions on drives sda1 and sdb1. Put the paramaters -descriptive of your file systems here instead. -<verb> - /dev/sda1 /dev/sdb1 - linux - raid5.conf -# comments may only be placed 'after' the three -# configuration lines. -# -# This is 'raidboot.conf' -# -# line one, the partition(s) containing the 'initrd' raid-rescue system -# It is not necessary to boot from these partitions, however, -# since the rescue system will not fit on floppy, it is necessary -# to know which partitions are to be used to load the rescue system -# -# line two, the path to the raidboot config information -# Where the shutdown status, etc... is located at boot time -# It does NOT include the mount point information, only 'path' -# /mntpoint/'path' -# -# line -3-, name of the raid configuration file -# Current raid configuration file i.e. raid1.conf, raid5.conf -</verb> - -<sect1>Kernel 'loadlin and lilo' variables for RESCUE and RAID - -<p> -There are two kernel variables for the RESCUE and RAID system, only the first need -be specified. -<itemize> -<item>Raid_Conf=msdos,/dev/sda1,raidboot -<quote>This variable points to raid boot device and configuration file. -For floppy rescue boot, you may want to specify -this on the kernel command line or in the loadlin or lilo boot file -</quote><quote> -format: <tt/'filesystem-type,device,path-to-config-from-mountpoint'/ -</quote> -<item>Raid_ALT=-r,-p5,/dev/md0,/dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3 -<quote>Alternate mdadd parameters -necessary when booting with non-redundant raid array. These are the comma -separated command line parameters for <bf/mdadd/. Unless they are needed to -start a failed/non-redundant array, COMMENT OUT OR SPECIFY WITH A 'NULL'. -</quote><quote>i.e. Raid_ALT= -</quote></itemize> -Either of these parameters may be specified in the lilo or loadlin boot parameter -file or on the loadlin kernel command line. Care must be taken that the maximum -line length is not exceeded, however, if the command line is used -(128 characters). - -<p> -When booting with <bf/lilo/, the parameters are included in the lilo config -file in the form: -<verb> -append="Raid_Conf=msdos,/dev/sda1,raidboot" -append="Raid_ALT=-r,-p5,/dev/md0,/dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3" -</verb> -See <bf/man lilo.conf/ for more detailed information. -<p>Since I have some hardware that requires DOS configuration utilities, I -have a small dos partition on the system. -Therefore, I used loadlin to boot the raid5 system from the dos -partition with a mirror (copy) on the companion disk. An identical method is -used for the raid1 system. The example below uses loadlin, but the procedure -is very similar for lilo. -<p> -My dos root system contains a small editor among the utilities so I can modify -the boot parameters of loadlin if necessary, allowing me to reboot the -linux system on my swap disk while testing. -<p> -The dos system contains this tree for linux -<verb> - 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) - -</verb><label id="linuxbat">linux.bat contains: -<verb> ----------------------- linux.bat --------------------------- -echo "Start the LOADLIN process:" -c:\raidboot\loadlin @c:\raidboot\boot.par --------------------- end linux.bat ------------------------- -</verb> -boot.par contains: -<verb> - # 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 - -***** >> NOTE!! the only difference between forcing the rescue system to - run and the raid device mounting, is the loadlin parameter - - root=/dev/ram0 for the rescue system - root=/dev/md0 for RAID - - With root=/dev/ram0 the RAID device will not mount - and the rescue system will run unconditionally. -</verb> - -If the RAID array fails, the rescue system is left mounted and running. - -<sect>Configuring the Production RAID system. - -<p> -<sect1>System specs. -Two systems with identical motherboards were configured. -<p> -<verb> - Raid-1 Raid-5 -Motherboard: Iwill P55TU dual ide adaptec scsi -Processor: Intel P200 -Disks: 2ea 7 gig 4 ea Segate 4.2 gig - Maxtors wide scsii -</verb> -The disk drives are designated by linux as 'sda' through 'sdd' on the raid5 -system and 'hda' and 'hdc' on the raid1 system. - -<sect1>Partitioning the hard drives. - -<p> -Since testing a large root mountable RAID array is difficult because -of the ckraid re-boot problem, I re-partitioned my swap space to include a -smaller RAID partition for testing purposes, sda6,sdb6,sdc6,sdd6, and -a small root and /usr/src partition pair for developing and testing -the raid kernel and tools. -You may find this helpful. -<verb> - <bf/DEVELOPMENT SYSTEM - RAID5/ - Device System Size Purpose - - /dev/sda1 dos boot 16 meg boot partition -* /dev/sda2 extended 130 meg (see below) - /dev/sda3 linux native 4 gig primary raid5-1 -----------------------sda2------------------------------ -* /dev/sda5 linux swap 113 meg SWAP space -* /dev/sda6 linux native 16 meg test raid5-1 -======================================================== - /dev/sdb1 dos boot 16 meg boot partition duplicate -* /dev/sdb2 extended 130 meg (see below) - /dev/sdb3 linux native 4 gig primary raid5-2 -----------------------sdb2------------------------------ -* /dev/sdb5 linux swap 113 meg SWAP space -* /dev/sdb6 linux native 16 meg test raid5-2 -======================================================== -* /dev/sdc2 extended 146 meg (see below) - /dev/sdc3 linux native 4 gig primary raid5-3 -----------------------sdc2------------------------------ -* /dev/sdc5 linux swap 130 meg development root partition -* /dev/sdc6 linux native 16 meg test raid5-3 -======================================================== -* /dev/sdd2 extended 146 meg (see below) - /dev/sdd3 linux native 4 gig primary raid5-4 -----------------------sdd2------------------------------ -* /dev/sdd5 linux swap 130 meg development /usr/src -* /dev/sdd6 linux native 16 meg test raid5-4 - - - <bf/DEVELOPMENT SYSTEM - RAID1/ - Device System Size Purpose - - /dev/hda1 dos 16meg boot partition -* /dev/hda2 extended 126m (see below) - /dev/hda3 linux 126m development root partition - /dev/hda4 linux 6+gig raid1-1 -----------------------hda2------------------------------ -* /dev/hda5 linux 26m test raid1-1 -* /dev/hda6 linux swap 100m -======================================================== - - /dev/hdc1 is simply an exact copy of hda1 so the - partion can be made active if hda fails -* /dev/hdc2 extended 126m (see below) - /dev/hdc3 linux 126m development /usr/src - /dev/hdc4 linux 6+gig raid1-2 -----------------------hdc2------------------------------ -* /dev/hdc5 linux 26m test raid1-2 -* /dev/hdc6 linux swap 100m -</verb> -The sdx2 and hdx3 partitions were switched to 'swap' after developing -this utility. I could have done it on another machine, however, -the libraries and kernels are all about a year or more out of date -on my other linux boxes and I preferred to build it on the target machine. -<p> -The partitioning scheme was chosen so that in the event that -any one of the drives fails catastrophically, the system will -continue to run and be bootable with minimum effort and NO data loss. -<itemize> -<item> If any single hard drive fails, the boot will abort, and - the rescue system will run. Examination of the screen - message or /dos<it/x//raidboot/raidstat.ro will tell the operator - the status of the failed array. -<item> If sda1 (raid5) or hda1 (raid1) fails, the dos backup boot partition - must be made 'active' and the bios must recognize the new partition - as the boot device or it must be physically be moved to the <it/x/da position. - Alternatively, the system could be booted from a floppy disk using - the initrd image on the remaining backup boot drive. - The raid system can then be made active again by issuing: -<verb> "/sbin/mkraid /etc/raid<it/x/.conf -f --only-superblock"</verb> - to rebuild the remaining superblock(s). - -<item> Once this is done, then - -<verb> mdadd -ar</verb> - -<item> Examine the status of the array to verify that everything is OK - then replace the good array reference with the current status - until the failed disk can be repaired or replaced. - -<verb> cat /proc/mdstat | grep md0 > /dosx/raidboot/raidgood.ref - - shutdown -r now -</verb> - to do a clean reboot, and the system is up again. -</itemize> -<sect>Building the RAID file system. - -<p> -This description is for my RAID systems described in the system -specs. Your system may have a different RAID architecture, so -modify as appropriate. Please read the man pages and -QuickStart.RAID that come with the raidtools-0.42 -<sect1>/etc/raid5.conf <label id="raid5configuration"> -<p> -<verb> # raid-5 configuration - raiddev /dev/md0 - raid-level 5 - nr-raid-disks 4 - chunk-size 32 - - # Parity placement algorithm - parity-algorithm left-symmetric - - # Spare disks for hot reconstruction - #nr-spare-disks 0 - - device /dev/sda3 - raid-disk 0 - - device /dev/sdb3 - raid-disk 1 - - device /dev/sdc3 - raid-disk 2 - - device /dev/sdd3 - raid-disk 3 -</verb> -<sect1>/etc/raid1.conf <label id="raid1configuration"> -<p> -<verb> - # raid-1 configuration - raiddev /dev/md0 - raid-level 1 - nr-raid-disks 2 - nr-spare-disks 0 - - device /dev/hda4 - raid-disk 0 - - device /dev/hdc4 - raid-disk 1 -</verb> -<sect1>Step by Step procedures for building production RAID file system. - -<p> -For my RAID5 system I did a complete install of: -<verb> - Slackware-3.4 any current distribution should work OK - linuxthreads-0.71 - raidtools-0.42 - linux-2.0.33 with raid145 patch and Gadi's patch -</verb> -<p> -Create and format the raid device. -<verb> - mkraid /etc/raid5.conf - mdcreate raid5 /dev/md0 /dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3 - mdadd -ar - mke2fs /dev/md0 - mkdir /md - mount -t ext2 /dev/md0 /md -</verb> -Create the reference files that reboot will use, -this may be different on your system. -<verb> - cat /proc/mdstat | grep md0 > /dosa/raidboot/raidgood.ref - cat /proc/mdstat | grep md0 > /dosb/raidboot/raidgood.ref -</verb> -Use Slackware-3.4 or another distribution to build your OS -<verb> - setup -</verb> -Specify '/md' as the target, and the source whatever your normally use. -Select and install the disksets of interest except for the kernel. -Configure the system, but skip the section on lilo and kernel booting. -Exit setup. -<p> -Install 'pthreads' -<verb> - cd /usr/src/linuxthreads-0.71 -</verb> -edit the Makefile and specify -<verb> - BUILDIR=/md - - make - make install -</verb> -Install 'raidtools' -<verb> - cd /usr/src/raidtools-0.42 - configure --sbindir=/md/sbin --prefix=/md/usr -</verb> -fix the raidtools make install error -<verb> - cd /md/sbin - rm mdrun - rm mdstop - ln -s mdadd mdrun - ln -s mdadd mdstop -</verb> -Create /dev/mdx -<verb> - cp -a /dev/md* /md/dev -</verb> -Add the system configuration from the current system (ignore errors). -<verb> - cp -dp /etc/* mnt/etc - cp -dp /etc/rc.d/* mnt/etc/rc.d (include the new rc.6) - mkdir mnt/lib/modules - cp -a /lib/modules/2.x.x mnt/lib/modules <--- your current 2.x.x -</verb> -Edit the following files to correct them for your file system -<verb> - cd /md - -Non-network - etc/fstab correct for real root and raid devices. - etc/mdtab should work OK -Network - etc/hosts - etc/resolv.conf - etc/hosts.equiv and related files - etc/rc.d/rc.inet1 correct ip#, mask, gateway, etc... - etc/rc.d/rc.S remove entire section on file system status - from: - # Test to see if the root partition isread-only - to but not including: - # remove /etc/mtab* so that mount will ..... - This avoids the annoying warning that - the ramdisk is mounted rw. - etc/rc.d/rc.xxxxx others as required - root/.rhosts if present - home/xxxx/xxxx others as required - - WARNING: The above procedure moves your password and shadow - files onto the new file system!!!!! - - WARNING: You may not wish to do this for security reasons. -</verb> -Create any directories for mounting /dev/disk... as may be required -that are unique to your system. Mine need: -<verb> - cd /md <--- new file system root - mkdir dosa dos partition mount point - mkdir dosb dos mirror mount point -</verb> -The new file system is complete. Make sure and save the md reference -status to the 'real' root device and you are ready to boot. -<p> -mount the dos partitions on dosa and dosb -<verb> - cat /proc/mdstat | grep md0 > /dosa/raidboot/raidgood.ref - cat /proc/mdstat | grep md0 > /dosb/raidboot/raidgood.ref - - mdstop /dev/md0 -</verb> - -<sect>One last thought. - -<p> -Remember that an expert is someone who knows at least 1% more -than you do about a subject. Bear this in mind when you e-mail -me for help. I'll try, but I've only done this once for raid1 and once for -raid5! - -Michael Robinton <url url="mailto:michael@bzs.org" -name="Michael@bzs.org"> - -<sect>Appendix A. - Bohumil Chalupa's md0 shutdown<label id="Appendix-A"> - -<p> -Bohumil Chalupa's post to the linux raid list on the work -around for the raid1 + 5 mdstop problem. His solution does not -address the possibility of the raid device being corrupt at shutdown. -So I have added a simple status comparison to a good reference -status at boot. This allows the operator to intervene if something -is wrong with a disk in the array. The description of this is in the -main body of this document. -<verb> -> From: Bohumil Chalupa <bochal@apollo.karlov.mff.cuni.cz> -> -> I can now boot initrd and use linuxrc to start the RAID1 array, -> then successfully switch root to /dev/md0. -> -> I don't know, however, any way how to cleanly _stop_ the array. - -Well. I have to answer myself :-) - -> Date: Mon, 29 Dec 1997 02:21:38 -0600 (CST) -> From: Edward Welbon <welbon@bga.com> -> Subject: Re: dismounting root raid device -> -> For md devices other than raid0, there is probably state that needs to -> be saved that is only known once all writes have completed. Such state -> of course can't be saved to root once it is mounted readonly. In that -> case, you would have to be able to mount a writeable filesystem "X" -> on the readonly root and be able to write to "X" (I recall doing this -> during "rescue" operations, but not as an automated procedure). -> -> The filesystem "X" would presumably be a boot device from which the raid -> (during linuxrc exection via initrd) would pickup it's initial state from. -> Fortunately raid0 isn't required to write out any state (though it would -> be pleasant to be able to write the check sums to mdtab after an mdstop). -> Eventually, I will fiddle with this but it doesn't seem difficult though -> the "devil" is always in the "details". - -Yes, that's it. -I had this idea in mind for some time already, but had no time to try it. -Yesterday I did, and it works. - -With my RAID1 (mirror), I don't save any checksums or raid superblock data. -I only save an information on the "real" boot partition, that the root md -volume was remounted readonly during shutdown. Then, during boot, the -linuxrc script runs mkraid --only-superblock when it finds this -information; otherwise, it runs ckraid. -This means, that the raid superblock information is not updated during -shutdown; it's updated at the boot time. -It is not very clean, I'm afraid, :-( but it works. - -I'm using Slackware and initrd.md by Edward Welbon to boot the root raid -device. -As far as I remember now, the only modified files are -mkdisk and linuxrc, and /etc/rc.d/rc.6 shutdown script. -And lilo.conf, of course. - -I'm appending the important parts. - -Bohumil Chalupa - ---------------- my.linuxrc follows ----------------- -#!/bin/sh -# we need /proc -/bin/mount /proc -# start up the md0 device. let the /etc/rc.d scripts get the rest of them -# we should do as little as possible here -# ________________________________________ -# root raid1 shutdown test & recreation -# /start must be created on the rd image in my.mkdisk -echo "preparing md0: mounting /start" -/bin/mount /dev/sda2 /start -t ext2 -echo "reading saved md0 state from /start" -if [ -f /start/root.raid.ok ]; then - echo "raid ok, modyfying superblock" - rm /start/root.raid.ok - /sbin/mkraid /etc/raid1.conf -f --only-superblock -else - echo "raid not clean, runing ckraid --fix" - /sbin/ckraid --fix /etc/raid1.conf -fi -echo "unmounting /start" -/bin/umount /start -# _________________________________________ -# -echo "adding md0 for root file system" -/sbin/mdadd /dev/md0 /dev/sda1 /dev/sdb1 -echo "starting md0" -/sbin/mdrun -p1 /dev/md0 -# tell kernel we want to switch to /dev/md0 as root device, the 0x900 value -# is arrived at via 256*major_device_number + minor_device number. -echo "setting real-root-dev" -/bin/echo 0x900>/proc/sys/kernel/real-root-dev -# unmount /proc so that the ram disk can be deallocated. -echo "unmounting /proc" -/bin/umount /proc -/bin/echo "We are hopefully ready to mount /dev/md0 (major 9, minor 0) as -root" -exit ---------------- end of my.linuxrc ---------------------------------- - - ------------ extract from /etc/rc.d/rc.6 follows ----------------- - # Turn off swap, then unmount local file systems. - echo "Turning off swap." - swapoff -a - echo "Unmounting local file systems." - umount -a -tnonfs - # Don't remount UMSDOS root volumes: - if [ ! "`mount | head -1 | cut -d ' ' -f 5`" = "umsdos" ]; then - mount -n -o remount,ro / - fi - - # Save raid state - echo "Saving RAID state" - /bin/mount -n /dev/sda2 /start -t ext2 - touch /start/root.raid.ok - /bin/umount -n /start - --------------- end of excerpt from rc.6 ------------------------ - - ------------------- part of my.mkdisk follows ---------------------- -# -# now we have the filesystem ready to be populated, we need to -# get a few important directories. I had endless trouble till -# I created a pristine mtab. In my case, it is convenient that -# /etc/mdtab is copied over, this way I can activate md with -# a simple "/sbin/mdadd -ar" in linuxrc. -# -cp -a $ROOT/etc $MOUNTPNT 2>cp.stderr 1>cp.stdout -rm -rf $MOUNTPNT/etc/mtab -rm -rf $MOUNTPNT/etc/ppp* -rm -rf $MOUNTPNT/etc/termcap -rm -rf $MOUNTPNT/etc/sendmail* -rm -rf $MOUNTPNT/etc/rc.d -rm -rf $MOUNTPNT/etc/dos* -cp -a $ROOT/sbin $ROOT/dev $ROOT/lib $ROOT/bin $MOUNTPNT 2>>cp.stderr -1>>cp.stdout -# _____________________________________________________________________ -# RAID: will need mkraid and ckraid -cp -a $ROOT/usr/sbin/mkraid $ROOT/usr/sbin/ckraid $MOUNTPNT/sbin -2>>cp.stderr 1>>cp.stdout -# --------------------------------------------------------------------- -# it seems that init wont come out to play unless it has utmp. this can -# probably be pruned back alot. no telling what the real bug was 8-). -# -mkdir $MOUNTPNT/var $MOUNTPNT/var/log $MOUNTPNT/var/run $MOUNTPNT/initrd -touch $MOUNTPNT/var/run/utmp $MOUNTPNT/etc/mtab -chmod a+r $MOUNTPNT/var/run/utmp $MOUNTPNT/etc/mtab -ln -s /var/run/utmp $MOUNTPNT/var/log/utmp -ln -s /var/log/utmp $MOUNTPNT/etc/utmp -ls -lstrd $MOUNTPNT/etc/utmp $MOUNTPNT/var/log/utmp $MOUNTPNT/var/run/utmp -# -# since I wanted to change the mount point, I needed this though -# I suppose that I could have done a "mkdir /proc" in linuxrc. -# -mkdir $MOUNTPNT/proc -chmod 555 $MOUNTPNT/proc -# -# ------------------------------------------------------ -# we'll mount the real boot device to /start temporarily -# to check the root raid state saved at shutdown time -# -mkdir $MOUNTPNT/start -# ------------------------------------------------------- -# -# need linuxrc (it is, after all, the point of this exercise). -# -if [ -x ./my.linuxrc ]; then - cp -a ./my.linuxrc $MOUNTPNT/linuxrc - chmod 777 $MOUNTPNT/linuxrc -else - ln -s /bin/sh $MOUNTPNT/linuxrc -fi -# ------------------ part of my.mkdisk ends ----------------- -</verb> - -<sect>Appendix B. - Sample SHUTDOWN scripts <label id="Appendix-B"> - -<p><itemize> -<item><ref id="Slackware" name="Slackware"> -<item><ref id="Debian" name="Debian"> -</itemize> - -<sect1>Slackware - /etc/rc.d/rc.6 <label id="Slackware"> -<p> -<verb> -#! /bin/sh -# -# rc.6 This file is executed by init when it goes into runlevel -# 0 (halt) or runlevel 6 (reboot). It kills all processes, -# unmounts file systems and then either halts or reboots. -# -# Version: @(#)/etc/rc.d/rc.6 1.50 1994-01-15 -# -# Author: Miquel van Smoorenburg <miquels@drinkel.nl.mugnet.org> -# Modified by: Patrick J. Volkerding, <volkerdi@ftp.cdrom.com> -# -# Modified by: Michael A. Robinton < michael@bizsystems.com > -# to add call to rc.raidown - # Set the path. - PATH=/sbin:/etc:/bin:/usr/bin - - # Set linefeed mode to avoid staircase effect. - stty onlcr - - echo "Running shutdown script $0:" - - # Find out how we were called. - case "$0" in - *0) - message="The system is halted." - command="halt" - ;; - *6) - message="Rebooting." - command=reboot - ;; - *) - echo "$0: call me as \"rc.0\" or \"rc.6\" please!" - exit 1 - ;; - esac - -############ Save raid boot and status info ############## -# -if [ -x /etc/rc.d/rc.raidown ]; then - /etc/rc.d/rc.raidown -fi -################## end raid boot ######################### - - # Kill all processes. - # INIT is supposed to handle this entirely now, but this didn't always - # work correctly without this second pass at killing off the processes. - # Since INIT already notified the user that processes were being killed, - # we'll avoid echoing this info this time around. - if [ "$1" != "fast" ]; then # shutdown did not already kill all processes - killall5 -15 - killall5 -9 - fi - - # Try to turn off quota and accounting. - if [ -x /usr/sbin/quotaoff ] - then - echo "Turning off quota." - /usr/sbin/quotaoff -a - fi - if [ -x /sbin/accton ] - then - echo "Turning off accounting." - /sbin/accton - fi - - # Before unmounting file systems write a reboot or halt record to wtmp. - $command -w - - # Save localtime - [ -e /usr/lib/zoneinfo/localtime ] && cp /usr/lib/zoneinfo/localtime /etc - - # Asynchronously unmount any remote filesystems: - echo "Unmounting remote filesystems." - umount -a -tnfs & - - # Turn off swap, then unmount local file systems. - echo "Turning off swap." - swapoff -a - echo "Unmounting local file systems." - umount -a -tnonfs - # Don't remount UMSDOS root volumes: - if [ ! "`mount | head -1 | cut -d ' ' -f 5`" = "umsdos" ]; then - mount -n -o remount,ro / - fi - -################ 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 -########################################################## - - # See if this is a powerfail situation. - if [ -f /etc/powerstatus ]; then - echo "Turning off UPS, bye." - /sbin/powerd -q - exit 1 - fi - - # Now halt or reboot. - echo "$message" - [ ! -f /etc/fastboot ] && echo "On the next boot fsck will be FORCED." - $command -f -############### end rc.6 ################################# -</verb> - -<sect1>Debian bo - /etc/init.d/halt and /etc/init.d/reboot <label id="Debian"> -<p> -The modifications shown here for Debian bo halt and reboot files are NOT -TESTED. When you test this, please e-mail me so I can remove this comment. - -<sect2>/etc/init.d/halt -<p> -<verb> -#! /bin/sh -# -# halt The commands in this script are executed as the last -# step in runlevel 0, ie halt. -# -# Version: @(#)halt 1.10 26-Apr-1997 miquels@cistron.nl -# - -PATH=/sbin:/bin:/usr/sbin:/usr/bin - -############ Save raid boot and status info ############## -# -if [ -x /etc/rc.d/rc.raidown ]; then - /etc/rc.d/rc.raidown -fi -################## end raid boot ######################### - -# Kill all processes. -echo -n "Sending all processes the TERM signal... " -killall5 -15 -echo "done." -sleep 5 -echo -n "Sending all processes the KILL signal... " -killall5 -9 -echo "done." - -# Write a reboot record to /var/log/wtmp. -halt -w - -# Save the random seed between reboots. -/etc/init.d/urandom stop - -echo -n "Deactivating swap... " -swapoff -a -echo "done." - -echo -n "Unmounting file systems... " -umount -a -echo "done." - -mount -n -o remount,ro / - -################ 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 -########################################################## - -# See if we need to cut the power. -if [ -x /etc/init.d/ups-monitor ] -then - /etc/init.d/ups-monitor poweroff -fi - -halt -d -f -############# end halt #################### -</verb> -<sect2>/etc/init.d/reboot -<p> -<verb> -#! /bin/sh -# -# reboot The commands in this script are executed as the last -# step in runlevel 6, ie reboot. -# -# Version: @(#)reboot 1.9 02-Feb-1997 miquels@cistron.nl -# - -PATH=/sbin:/bin:/usr/sbin:/usr/bin - -############ Save raid boot and status info ############## -# -if [ -x /etc/rc.d/rc.raidown ]; then - /etc/rc.d/rc.raidown -fi -################## end raid boot ######################### - -# Kill all processes. -echo -n "Sending all processes the TERM signal... " -killall5 -15 -echo "done." -sleep 5 -echo -n "Sending all processes the KILL signal... " -killall5 -9 -echo "done." - -# Write a reboot record to /var/log/wtmp. -halt -w - -# Save the random seed between reboots. -/etc/init.d/urandom stop - -echo -n "Deactivating swap... " -swapoff -a -echo "done." - -echo -n "Unmounting file systems... " -umount -a -echo "done." - -mount -n -o remount,ro / - -################ 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 -########################################################## - -echo -n "Rebooting... " -reboot -d -f -i -</verb> - -<sect>Appendix C. - other setup files - -<p> -<sect1>linuxrc <ref id="linuxrc" name="linuxrc file"> -<p> -<sect1>loadlin -- linux.bat file - boot.par <ref id="linuxbat" name="linux.bat file - boot.par"> -<p> -<sect1>linuxthreads Makefile.diff <ref id="thrdiff" - name="linuxthreads Makefile.diff"> -<p> -<sect1>raid1.conf <ref id="raid1configuration" name="raid1.conf"> -<p> -<sect1>raid5.conf <ref id="raid5configuration" name="raid5.conf"> -<p> -<sect1>raidboot.conf <ref id="raidboot-conf" name="raidboot.conf"> -<p> -<sect1>rc.raidown <ref id="Appendix-F" name="rc.raidown"> - -<sect>Appendix D. - obsolete linuxrc and shutdown scripts <label id="Appendix-D"> - -<p> -<sect1>Obsolete working - linuxrc -<p> -This linuxrc file works fine with the shutdown procedure in the next -subsection. -<verb> - ---------------------- linuxrc -------------------- -#!/bin/sh -# ver 1.07 2-12-98 -# linuxrc - for raid1 using small dos partition and loadlin -# - -# mount the proc file system -/bin/mount /proc - -# This may vary for your system. -# Mount the dos partitions, try both -# in case one disk is dead -/bin/mount /dosa -/bin/mount /dosc - -# Set a flag in case the raid status file is not found -# then check both drives for the status file -RAIDOWN="raidstat.ro not found" -/bin/echo "Reading md0 shutdown status." -if [ -f /dosa/raidboot/raidstat.ro ]; then - RAIDOWN=`/bin/cat /dosa/raidboot/raidstat.ro` - RAIDREF=`/bin/cat /dosc/raidboot/raidgood.ref` -else - if [ -f /dosc/raidboot/raidstat.ro ]; then - RAIDOWN=`/bin/cat /dosc/raidboot/raidstat.ro` - RAIDREF=`/bin/cat /dosc/raidboot/raidgood.ref` - fi -fi - -# Test for a clean shutdown with all disks operational -if [ "${RAIDOWN} != ${RAIDREF}" ]; then - echo "ERROR ${RAIDOWN}" -# Use the next 2 lines to BAIL OUT and leave rescue running - /bin/echo 0x100>/proc/sys/kernel/real-root-dev - exit # leaving the error files in dosa/raidboot,etc... -fi - -# The raid array is clean, proceed by removing -# status file and writing a clean superblock -/bin/rm /dosa/raidboot/raidstat.ro -/bin/rm /dosc/raidboot/raidstat.ro -/sbin/mkraid /etc/raid1.conf -f --only-superblock - -/bin/umount /dosa -/bin/umount /dosc - -# Mount raid array -echo "Mounting md0, root filesystem" -/sbin/mdadd -ar - -# If there are errors - BAIL OUT and leave rescue running -if [ $? -ne 0 ]; then - echo "RAID device has errors" -# Use the next 3 lines to BAIL OUT - /bin/rm /etc/mtab # remove bad mtab - /bin/echo 0x100>/proc/sys/kernel/real-root-dev - exit -fi - -# else tell the kernel to switch to /dev/md0 as the /root device -# The 0x900 value the device number calculated by: -# 256*major_device_number + minor_device number -/bin/echo 0x900>/proc/sys/kernel/real-root-dev - -# umount /proc to deallocate initrd device ram space -/bin/umount /proc -/bin/echo "/dev/md0 mounted as root" -exit -#------------------ end linuxrc ---------------------- -</verb> - -<sect1>Obsolete working - shutdown scripts -<p> -This shutdown procedure works fine with the preceeding <bf/linuxrc/ -<p> -To capture the raid array shutdown status, -just before the file systems are dismounted insert: -<verb> - RAIDSTATUS=`/bin/cat /proc/mdstat | /usr/bin/grep md0` -</verb> -After all the file systems are dismounted (the root file system -'will not' dismount) add: -<verb> - # root device remains mounted RO - # mount dos file systems RW - mount -n -o remount,ro / - echo "Writing RAID read-only boot FLAG(s)." - mount -n /dosa - mount -n /dosc - # create raid mounted RO flag in duplicate - # containing the shutdown status of the raid array - echo ${RAIDSTATUS} > /dosa/raidboot/raidstat.ro - echo ${RAIDSTATUS} > /dosc/raidboot/raidstat.ro - - umount -n /dosa - umount -n /dosc - - # Stop all the raid arrays (except root) - echo "Stopping raid" - mdstop -a -</verb> -This will cleanly stop all raid devices except root. Root status -is passed to the next boot in <bf/raidstat.ro/. -<p> -The complete shutdown script from my old raid1 Slackware system follows, I -have switched raid1 to the new procedure with the /etc/raidboot.conf file. -<verb> -#! /bin/sh -# -# rc.6 This file is executed by init when it goes into runlevel -# 0 (halt) or runlevel 6 (reboot). It kills all processes, -# unmounts file systems and then either halts or reboots. -# -# Version: @(#)/etc/rc.d/rc.6 1.50 1994-01-15 -# -# Author: Miquel van Smoorenburg <miquels@drinkel.nl.mugnet.org> -# Modified by: Patrick J. Volkerding, <volkerdi@ftp.cdrom.com> -# Modified by: Michael A. Robinton, <michael@bzs.org> for RAID shutdown - - # Set the path. - PATH=/sbin:/etc:/bin:/usr/bin - - # Set linefeed mode to avoid staircase effect. - stty onlcr - - echo "Running shutdown script $0:" - - # Find out how we were called. - case "$0" in - *0) - message="The system is halted." - command="halt" - ;; - *6) - message="Rebooting." - command=reboot - ;; - *) - echo "$0: call me as \"rc.0\" or \"rc.6\" please!" - exit 1 - ;; - esac - - # Kill all processes. - # INIT is supposed to handle this entirely now, but this didn't always - # work correctly without this second pass at killing off the processes. - # Since INIT already notified the user that processes were being killed, - # we'll avoid echoing this info this time around. - if [ "$1" != "fast" ]; then # shutdown did not already kill all processes - killall5 -15 - killall5 -9 - fi - - # Try to turn off quota and accounting. - if [ -x /usr/sbin/quotaoff ] - then - echo "Turning off quota." - /usr/sbin/quotaoff -a - fi - if [ -x /sbin/accton ] - then - echo "Turning off accounting." - /sbin/accton - fi - - # Before unmounting file systems write a reboot or halt record to wtmp. - $command -w - - # Save localtime - [ -e /usr/lib/zoneinfo/localtime ] && cp /usr/lib/zoneinfo/localtime /etc - - # Asynchronously unmount any remote filesystems: - echo "Unmounting remote filesystems." - umount -a -tnfs & - - # you must have issued - # 'cat /proc/mdstat | grep md0 > {your boot vol}/raidboot/raidgood.ref' - # before linuxrc will execute properly with this info - RAIDSTATUS=`/bin/cat /proc/mdstat | /usr/bin/grep md0 # capture raid status` - - # Turn off swap, then unmount local file systems. - # clearing mdtab as well - echo "Turning off swap." - swapoff -a - echo "Unmounting local file systems." - umount -a -tnonfs - - # Don't remount UMSDOS root volumes: - if [ ! "`mount | head -1 | cut -d ' ' -f 5`" = "umsdos" ]; then - mount -n -o remount,ro / - fi - - # root device remains mounted - # mount dos file systems RW - echo "Writing RAID read-only boot FLAG(s)." - mount -n /dosa - mount -n /dosc - # create raid mounted RO flag in duplicate - # containing the shutdown status of the raid array - echo ${RAIDSTATUS} > /dosa/raidboot/raidstat.ro - echo ${RAIDSTATUS} > /dosc/raidboot/raidstat.ro - - umount -n /dosa - umount -n /dosc - - # Stop all the raid arrays (except root) - echo "Stopping raid" - mdstop -a - - # See if this is a powerfail situation. - if [ -f /etc/power_is_failing ]; then - echo "Turning off UPS, bye." - /sbin/powerd -q - exit 1 - fi - - # Now halt or reboot. - echo "$message" - [ ! -f /etc/fastboot ] && echo "On the next boot fsck will be FORCED." - $command -f -</verb> - - -<sect>Appendix E. - Gadi's raid stop patch for the linux kernel <label -id="Appendix-E"> - -<p> -<verb> ---- linux/drivers/block/md.c.old Fri Nov 21 13:37:11 1997 -+++ linux/drivers/block/md.c Sat Dec 6 13:34:28 1997 -@@ -622,8 +622,13 @@ - return do_md_run (minor, (int) arg); - - case STOP_MD: -- return do_md_stop (minor, inode); -- -+ err = do_md_stop(minor, inode); -+ if (err) { -+ printk("md: enabling auto mdstop for %s\n", -kdevname(inode->i_rdev)); -+ md_dev[minor].auto_mdstop = 1; -+ } -+ return err; -+ - case BLKGETSIZE: /* Return device size */ - if (!arg) return -EINVAL; - err=verify_area (VERIFY_WRITE, (long *) arg, sizeof(long)); -@@ -692,6 +697,10 @@ - - sync_dev (inode->i_rdev); - md_dev[minor].busy--; -+ if (!md_dev[minor].busy && md_dev[minor].auto_mdstop) { -+ do_md_stop(minor, inode); -+ md_dev[minor].auto_mdstop = 0; -+ } - } - - static int md_read (struct inode *inode, struct file *file, ---- linux/include/linux/md.h~ Fri Nov 21 13:29:14 1997 -+++ linux/include/linux/md.h Fri Nov 21 13:29:14 1997 -@@ -260,6 +260,7 @@ - int repartition; - int busy; - int nb_dev; -+ int auto_mdstop; - void *private; - }; -</verb> -<sect>Appendix F. - rc.raidown <label id="Appendix-F"> - -<p> -Copy the following text into the script file <bf/rc.raidown/ and save it in -<bf>/etc/rc.d</bf>. -<verb> -#! /bin/sh -# -# rc.raidown This file is executed by init when it goes into runlevel -# 0 (halt) or runlevel 6 (reboot). It saves the status of -# a root mounted raid array for subsequent re-boot -# -# Version: 1.08 3-25-98 Michael A. Robinton < michael@bizsystems.com > -# -############ Save raid boot and status info ############## -if [ -f /etc/raidboot.conf ] -then - { - read RaidBootDevs - read RaidStatusPath - read RaidConfigEtc - } < /etc/raidboot.conf - -# you must have issued -# cat /proc/mdstat | grep md0 > -# {your boot vol mnt(s)}/{RaidStatusPath}/raidgood.ref -# before linuxrc will execute properly with this info -# -# capture raid status - RAIDSTATUS=`/bin/cat /proc/mdstat | /usr/bin/grep md0` - mkdir /tmp/raid$$ - echo "Writing RAID read-only boot FLAG(s)." - for Device in ${RaidBootDevs} - do -# get mount point for raid boot device or use tmp - RBmount=$( cat /proc/mounts | /usr/bin/grep ${Device} ) - if [ -n ${RBmounts} ]; then - RBmount=$( echo ${RBmount} | cut -f 2 -d ' ' ) - else - RBmount="/tmp/raid$$" - mount ${Device} ${RBmount} - fi - if [ -d ${RBmount}/${RaidStatusPath} ]; then -# Create raid mounted RO flag = shutdown status of raid array - echo ${RAIDSTATUS} > ${RBmount}/${RaidStatusPath}/raidboot.ro -# Don't propagate 'fstab' from ramdisk - if [ -f /linuxrc ]; then - FSTAB= - else - FSTAB=fstab - fi - pushd /etc -# Save etc files for rescue system - /bin/tar --ignore-failed-read \ - -cf ${RBmount}/${RaidStatusPath}/raidboot.etc \ - raid*.conf mdtab* ${FSTAB} lilo.conf - popd -# Create new raidboot.cfg - { - /bin/echo ${RaidBootDevs} - /bin/echo ${RaidStatusPath} - /bin/echo ${RaidConfigEtc} - } > ${RBmount}/${RaidStatusPath}/raidboot.cfg - /bin/umount ${RBmount} - fi - done - rmdir /tmp/raid$$ - echo "Raid boot armed" -fi -################## end raid boot ######################### -</verb> -<sect>Appendix G. - linuxrc theory of operation <label id="Appendix-G"> -<p> - This is the complex form of the linuxrc file for root mounted raid. - It must be processed with 'bash' or another shell that recognizes - shell functions. -<p> - The advantage is that it is generic and is not dependent on startup - files and parameters located in the <bf/initrd/ image. -<p> - A <bf/Raid_Conf/ parameter passed to <bf/linuxrc/ by the kernel at boot - from lilo or loadlin contains a pointer to the boot devices and -location the of - initial 2 raidboot files needed by <bf/linuxrc/ (<it>raidboot.etc and -raidboot.cfg placed by the shutdown script</it>). -<quote> - <bf/raidboot.etc/ containing the 'tar'ed files: -<verb> - raid* - mdtab* - fstab - lilo.conf ( if applicable ) -</verb> -from the primary system that are transferred to the - initrd <bf>/etc</bf>etc directory at startup. With care, this file may - be edited if necessary when your system 'really' crashes. -<p> -<bf/raidboot.cfg/ contains the name of the boot partition in use - and applicable backup(s) as well as the path to the rest of - the raid start up file used by <bf/linuxrc/. - This file is normally created by the shutdown file - and may be created manually if necessary. -<p> -<bf/raidboot.cfg/ is of the form, 3 lines - no comments -<verb> - /dev/bootdev1 /dev/bootdev2 [/dev/bootdev3 ... and so on] - raid-status/path - name_of_raidX.conf_file -</verb><quote> - the <bf>raid-status/path</bf> does not include the name of the mountpoint -<p> - the <bf/raidX.conf/ filename is that one found in /etc - and normally used for <bf/ckraid/ and <bf/mkraid/. -</quote></quote> - The following additional files reside on the permanent raid boot partitions. - This is usually the same as above, but in emergency situations - may be loaded from anywhere they are available, such as a floppy boot disk. -<itemize> -<item><bf/raidgood.ref/ created by the command - cat /proc/mdstat | grep md0 > /{raid_status_path}/raidgood.ref -<p> - See the <ref id="modify_shutdown" name="shutdown scripts"> - for saving this file and the next -<p> -<item><bf/raidstat.ro/ created at each shutdown by the shutdown rc file, - saving the exit status of the raid array. -</itemize> -</article> +<!doctype linuxdoc system> + +<!-- + v1.12 add pointer to BootRootRaidLilominihowot + and obsolete message + v1.11 add RedHat info + v1.10 update raid resource html links + v1.09 minor typographic additions + v1.08 add warning about rc.S 'ro' test + v1.07 add generic 'linuxrc' and raid5 support + v1.06 add 'rm /etc/mtab' to fail over rescue boot + in 'linuxrc' + v1.05 upgrade to linuxthreads-0.71 + v1.04 initial release +--> + +<article> + +<!-- Title information --> +<title>Root RAID HOWTO cookbook +<author>Michael A. Robinton, <url url="mailto:michael@bzs.org" + name="michael@bzs.org"> +<date>v1.12, May 2, 2000 +<abstract> +This document only applys to the <bf/OLD/ raidtools, versions 0.50 and +under. The workarounds and solutions addressed in this write up have largely +been made obsolete by the vast improvment in the 0.90 raidtools and +accompanying kernel patch to the 2.0.37, 2.2x and 2.3x series kernels. You +may find the detailed descriptions useful, particularly if you plan to run +root raid or use initrd. Read on for a reference to set up of Boot Root Raid +using conventional LILO and accompanying initrd working scripts. What +follows is the description of the now <bf/OBSOLETE Root RAID HOWTO/. +This document was originally written to provide a cookbook for creating a +root mounted raid filesystem and companion fallback rescue system using +linux initrd. There are complete step-by-step instruction for both raid1 and +raid5 md0 devices. Each step is accompanied by an explanation of it's purpose. +Included with this revision is a generic <bf/linuxrc/ initrd file which may +be configured with a single three line <ref id="raidboot-conf" +name="/etc/raidboot.conf"> file for +raid1 and raid5 configurations. +</abstract> +<!-- Table of contents --> +<toc> + +<sect>Introduction + +<p> +The reader is assumed to be familiar with the various types of raid +implementations, their advantages and drawbacks. This is not a tutorial, +just a set of instructions on how to implement root mounted raid on a linux +system. All +of the information necessary to become familiar with linux raid is listed +here directly or by reference, please read it before send e-mail questions. + +<sect1>Where to get Up-to-date copies of this document. +<p> +Click here to browse the <url +url="ftp://ftp.bizsystems.com/pub/raid/Root-RAID-HOWTO.html" +name="author's latest version"> of +this document. Corrections and suggestions welcome! +<p> +Root-RAID-HOWTO -- OBSOLETE +<p> +Available in LaTeX (for DVI and PostScript), plain text, and HTML. +<quote> <url url="http://www.linuxdoc.org/HOWTO/Root-RAID-HOWTO.html" + name="http://www.linuxdoc.org/HOWTO/Root-RAID-HOWTO.html"> +</quote> +Available in SGML and HTML. +<quote> <url url="ftp://ftp.bizsystems.net/pub/raid/" + name="ftp.bizsystems.net/pub/raid/"> +</quote> + +<sect1>More up-to-date Boot Root Raid with LILO minihowto + +<p> +Available in LaTeX (for DVI and PostScript), plain text, and HTML. +<quote> <url url="http://www.linuxdoc.org/HOWTO/Root-RAID-HOWTO.html" + name="http://www.linuxdoc.org/HOWTO/Root-RAID-HOWTO.html"> +</quote> +Available in SGML and HTML. +<quote> <url url="ftp://ftp.bizsystems.net/pub/raid/" + name="ftp.bizsystems.net/pub/raid/"> +</quote> + + +<sect1>Bugs +<p> +As of this writing, the problem of stopping a root mounted RAID device has +not yet been solved in a satisfactory way. A work-around proposed by Ed +Welbon and implemented by Bohumil Chalupa is incorporated into this document +which eliminates the need for a long ckraid at each boot for raid1 and raid5 +devices. Without the workaround, it is necessary to <bf/ckraid/ the <bf/md/ device +each time the system is re-booted. On a large array this can cause a severe +availability performance degradation. On my 6 gig RAID1 device running on a +Pentium 166 with 128 megs of ram, it takes well over half an hour to ckraid +:-( +after each re-boot. It takes over an hour on my 13 gig RAID5 array with a +20mb/sec scsi adaptor. +<p> +The workaround stores the status of the array at +shutdown on the <bf/real/ boot device and compares it to a reference status +placed there when the system is first built. If the status's match at +reboot, the superblock on the array is rebuilt on the next boot, otherwise +the operator is notified of the status error and the rescue system is left +running with all the raid tools available. +<p> +Rebuilding the superblock causes +the system to ignore that the array was powered down without mdstop by +marking all the drives as <bf/OK/, as if nothing happened. This only works if +all the drives are OK at shutdown. If the array was operating with a bad +drive, the operator must remove the bad drive prior to restarting the md +device or the data can be corrupted. +<p> +None of this applies to raid0 which +does not have to be mdstopped before shutdown. + +Final proposed solutions to this problem include a <bf/finalrd/ similar to +<bf/initrd/, and <bf/mdrootstop/ which writes the <bf/clean/ flags to the array +during shutdown when it is mounted read only. I am sure there are others. + +In the mean time, the problem has been by-passed for now +Please let me know when this problem is solved more cleanly!!! + +<sect1>Acknowledgements + +<p> +The writings and e-mail from the following individuals helped to make this +document possible. Many of the ideas were <it/stolen/ from the helpful work of +others, I have just tried to put it all in <bf/COOKBOOK/ form so that it is +straightforward to use. My thanks to: +<itemize> +<item><url name="Linas Vepstas" url="mailto:linas@linas.org"> + <it> for the RAID howto that explained most of this to me.</it> +<item><url name="Gadi Oxman" url="mailto:gadio@netvision.net.il"> + <it> for answering my dumb 'newbie' questions.</it> +<item><url name="Ed Welbon" url="mailto:welbon@bga.com"> + <it> for the execellent <bf/initrd.md/ package that inspired me to write this.</it> +<item><url name="Bohumil Chalupa" +url="mailto:bochal@apollo.karlov.mff.cuni.cz"> <it> for implementing the +re-boot 'workaround' that allows +</it> <bf>root-mounted-raid</bf><it> to +work in a production environment.</it> +<item><url url="mailto:kwrohrer@ce.mediaone.net" name="Keith W."> <it> for +his explaination of setting up root raid with </it><bf/ RedHat/. + + +<p> +<item>and many others who contributed to this work in one way or another. +</itemize> + +<sect1>Copyright Notice + +<p> +This document is GNU copyleft by Michael Robinton +<url url="mailto:michael@bzs.org" name="michael@bzs.org">. +<p> + Permission to use, copy, distribute this document for any + purpose is hereby granted, provided that the author's / editor's + name and this notice appear in all copies and/or supporting + documents; and that an unmodified version of this document is + made freely available. This document is distributed in the hope + that it will be useful, but WITHOUT ANY WARRANTY, either + expressed or implied. While every effort has been taken to + ensure the accuracy of the information documented herein, the + author / editor / maintainer assumes NO RESPONSIBILITY for any + errors, or for any damages, direct or consequential, as a result + of the use of the information documented herein. + +<sect>What you need BEFORE YOU START + +<p> +The packages you need and the documentation that answers the most common +questions about setting up and running raid are listed below. Please review +them throughly. + +<sect1>Required Packages + +<p> +You need to obtain the most recent versions of these packages. +<itemize> +<item>a linux kernel that supports raid, initrd and /dev/loopx +<quote> I used <url name="linux-2.0.33" + url="ftp://sunsite.unc.edu/pub/Linux/kernel/"> + from sunsite</quote> +<item><url name="raid145-971022-2.0.31" + url="ftp://ftp.kernel.org/pub/linux/daemons/raid/"> + patch adds support for raid1/4/5 +<item><url name="raidtools-pre3-0.42" + url="ftp://ftp.kernel.org/pub/linux/daemons/raid/"> + tools to create and maintain + raid devices (documentation too). +<item><ref id="Appendix-E" name="Gadi's raid stop patch"> in Appendix E. +<item><url name="linuxthreads-0.71" + url="ftp://ftp.inria.fr/INRIA/Projects/cristal/Xavier.Leroy"> + required threads package. Use ftp, browser doesn't work +ftp.inria.fr/INRIA/Projects/cristal/Xavier.Leroy +<item>A Linux distribution, ready to install. +<quote> I used <url name="Slackware-3.4" url="ftp://ftp.cdrom.com/pub/linux"> +</quote> +</itemize> +Helpful but not required +<itemize> +<item><url name="raidboot-0.01.tar.gz" +url="ftp://ftp.bizsystems.com/pub/raid/"> + pre-built raid rescue/boot system. +</itemize> +<p> +The detailed instructions in this document are based on the above packages. +If the packages have been updated or you use a different linux distribution, +you may have to modify the procedures you find here. +<p> +The patches, tool assortment, etc... may vary with 2.1 kernels. +Please check the most recent documentation at: + +<quote><url url="ftp://ftp.kernel.org/pub/linux/daemons/raid/" + name="ftp.kernel.org/pub/linux/daemons/raid/"></quote> + +<sect1>Other similar implementations. + +<p> +I chose to include in the kernel all of the pieces necessary +to run from boot without loading any modules. My kernel image is +a little over 300k compressed. + +Take a look at <url name="Ed Welbon's" url="mailto:welbon@bga.com"> +<bf/initrd.md.tar.gz/ for another +way to make a bootable raid device. He uses loadable modules. +A look at his concise scripts will show you how it is done +if you need a very small kernel with modules. + +<quote><url url="http://www.realtime.net/~welbon/initrd.md.tar.gz" +name="http://www.realtime.net/~welbon/initrd.md.tar.gz"></quote> + +<sect1>Documentation -- Recommended Reading + +<p> +<bf/Please read:/ +<quote><bf>/usr/src/linux/Documentation/initrd.txt</bf></quote> + +<p> +as well as the documentation and man pages that accompany +the raidtools set. In particular, read <bf/man mdadd/ as well as the +<bf/QuickStart.RAID/ document included in the raidtools package. + +<p> +You may also wish to review: +<itemize> +<item><url url="http://sunsite.unc.edu/mdw/HOWTO/BootPrompt-HOWTO.html" + name="BootPrompt-HOWTO"> +<item><bf/man lilo/ +<item><bf/man lilo.conf/ +</itemize> + +<sect1>RAID resources + +<p> +<itemize> +<item><url +url="http://http://www.linas.org/linux/Software-RAID/Software-RAID.html" + name="www.linas.org/linux/Software-RAID/Software-RAID.html"> +<item><url url="http://www.ssc.com/lg/issue17/raid.html" + name="www.ssc.com/lg/issue17/raid.html"> +<item><url url="http://linas.org/linux/raid.html" + name="linas.org/linux/raid.html"> +<item><url url="ftp://ftp.kernel.org/pub/linux/daemons/raid/" + name="ftp.kernel.org/pub/linux/daemons/raid/"> +<item><url url="http://www.realtime.net/~welbon/initrd.md.tar.gz" + name="www.realtime.net/~welbon/initrd.md.tar.gz"> +<item><url url="http://luthien.nuclecu.unam.mx/~miguel/raid/" + name="luthien.nuclecu.unam.mx/~miguel/raid/"> +</itemize> +Mailing lists can be joined at: +<itemize> +<item><url name="majordomo@nuclecu.unam.mx" + url="mailto:majordomo@nuclecu.unam.mx"><it> send a message to</it> + <bf/subscribe raiddev/<p> + send mail to: <url name="raiddev@nuclecu.unam.mx" + url="mailto:raiddev@nuclecu.unam.mx"> +<item><url name="majordomo@vger.rutgers.edu" + url="mailto:majordomo@vger.rutgers.edu"><it> send a message to</it> + <bf/subscribe linux-raid/<p> + send mail to: <url name="linux-raid@vger.rutgers.edu" + url="mailto:linux-raid@vger.rutgers.edu"> + <it>(this seems to be the most active list)</it> +</itemize> + +<sect>Quick Start for ROOT RAID +<p> +If you use <bf/RedHat/, see the <ref id="RedHat" name="Howto set up RedHat"> +section in Appendix H. I have not tried this. If you use it successfully, +please let me know so I can update this document. +<p> +If you don't want to try and build and debug the rescue system, you can get +a generic one created from Slackware-3.4 from: +<quote><url url="ftp://ftp.bizsystems.com/pub/raid/" + name="ftp.bizsystems.com/pub/raid/raidboot-0.01.tar.gz"> +</quote> +Perform the following steps: +<itemize> +<item>Compile the raid enabled kernel with +built in support for your disk subsystem +<item>Test that the raid array will configure and mount correctly +<item>Build your OS on the raid system +<item>Correct the entries in <bf/fstab/ to show <bf>/dev/md0</bf> as the +root device. Make sure that the partition(s) you use for booting are included in +<bf/fstab/. +<item>Modify your shutdown halt and reboot script(s) (mine is /etc/rc.d/rc.6) as shown in +<ref id="modify_shutdown" name="Modifying the rc-scripts for SHUTDOWN"> +<item>Copy the following from you development filesystem +to the rescue system AND the new raid system + +<verb> + cd /root/raidboot + mkdir mnt + gzip -d rescue.clean + losetup /dev/loop0 rescue.clean + mount /dev/loop0 mnt + +copy these files + + cp -p /etc/* mnt/etc + cp -p /etc/rc.d/* mnt/etc/rc.d + {or as appropriate for your system} + cp -a /lib/modules/* mnt/lib/modules +</verb> +Some Linux distributions include a test for the <bf>ro/rw</bf> status of the +root file system. The <bf/rc startup/ files need to +have this test removed for the initrd rescue system. See the instructions in +the section on <ref id="corrections" name="Correctons for Rescue System">. +</itemize> +Correct the entries in <bf/fstab/ to show <bf>/dev/md0</bf> as the root +device. Make sure that the partition(s) you use for booting is included in +<bf/fstab/. +<p><label id="raidboot-conf"> +Create <bf>/etc/raidboot.conf</bf> which describes the raid boot +configuration. This file may <bf/NOT/ contain comments in the first three +lines, after that it doesn't matter. +<p> +raidboot.conf +<verb> + /dev/sda1 /dev/sda2 + raidboot + raid5.conf +# comments may only be placed 'after' the three +# configuration lines. +# +# This is '/etc/raidboot.conf' +# +# line one, the partition(s) containing the 'initrd' raid-rescue system +# It is not necessary to boot from these partitions, however, +# since the rescue system will not fit on floppy, it is necessary +# to know which partitions are to be used to load the rescue system +# +# line two, the path to the raidboot config information +# Where the shutdown status, etc... is located at boot time +# It does NOT include the mount point information, only 'path' +# /mntpoint/'path' +# +# line -3-, name of the raid configuration file +# Current raid configuration file i.e. raid1.conf, raid5.conf +</verb> +A few more things to do and the raid systems is ready to boot. +<p> +Create <ref id="Appendix-F" name="rc.raidown">, as described in Appendix F, +and copy it to /etc/rc.d on the rescue, development, and raid system. +Unmount the rescue system and zip it. +<verb> + umount mnt + losetup -d /dev/loop0 + mv rescue.clean rescue + gzip rescue +</verb> +Copy the rescue file to the raidboot partitions. +<verb> + cp rescue.gz /mnt_point(1)/raidboot + cp rescue.gz /mnt_point(2)/raidboot +</verb> +Activate the raid array. +<verb> + mdadd -ar +</verb> +Save the <bf/good/ reference status to the raidboot partition +<verb> + cat /proc/mdstat | grep md0 > /mnt_point(1)/raidboot/raidgood.ref + cat /proc/mdstat | grep md0 > /mnt_point(1)/raidboot/raidgood.ref +</verb> +Lastly, configure the boot program as outlined in <ref id="raidboot-conf" +name="Boot Time Configuration Parameters"> and reboot your system onto the +raid array. + + + +<sect><it>initrd</it> Cookbook for root mounted RAID + +<p> +This is the procedure to make an 'initrd' ramdisk with rescue tools for raid. +<p> +Specifically, this document referrs to RAID1 and RAID5 implementations. +<sect1>Security Reminder + +<p> +The rescue file system may be used stand alone. Should your raid array +fail to mount, you are left with the rescue system mounted and running. +TAKE THE APPROPRIATE SECURITY PRECAUTIONS!!! + +<sect1>Build the Kernel and Raid Tools + +<p> +The first thing that must be done is to patch and build your kernel +and become familiar with the raid tools. Make sure and include +<ref id="Appendix-E" name="Gadi's raid stop patch"> in Appendix E. +Configure, mount and test your raid device(s). The details of how to do this +are included in the <bf/raidtools/ package and briefly reviewed later in +this document. + +<sect1>Build the <it/initrd/ Rescue and Boot filesystem + +<p> +I used the <bf/Slackware-3.4/ distribution to build both the Rescue/Boot +filesystem and the filesystem for the production machine. Any linux +distribution should work fine. If you use a different distribution, review +the Slackware specific portion of this procedure and modify it to suit your needs. + +<p> +I use loadlin to boot the kernel image and ramdisk from a dos partition +simply because there are oddball devices in my system that have dos +configuration software. Lilo will work just as well and a small linux +partition can be used instead containing only the raid/boot files and the +<bf/lilo/ record. + +For the raid boot/rescue system, +I chose to create a minimum ramdisk system using the Slackware 'setup' +script followed by installing the 'linuxthreads' package and 'raidtools' +over the clean Slackware installation on my ramdisk. I used the +<it><bf/identical/</it> procedure to build the production system. So the +rescue and production systems are very similar. +<p> +This installation process gives me a 'bare' system +(save a copy of the file) to which I overlay + +<verb> /lib/modules/2.x.x...... + /etc .... with a modified fstab, mdtab, raidX.conf, raidboot.conf + /etc/rc.d + /dev/md*</verb> +<p> +from my current system to customize it for the particular kernel +and machine that it is/will-be running on. +<p> +This makes the boot/rescue system the same system that is running +on the root mounted raid device, just skinnyed down a bit, while +allowing the library, etc... revisions to always be current. + +<sect1>Start the STEP by STEP instructions + +<p> +From the root home directory (/root): + +<verb> cd /root + mkdir raidboot + cd raidboot</verb> +<p> +Create a mountpoints to work on + +<verb> mkdir mnt + mkdir mnt2</verb> + +<p> +Make a file large enough to do the file system install. This +will be a lot larger than the final rescue file system. +I chose 24 megs since 16 megs is not large enough +<verb> + dd if=/dev/zero of=build bs=1024k count=24 +</verb> +associate the file with a loop device +and generate an ext2 file system on the file + +<verb> losetup /dev/loop0 build + mke2fs -v -m0 -L initrd /dev/loop0 + mount /dev/loop0 mnt +</verb> +<sect1>Install the distribution - Slackware Specific +<p> +<ref id="threads" name="...skip Slackware Specific stuff"> +and go to next section. +<p> +Now that an empty filesystem is created and mounted, run "setup". +<p> +<verb>Specify /root/raidboot/mnt</verb> +<p> +as the <bf/'target'/. The source is whatever you normally install from. +Select the packages you wish to install and proceed but <bf/DO NOT/ configure. +<p> +Choose 'EXPERT' prompting mode. +<p> +I chose 'A', 'AP, and 'N' installing only the minimum to run the system +plus an editor I am familiar with (vi, jed, joe) that is reasonably compact. +<verb> +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 +</verb> +From the 'AP series, I use only 'JOE', and editor I like, and 'MC' a +small and useful file management tool. You choose the utilities you +will need on your system. +<verb> +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 +</verb> +From the 'N' package I only loaded TCPIP. This isn't really necessary, +but is very handy and allows access to the network while working on a +repair or update with the root raid array dismounted. TCPIP also +contains 'biff' which is used by some of the applications in 'A'. If +you don't install 'N' you might want to install the biff package anyway. +<verb> +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 +</verb> +With the installation complete, say no to everything else (no to all +configuration requests) and exit the script. + +<sect1>Install linux <bf/pthreads/<label id="threads"> + +<p> +Now you must install the 'linuxthreads-0.71' library. +I have included this diff for the linuxthreads Makefile rather +than explain the details of the +installation by hand. Save the original Makefile, apply the diff +and then: + +<verb> cd /usr/src/linuxthreads-0.71 + patch + make + make install +</verb><label id="thrdiff"><verb> +-------------------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 +</verb> + +<sect1>Install Raid Tools + +<p> +The next step is the installation of the raid tools. +raidtools-0.42 +<p> +You must run the "configure" script to point the Makefile +at the build directory for the ramdisk files +<verb> + cd /usr/src/raidtools-0.42 + configure --sbindir=/root/raidboot/mnt/sbin --prefix=/root/raidboot/mnt/usr + make + make install +</verb> +Now!! the Makefile for install is not quite right so do the following +to clean up. This will be fixed in future releases so that the re-linking +will not be necessary. + +<quote>Fix the make install error</quote> + +The file links specified in the Makefile at 'LINKS' must be removed +and re-linked to operate properly. +<verb> + cd /root/raidboot/mnt/sbin + ln -fs mdadd mdrun + ln -fs mdadd mdstop +</verb> + +<sect1>Remove un-needed directories and files from new filesystem. + +<p> +Delete the following directories from filesystem +(CAUTION DON'T DELETE FROM YOUR RUNNING SYSTEM) +it's easy to do, guess how I found out!!! +<verb> + 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 +</verb> + +<sect1>Create /dev/md<it/x/ + +<p> +The last step simply copies the /dev/md* devices from the current file system +onto the rescue file system. You could create these with mknode. +<verb> + cp -a /dev/md* /root/raidboot/mnt/dev +</verb> +<sect1>Create a bare filesystem suitable for <it/initrd/ + +<p> +Now you have a clean re-useable filesystem ready for customization. +Once customized, this file system can be used for rescue should the raid +device(s) become corrupted and the raid tools needed to fix them. It will +also be used to boot and root-mount the raid device by adding the linuxrc +file which will be discussed next. +<p> +Copy the file system to a smaller device for the initrd file, +16 megs should be large enough. +<p> +Create the smaller file system and mount it +<verb> + cd /root/raidboot + dd if=/dev/zero of=bare.fs bs=1024k count=16 +</verb> +associate the file with a loop device +and generate a ext2 file system on the file +<verb> + losetup /dev/loop1 bare.fs + mke2fs -v -m0 -L initrd /dev/loop1 + mount /dev/loop1 mnt2 +</verb> +Copy the 'build' file system to 'bare.fs' +<verb> + cp -a mnt/* mnt2 +</verb> +Save the 'bare.fs' system before customization so later update is easy. +The 'build' file system is no longer needed and may be deleted. +<verb> + 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 +</verb> +<sect2>Create the BOOT/RESCUE <it><bf/initrd/</it> filesystem + +<p> +Now copy the system dependent items that match the kernel from the +development platform, or you can manually modify the files in the +rescue file system to match your target system. +<verb> + losetup /dev/loop0 rescue + mount /dev/loop0 mnt +</verb> +Make sure your etc directory is clean of <tt/*~/, core and log files. +The next 2 commands creates some warning messages, ignore them. +<verb> + 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 +</verb> +<sect2>Corrections for the Rescue System <label id="corrections"> +<p> +Edit the following files to correct them for your rescue system. Some file +names listed below are Slackware specific but have equivalents in other +distributions. +<verb> + cd mnt + +Non-network + etc/fstab + etc/mdtab should work OK +Network + etc/hosts + etc/resolv.conf + etc/hosts.equiv and related files + etc/rc.d/rc.inet1 correct ip#, mask, gateway, etc... + etc/rc.d/rc.S remove entire section on file system status + from: + # Test to see if the root partition is read-only + to but not including: + # remove /etc/mtab* so that mount will ..... + This avoids the annoying warning that + the ramdisk is mounted rw. + etc/rc.d/rc.xxxxx others as required, see later on in this doc + root/.rhosts if present + home/xxxx/xxxx others as required + + WARNING: The above procedure moves your password and shadow + files onto the rescue disk!!!!! + + WARNING: You may not wish to do this for security reasons. +</verb> +Create any directories for mounting /dev/disk... as may be required +that are unique to your system. These are the mountpoints for booting +the system (boot partition and backup boot partition). My system boot from +dos using <bf/loadlin/, however linux partition(s) and lilo will work fine. +My system uses: +<verb> + cd /root/raidboot/mnt <--- initrd root + mkdir dosa dos partition mount point + mkdir dosb dos mirror mount point +</verb> +The rescue file system is complete! +<p> +You will note upon examination of the files in the rescue file +system, that there are still many files that could be deleted. +I have not done this since it would overly complicate this +procedure and most raid systems have adequate disk and memory. +If you wish to skinny down the file system, go to it! + +<sect1>Making 'initrd' boot the RAID device - linuxrc + +<p> +To make the rescue disk boot the raid device, you need only copy +the executable script file: + +<quote><bf/linuxrc/</quote> + +to the root of the device. +<p> +The theory of operation for this <bf/linuxrc/ file is discussed in +<ref id="Appendix-G" name="Appendix G, linuxrc theory of operation">. +<p> +A very simple and much easier to understand (working) linuxrc is +included in <ref id="Appendix-D" name="Appendix D">, +<it/obsolete linuxrc and shutdown scripts/. Copy the following text to +<bf/linuxrc/ and save in your development area. + +<label id="linuxrc"> +<verb> + -------------------- 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 ---------------------- +</verb> +Add 'linuxrc' to initrd boot device +<verb> + cd /root/raidboot + chmod 777 linuxrc + cp -p linuxrc mnt +</verb> + +<sect1>Modifying the rc-scripts for SHUTDOWN <label id="modify_shutdown"> + +<p> +To complete the installation, modify the rc scripts to save +the md status to the real root device when shutdown occurs. +<verb> +In slackware this is rc.0 -> rc.6 +In debian 'bo' this is in both 'halt' and 'reboot' + +If you implement this in another distribution, please e-mail +the instructions and sample files so they can be included here. +</verb> +I have modified Bohumil Chalupa's raid stop work-around slightly. His +original solution is presented in <ref id="Appendix-A" name="Appendix A">. +<p> +Since there are no linux partitions left on the production system except +<bf/md0/, the boot partitions are used to store the <bf/raidOK readonly/ status. +I chose to write a file to each of the duplicate boot partitions containing the +status of the md array at shutdown and signifying that the +md device has been remounted RO. This allows the system to be fail safe +when any of the hard drives die. +<p> +The shutdown script is modified to call <ref id="Appendix-F" +name="rc.raidown"> which saves the necessary +information to successfully reboot and mount the raid device. Examples of +shutdown scripts for various linux distributions are shown in +<ref id="Appendix-B" name="Appendix B">. + +<p> +To capture the raid array shutdown status insert a call to +<ref id="Appendix-F" name="rc.raidown"> +after any <bf/case/ statements (if present) but before the actual shutdown +(kills, status saves, etc...) begins and before the file systems are +dismounted. +<verb> +############ Save raid boot and status info ############## +# + if [ -x /etc/rc.d/rc.raidown ]; then + /etc/rc.d/rc.raidown + fi +################## end raid boot ######################### +</verb> +After all the file systems are dismounted (the root file system +'will not' dismount) but before any powerfail status check add: +<verb> +################ 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 +########################################################## +</verb> +This will cleanly stop all raid devices except root. Root status +is passed to the next boot in <bf/raidstat.ro/. + +<p> +Copy the rc file to your new raid array, the rescue file system that is +still mounted on <bf>/root/raidboot/mnt</bf> and the development system +if it is on the same machine. + +Modify rescue <bf>etc/fstab</bf> as needed +and make sure rescue <bf/mdtab/ is correct. +<p> +Now copy the rescue disk to your dos partition and everything should +be ready to boot the raid device as root. +<verb> + umount mnt + losetup -d /dev/loop0 + gzip -9 rescue +</verb> +Copy rescue.gz to your boot partitions. +<p> +All that remains is to creat the configuration file <bf/raidboot.conf/ +and test the new file system by rebooting. + +<sect1>Configuring RAIDBOOT - raidboot.conf <label id="raidboot-conf"> +<p> +The comments following the example configuration file explain each of the +three lines. This example file is for a 4 drive raid5 scsii array with +duplicate boot partitions on drives sda1 and sdb1. Put the paramaters +descriptive of your file systems here instead. +<verb> + /dev/sda1 /dev/sdb1 + linux + raid5.conf +# comments may only be placed 'after' the three +# configuration lines. +# +# This is 'raidboot.conf' +# +# line one, the partition(s) containing the 'initrd' raid-rescue system +# It is not necessary to boot from these partitions, however, +# since the rescue system will not fit on floppy, it is necessary +# to know which partitions are to be used to load the rescue system +# +# line two, the path to the raidboot config information +# Where the shutdown status, etc... is located at boot time +# It does NOT include the mount point information, only 'path' +# /mntpoint/'path' +# +# line -3-, name of the raid configuration file +# Current raid configuration file i.e. raid1.conf, raid5.conf +</verb> + +<sect1>Kernel 'loadlin and lilo' variables for RESCUE and RAID + +<p> +There are two kernel variables for the RESCUE and RAID system, only the first need +be specified. +<itemize> +<item>Raid_Conf=msdos,/dev/sda1,raidboot +<quote>This variable points to raid boot device and configuration file. +For floppy rescue boot, you may want to specify +this on the kernel command line or in the loadlin or lilo boot file +</quote><quote> +format: <tt/'filesystem-type,device,path-to-config-from-mountpoint'/ +</quote> +<item>Raid_ALT=-r,-p5,/dev/md0,/dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3 +<quote>Alternate mdadd parameters +necessary when booting with non-redundant raid array. These are the comma +separated command line parameters for <bf/mdadd/. Unless they are needed to +start a failed/non-redundant array, COMMENT OUT OR SPECIFY WITH A 'NULL'. +</quote><quote>i.e. Raid_ALT= +</quote></itemize> +Either of these parameters may be specified in the lilo or loadlin boot parameter +file or on the loadlin kernel command line. Care must be taken that the maximum +line length is not exceeded, however, if the command line is used +(128 characters). + +<p> +When booting with <bf/lilo/, the parameters are included in the lilo config +file in the form: +<verb> +append="Raid_Conf=msdos,/dev/sda1,raidboot" +append="Raid_ALT=-r,-p5,/dev/md0,/dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3" +</verb> +See <bf/man lilo.conf/ for more detailed information. +<p>Since I have some hardware that requires DOS configuration utilities, I +have a small dos partition on the system. +Therefore, I used loadlin to boot the raid5 system from the dos +partition with a mirror (copy) on the companion disk. An identical method is +used for the raid1 system. The example below uses loadlin, but the procedure +is very similar for lilo. +<p> +My dos root system contains a small editor among the utilities so I can modify +the boot parameters of loadlin if necessary, allowing me to reboot the +linux system on my swap disk while testing. +<p> +The dos system contains this tree for linux" +<verb> + 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) + +</verb><label id="linuxbat">linux.bat contains: +<verb> +---------------------- linux.bat --------------------------- +echo "Start the LOADLIN process:" +c:\raidboot\loadlin @c:\raidboot\boot.par +-------------------- end linux.bat ------------------------- +</verb> +boot.par contains: +<verb> + # 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 + +***** >> NOTE!! the only difference between forcing the rescue system to + run and the raid device mounting, is the loadlin parameter + + root=/dev/ram0 for the rescue system + root=/dev/md0 for RAID + + With root=/dev/ram0 the RAID device will not mount + and the rescue system will run unconditionally. +</verb> + +If the RAID array fails, the rescue system is left mounted and running. + +<sect>Configuring the Production RAID system. + +<p> +<sect1>System specs. +Two systems with identical motherboards were configured. +<p> +<verb> + Raid-1 Raid-5 +Motherboard: Iwill P55TU dual ide adaptec scsi +Processor: Intel P200 +Disks: 2ea 7 gig 4 ea Segate 4.2 gig + Maxtors wide scsii +</verb> +The disk drives are designated by linux as 'sda' through 'sdd' on the raid5 +system and 'hda' and 'hdc' on the raid1 system. + +<sect1>Partitioning the hard drives. + +<p> +Since testing a large root mountable RAID array is difficult because +of the ckraid re-boot problem, I re-partitioned my swap space to include a +smaller RAID partition for testing purposes, sda6,sdb6,sdc6,sdd6, and +a small root and /usr/src partition pair for developing and testing +the raid kernel and tools. +You may find this helpful. +<verb> + <bf/DEVELOPMENT SYSTEM - RAID5/ + Device System Size Purpose + + /dev/sda1 dos boot 16 meg boot partition +* /dev/sda2 extended 130 meg (see below) + /dev/sda3 linux native 4 gig primary raid5-1 +----------------------sda2------------------------------ +* /dev/sda5 linux swap 113 meg SWAP space +* /dev/sda6 linux native 16 meg test raid5-1 +======================================================== + /dev/sdb1 dos boot 16 meg boot partition duplicate +* /dev/sdb2 extended 130 meg (see below) + /dev/sdb3 linux native 4 gig primary raid5-2 +----------------------sdb2------------------------------ +* /dev/sdb5 linux swap 113 meg SWAP space +* /dev/sdb6 linux native 16 meg test raid5-2 +======================================================== +* /dev/sdc2 extended 146 meg (see below) + /dev/sdc3 linux native 4 gig primary raid5-3 +----------------------sdc2------------------------------ +* /dev/sdc5 linux swap 130 meg development root partition +* /dev/sdc6 linux native 16 meg test raid5-3 +======================================================== +* /dev/sdd2 extended 146 meg (see below) + /dev/sdd3 linux native 4 gig primary raid5-4 +----------------------sdd2------------------------------ +* /dev/sdd5 linux swap 130 meg development /usr/src +* /dev/sdd6 linux native 16 meg test raid5-4 + + + <bf/DEVELOPMENT SYSTEM - RAID1/ + Device System Size Purpose + + /dev/hda1 dos 16meg boot partition +* /dev/hda2 extended 126m (see below) + /dev/hda3 linux 126m development root partition + /dev/hda4 linux 6+gig raid1-1 +----------------------hda2------------------------------ +* /dev/hda5 linux 26m test raid1-1 +* /dev/hda6 linux swap 100m +======================================================== + + /dev/hdc1 is simply an exact copy of hda1 so the + partion can be made active if hda fails +* /dev/hdc2 extended 126m (see below) + /dev/hdc3 linux 126m development /usr/src + /dev/hdc4 linux 6+gig raid1-2 +----------------------hdc2------------------------------ +* /dev/hdc5 linux 26m test raid1-2 +* /dev/hdc6 linux swap 100m +</verb> +The sdx2 and hdx3 partitions were switched to 'swap' after developing +this utility. I could have done it on another machine, however, +the libraries and kernels are all about a year or more out of date +on my other linux boxes and I preferred to build it on the target machine. +<p> +The partitioning scheme was chosen so that in the event that +any one of the drives fails catastrophically, the system will +continue to run and be bootable with minimum effort and NO data loss. +<itemize> +<item> If any single hard drive fails, the boot will abort, and + the rescue system will run. Examination of the screen + message or /dos<it/x//raidboot/raidstat.ro will tell the operator + the status of the failed array. +<item> If sda1 (raid5) or hda1 (raid1) fails, the dos backup boot partition + must be made 'active' and the bios must recognize the new partition + as the boot device or it must be physically be moved to the <it/x/da position. + Alternatively, the system could be booted from a floppy disk using + the initrd image on the remaining backup boot drive. + The raid system can then be made active again by issuing: +<verb> "/sbin/mkraid /etc/raid<it/x/.conf -f --only-superblock"</verb> + to rebuild the remaining superblock(s). + +<item> Once this is done, then + +<verb> mdadd -ar</verb> + +<item> Examine the status of the array to verify that everything is OK + then replace the good array reference with the current status + until the failed disk can be repaired or replaced. + +<verb> cat /proc/mdstat | grep md0 > /dosx/raidboot/raidgood.ref + + shutdown -r now +</verb> + to do a clean reboot, and the system is up again. +</itemize> +<sect>Building the RAID file system. + +<p> +This description is for my RAID systems described in the system +specs. Your system may have a different RAID architecture, so +modify as appropriate. Please read the man pages and +QuickStart.RAID that come with the raidtools-0.42 +<sect1>/etc/raid5.conf <label id="raid5configuration"> +<p> +<verb> # raid-5 configuration + raiddev /dev/md0 + raid-level 5 + nr-raid-disks 4 + chunk-size 32 + + # Parity placement algorithm + parity-algorithm left-symmetric + + # Spare disks for hot reconstruction + #nr-spare-disks 0 + + device /dev/sda3 + raid-disk 0 + + device /dev/sdb3 + raid-disk 1 + + device /dev/sdc3 + raid-disk 2 + + device /dev/sdd3 + raid-disk 3 +</verb> +<sect1>/etc/raid1.conf <label id="raid1configuration"> +<p> +<verb> + # raid-1 configuration + raiddev /dev/md0 + raid-level 1 + nr-raid-disks 2 + nr-spare-disks 0 + + device /dev/hda4 + raid-disk 0 + + device /dev/hdc4 + raid-disk 1 +</verb> +<sect1>Step by Step procedures for building production RAID file system. + +<p> +For my RAID5 system I did a complete install of: +<verb> + Slackware-3.4 any current distribution should work OK + linuxthreads-0.71 + raidtools-0.42 + linux-2.0.33 with raid145 patch and Gadi's patch +</verb> +<p> +Create and format the raid device. +<verb> + mkraid /etc/raid5.conf + mdcreate raid5 /dev/md0 /dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3 + mdadd -ar + mke2fs /dev/md0 + mkdir /md + mount -t ext2 /dev/md0 /md +</verb> +Create the reference files that reboot will use, +this may be different on your system. +<verb> + cat /proc/mdstat | grep md0 > /dosa/raidboot/raidgood.ref + cat /proc/mdstat | grep md0 > /dosb/raidboot/raidgood.ref +</verb> +Use Slackware-3.4 or another distribution to build your OS +<verb> + setup +</verb> +Specify '/md' as the target, and the source whatever your normally use. +Select and install the disksets of interest except for the kernel. +Configure the system, but skip the section on lilo and kernel booting. +Exit setup. +<p> +Install 'pthreads' +<verb> + cd /usr/src/linuxthreads-0.71 +</verb> +edit the Makefile and specify +<verb> + BUILDIR=/md + + make + make install +</verb> +Install 'raidtools' +<verb> + cd /usr/src/raidtools-0.42 + configure --sbindir=/md/sbin --prefix=/md/usr +</verb> +fix the raidtools make install error +<verb> + cd /md/sbin + rm mdrun + rm mdstop + ln -s mdadd mdrun + ln -s mdadd mdstop +</verb> +Create /dev/mdx +<verb> + cp -a /dev/md* /md/dev +</verb> +Add the system configuration from the current system (ignore errors). +<verb> + cp -dp /etc/* mnt/etc + cp -dp /etc/rc.d/* mnt/etc/rc.d (include the new rc.6) + mkdir mnt/lib/modules + cp -a /lib/modules/2.x.x mnt/lib/modules <--- your current 2.x.x +</verb> +Edit the following files to correct them for your file system +<verb> + cd /md + +Non-network + etc/fstab correct for real root and raid devices. + etc/mdtab should work OK +Network + etc/hosts + etc/resolv.conf + etc/hosts.equiv and related files + etc/rc.d/rc.inet1 correct ip#, mask, gateway, etc... + etc/rc.d/rc.S remove entire section on file system status + from: + # Test to see if the root partition isread-only + to but not including: + # remove /etc/mtab* so that mount will ..... + This avoids the annoying warning that + the ramdisk is mounted rw. + etc/rc.d/rc.xxxxx others as required + root/.rhosts if present + home/xxxx/xxxx others as required + + WARNING: The above procedure moves your password and shadow + files onto the new file system!!!!! + + WARNING: You may not wish to do this for security reasons. +</verb> +Create any directories for mounting /dev/disk... as may be required +that are unique to your system. Mine need: +<verb> + cd /md <--- new file system root + mkdir dosa dos partition mount point + mkdir dosb dos mirror mount point +</verb> +The new file system is complete. Make sure and save the md reference +status to the 'real' root device and you are ready to boot. +<p> +mount the dos partitions on dosa and dosb +<verb> + cat /proc/mdstat | grep md0 > /dosa/raidboot/raidgood.ref + cat /proc/mdstat | grep md0 > /dosb/raidboot/raidgood.ref + + mdstop /dev/md0 +</verb> + +<sect>One last thought. + +<p> +Remember that an expert is someone who knows at least 1% more +than you do about a subject. Bear this in mind when you e-mail +me for help. I'll try, but I've only done this once for raid1 and once for +raid5! + +Michael Robinton <url url="mailto:michael@bzs.org" +name="Michael@bzs.org"> + +<sect>Appendix A. - Bohumil Chalupa's md0 shutdown<label id="Appendix-A"> + +<p> +Bohumil Chalupa's post to the linux raid list on the work +around for the raid1 + 5 mdstop problem. His solution does not +address the possibility of the raid device being corrupt at shutdown. +So I have added a simple status comparison to a good reference +status at boot. This allows the operator to intervene if something +is wrong with a disk in the array. The description of this is in the +main body of this document. +<verb> +> From: Bohumil Chalupa <bochal@apollo.karlov.mff.cuni.cz> +> +> I can now boot initrd and use linuxrc to start the RAID1 array, +> then successfully switch root to /dev/md0. +> +> I don't know, however, any way how to cleanly _stop_ the array. + +Well. I have to answer myself :-) + +> Date: Mon, 29 Dec 1997 02:21:38 -0600 (CST) +> From: Edward Welbon <welbon@bga.com> +> Subject: Re: dismounting root raid device +> +> For md devices other than raid0, there is probably state that needs to +> be saved that is only known once all writes have completed. Such state +> of course can't be saved to root once it is mounted readonly. In that +> case, you would have to be able to mount a writeable filesystem "X" +> on the readonly root and be able to write to "X" (I recall doing this +> during "rescue" operations, but not as an automated procedure). +> +> The filesystem "X" would presumably be a boot device from which the raid +> (during linuxrc exection via initrd) would pickup it's initial state from. +> Fortunately raid0 isn't required to write out any state (though it would +> be pleasant to be able to write the check sums to mdtab after an mdstop). +> Eventually, I will fiddle with this but it doesn't seem difficult though +> the "devil" is always in the "details". + +Yes, that's it. +I had this idea in mind for some time already, but had no time to try it. +Yesterday I did, and it works. + +With my RAID1 (mirror), I don't save any checksums or raid superblock data. +I only save an information on the "real" boot partition, that the root md +volume was remounted readonly during shutdown. Then, during boot, the +linuxrc script runs mkraid --only-superblock when it finds this +information; otherwise, it runs ckraid. +This means, that the raid superblock information is not updated during +shutdown; it's updated at the boot time. +It is not very clean, I'm afraid, :-( but it works. + +I'm using Slackware and initrd.md by Edward Welbon to boot the root raid +device. +As far as I remember now, the only modified files are +mkdisk and linuxrc, and /etc/rc.d/rc.6 shutdown script. +And lilo.conf, of course. + +I'm appending the important parts. + +Bohumil Chalupa + +--------------- my.linuxrc follows ----------------- +#!/bin/sh +# we need /proc +/bin/mount /proc +# start up the md0 device. let the /etc/rc.d scripts get the rest of them +# we should do as little as possible here +# ________________________________________ +# root raid1 shutdown test & recreation +# /start must be created on the rd image in my.mkdisk +echo "preparing md0: mounting /start" +/bin/mount /dev/sda2 /start -t ext2 +echo "reading saved md0 state from /start" +if [ -f /start/root.raid.ok ]; then + echo "raid ok, modyfying superblock" + rm /start/root.raid.ok + /sbin/mkraid /etc/raid1.conf -f --only-superblock +else + echo "raid not clean, runing ckraid --fix" + /sbin/ckraid --fix /etc/raid1.conf +fi +echo "unmounting /start" +/bin/umount /start +# _________________________________________ +# +echo "adding md0 for root file system" +/sbin/mdadd /dev/md0 /dev/sda1 /dev/sdb1 +echo "starting md0" +/sbin/mdrun -p1 /dev/md0 +# tell kernel we want to switch to /dev/md0 as root device, the 0x900 value +# is arrived at via 256*major_device_number + minor_device number. +echo "setting real-root-dev" +/bin/echo 0x900>/proc/sys/kernel/real-root-dev +# unmount /proc so that the ram disk can be deallocated. +echo "unmounting /proc" +/bin/umount /proc +/bin/echo "We are hopefully ready to mount /dev/md0 (major 9, minor 0) as +root" +exit +--------------- end of my.linuxrc ---------------------------------- + + +----------- extract from /etc/rc.d/rc.6 follows ----------------- + # Turn off swap, then unmount local file systems. + echo "Turning off swap." + swapoff -a + echo "Unmounting local file systems." + umount -a -tnonfs + # Don't remount UMSDOS root volumes: + if [ ! "`mount | head -1 | cut -d ' ' -f 5`" = "umsdos" ]; then + mount -n -o remount,ro / + fi + + # Save raid state + echo "Saving RAID state" + /bin/mount -n /dev/sda2 /start -t ext2 + touch /start/root.raid.ok + /bin/umount -n /start + +-------------- end of excerpt from rc.6 ------------------------ + + +------------------ part of my.mkdisk follows ---------------------- +# +# now we have the filesystem ready to be populated, we need to +# get a few important directories. I had endless trouble till +# I created a pristine mtab. In my case, it is convenient that +# /etc/mdtab is copied over, this way I can activate md with +# a simple "/sbin/mdadd -ar" in linuxrc. +# +cp -a $ROOT/etc $MOUNTPNT 2>cp.stderr 1>cp.stdout +rm -rf $MOUNTPNT/etc/mtab +rm -rf $MOUNTPNT/etc/ppp* +rm -rf $MOUNTPNT/etc/termcap +rm -rf $MOUNTPNT/etc/sendmail* +rm -rf $MOUNTPNT/etc/rc.d +rm -rf $MOUNTPNT/etc/dos* +cp -a $ROOT/sbin $ROOT/dev $ROOT/lib $ROOT/bin $MOUNTPNT 2>>cp.stderr +1>>cp.stdout +# _____________________________________________________________________ +# RAID: will need mkraid and ckraid +cp -a $ROOT/usr/sbin/mkraid $ROOT/usr/sbin/ckraid $MOUNTPNT/sbin +2>>cp.stderr 1>>cp.stdout +# --------------------------------------------------------------------- +# it seems that init wont come out to play unless it has utmp. this can +# probably be pruned back alot. no telling what the real bug was 8-). +# +mkdir $MOUNTPNT/var $MOUNTPNT/var/log $MOUNTPNT/var/run $MOUNTPNT/initrd +touch $MOUNTPNT/var/run/utmp $MOUNTPNT/etc/mtab +chmod a+r $MOUNTPNT/var/run/utmp $MOUNTPNT/etc/mtab +ln -s /var/run/utmp $MOUNTPNT/var/log/utmp +ln -s /var/log/utmp $MOUNTPNT/etc/utmp +ls -lstrd $MOUNTPNT/etc/utmp $MOUNTPNT/var/log/utmp $MOUNTPNT/var/run/utmp +# +# since I wanted to change the mount point, I needed this though +# I suppose that I could have done a "mkdir /proc" in linuxrc. +# +mkdir $MOUNTPNT/proc +chmod 555 $MOUNTPNT/proc +# +# ------------------------------------------------------ +# we'll mount the real boot device to /start temporarily +# to check the root raid state saved at shutdown time +# +mkdir $MOUNTPNT/start +# ------------------------------------------------------- +# +# need linuxrc (it is, after all, the point of this exercise). +# +if [ -x ./my.linuxrc ]; then + cp -a ./my.linuxrc $MOUNTPNT/linuxrc + chmod 777 $MOUNTPNT/linuxrc +else + ln -s /bin/sh $MOUNTPNT/linuxrc +fi +# +----------------- part of my.mkdisk ends ----------------- +</verb> + +<sect>Appendix B. - Sample SHUTDOWN scripts <label id="Appendix-B"> + +<p><itemize> +<item><ref id="Slackware" name="Slackware"> +<item><ref id="Debian" name="Debian"> +</itemize> + +<sect1>Slackware - /etc/rc.d/rc.6 <label id="Slackware"> +<p> +<verb> +#! /bin/sh +# +# rc.6 This file is executed by init when it goes into runlevel +# 0 (halt) or runlevel 6 (reboot). It kills all processes, +# unmounts file systems and then either halts or reboots. +# +# Version: @(#)/etc/rc.d/rc.6 1.50 1994-01-15 +# +# Author: Miquel van Smoorenburg <miquels@drinkel.nl.mugnet.org> +# Modified by: Patrick J. Volkerding, <volkerdi@ftp.cdrom.com> +# +# Modified by: Michael A. Robinton < michael@bizsystems.com > +# to add call to rc.raidown + # Set the path. + PATH=/sbin:/etc:/bin:/usr/bin + + # Set linefeed mode to avoid staircase effect. + stty onlcr + + echo "Running shutdown script $0:" + + # Find out how we were called. + case "$0" in + *0) + message="The system is halted." + command="halt" + ;; + *6) + message="Rebooting." + command=reboot + ;; + *) + echo "$0: call me as \"rc.0\" or \"rc.6\" please!" + exit 1 + ;; + esac + +############ Save raid boot and status info ############## +# +if [ -x /etc/rc.d/rc.raidown ]; then + /etc/rc.d/rc.raidown +fi +################## end raid boot ######################### + + # Kill all processes. + # INIT is supposed to handle this entirely now, but this didn't always + # work correctly without this second pass at killing off the processes. + # Since INIT already notified the user that processes were being killed, + # we'll avoid echoing this info this time around. + if [ "$1" != "fast" ]; then # shutdown did not already kill all processes + killall5 -15 + killall5 -9 + fi + + # Try to turn off quota and accounting. + if [ -x /usr/sbin/quotaoff ] + then + echo "Turning off quota." + /usr/sbin/quotaoff -a + fi + if [ -x /sbin/accton ] + then + echo "Turning off accounting." + /sbin/accton + fi + + # Before unmounting file systems write a reboot or halt record to wtmp. + $command -w + + # Save localtime + [ -e /usr/lib/zoneinfo/localtime ] && cp /usr/lib/zoneinfo/localtime /etc + + # Asynchronously unmount any remote filesystems: + echo "Unmounting remote filesystems." + umount -a -tnfs & + + # Turn off swap, then unmount local file systems. + echo "Turning off swap." + swapoff -a + echo "Unmounting local file systems." + umount -a -tnonfs + # Don't remount UMSDOS root volumes: + if [ ! "`mount | head -1 | cut -d ' ' -f 5`" = "umsdos" ]; then + mount -n -o remount,ro / + fi + +################ 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 +########################################################## + + # See if this is a powerfail situation. + if [ -f /etc/powerstatus ]; then + echo "Turning off UPS, bye." + /sbin/powerd -q + exit 1 + fi + + # Now halt or reboot. + echo "$message" + [ ! -f /etc/fastboot ] && echo "On the next boot fsck will be FORCED." + $command -f +############### end rc.6 ################################# +</verb> + +<sect1>Debian bo - /etc/init.d/halt and /etc/init.d/reboot <label id="Debian"> +<p> +The modifications shown here for Debian bo halt and reboot files are NOT +TESTED. When you test this, please e-mail me so I can remove this comment. + +<sect2>/etc/init.d/halt +<p> +<verb> +#! /bin/sh +# +# halt The commands in this script are executed as the last +# step in runlevel 0, ie halt. +# +# Version: @(#)halt 1.10 26-Apr-1997 miquels@cistron.nl +# + +PATH=/sbin:/bin:/usr/sbin:/usr/bin + +############ Save raid boot and status info ############## +# +if [ -x /etc/rc.d/rc.raidown ]; then + /etc/rc.d/rc.raidown +fi +################## end raid boot ######################### + +# Kill all processes. +echo -n "Sending all processes the TERM signal... " +killall5 -15 +echo "done." +sleep 5 +echo -n "Sending all processes the KILL signal... " +killall5 -9 +echo "done." + +# Write a reboot record to /var/log/wtmp. +halt -w + +# Save the random seed between reboots. +/etc/init.d/urandom stop + +echo -n "Deactivating swap... " +swapoff -a +echo "done." + +echo -n "Unmounting file systems... " +umount -a +echo "done." + +mount -n -o remount,ro / + +################ 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 +########################################################## + +# See if we need to cut the power. +if [ -x /etc/init.d/ups-monitor ] +then + /etc/init.d/ups-monitor poweroff +fi + +halt -d -f +############# end halt #################### +</verb> +<sect2>/etc/init.d/reboot +<p> +<verb> +#! /bin/sh +# +# reboot The commands in this script are executed as the last +# step in runlevel 6, ie reboot. +# +# Version: @(#)reboot 1.9 02-Feb-1997 miquels@cistron.nl +# + +PATH=/sbin:/bin:/usr/sbin:/usr/bin + +############ Save raid boot and status info ############## +# +if [ -x /etc/rc.d/rc.raidown ]; then + /etc/rc.d/rc.raidown +fi +################## end raid boot ######################### + +# Kill all processes. +echo -n "Sending all processes the TERM signal... " +killall5 -15 +echo "done." +sleep 5 +echo -n "Sending all processes the KILL signal... " +killall5 -9 +echo "done." + +# Write a reboot record to /var/log/wtmp. +halt -w + +# Save the random seed between reboots. +/etc/init.d/urandom stop + +echo -n "Deactivating swap... " +swapoff -a +echo "done." + +echo -n "Unmounting file systems... " +umount -a +echo "done." + +mount -n -o remount,ro / + +################ 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 +########################################################## + +echo -n "Rebooting... " +reboot -d -f -i +</verb> + +<sect>Appendix C. - other setup files + +<p> +<sect1>linuxrc <ref id="linuxrc" name="linuxrc file"> +<p> +<sect1>loadlin -- linux.bat file - boot.par <ref id="linuxbat" name="linux.bat file - boot.par"> +<p> +<sect1>linuxthreads Makefile.diff <ref id="thrdiff" + name="linuxthreads Makefile.diff"> +<p> +<sect1>raid1.conf <ref id="raid1configuration" name="raid1.conf"> +<p> +<sect1>raid5.conf <ref id="raid5configuration" name="raid5.conf"> +<p> +<sect1>raidboot.conf <ref id="raidboot-conf" name="raidboot.conf"> +<p> +<sect1>rc.raidown <ref id="Appendix-F" name="rc.raidown"> + +<sect>Appendix D. - obsolete linuxrc and shutdown scripts <label id="Appendix-D"> + +<p> +<sect1>Obsolete working - linuxrc +<p> +This linuxrc file works fine with the shutdown procedure in the next +subsection. +<verb> + ---------------------- linuxrc -------------------- +#!/bin/sh +# ver 1.07 2-12-98 +# linuxrc - for raid1 using small dos partition and loadlin +# + +# mount the proc file system +/bin/mount /proc + +# This may vary for your system. +# Mount the dos partitions, try both +# in case one disk is dead +/bin/mount /dosa +/bin/mount /dosc + +# Set a flag in case the raid status file is not found +# then check both drives for the status file +RAIDOWN="raidstat.ro not found" +/bin/echo "Reading md0 shutdown status." +if [ -f /dosa/raidboot/raidstat.ro ]; then + RAIDOWN=`/bin/cat /dosa/raidboot/raidstat.ro` + RAIDREF=`/bin/cat /dosc/raidboot/raidgood.ref` +else + if [ -f /dosc/raidboot/raidstat.ro ]; then + RAIDOWN=`/bin/cat /dosc/raidboot/raidstat.ro` + RAIDREF=`/bin/cat /dosc/raidboot/raidgood.ref` + fi +fi + +# Test for a clean shutdown with all disks operational +if [ "${RAIDOWN} != ${RAIDREF}" ]; then + echo "ERROR ${RAIDOWN}" +# Use the next 2 lines to BAIL OUT and leave rescue running + /bin/echo 0x100>/proc/sys/kernel/real-root-dev + exit # leaving the error files in dosa/raidboot,etc... +fi + +# The raid array is clean, proceed by removing +# status file and writing a clean superblock +/bin/rm /dosa/raidboot/raidstat.ro +/bin/rm /dosc/raidboot/raidstat.ro +/sbin/mkraid /etc/raid1.conf -f --only-superblock + +/bin/umount /dosa +/bin/umount /dosc + +# Mount raid array +echo "Mounting md0, root filesystem" +/sbin/mdadd -ar + +# If there are errors - BAIL OUT and leave rescue running +if [ $? -ne 0 ]; then + echo "RAID device has errors" +# Use the next 3 lines to BAIL OUT + /bin/rm /etc/mtab # remove bad mtab + /bin/echo 0x100>/proc/sys/kernel/real-root-dev + exit +fi + +# else tell the kernel to switch to /dev/md0 as the /root device +# The 0x900 value the device number calculated by: +# 256*major_device_number + minor_device number +/bin/echo 0x900>/proc/sys/kernel/real-root-dev + +# umount /proc to deallocate initrd device ram space +/bin/umount /proc +/bin/echo "/dev/md0 mounted as root" +exit +#------------------ end linuxrc ---------------------- +</verb> + +<sect1>Obsolete working - shutdown scripts +<p> +This shutdown procedure works fine with the preceeding <bf/linuxrc/ +<p> +To capture the raid array shutdown status, +just before the file systems are dismounted insert: +<verb> + RAIDSTATUS=`/bin/cat /proc/mdstat | /usr/bin/grep md0` +</verb> +After all the file systems are dismounted (the root file system +'will not' dismount) add: +<verb> + # root device remains mounted RO + # mount dos file systems RW + mount -n -o remount,ro / + echo "Writing RAID read-only boot FLAG(s)." + mount -n /dosa + mount -n /dosc + # create raid mounted RO flag in duplicate + # containing the shutdown status of the raid array + echo ${RAIDSTATUS} > /dosa/raidboot/raidstat.ro + echo ${RAIDSTATUS} > /dosc/raidboot/raidstat.ro + + umount -n /dosa + umount -n /dosc + + # Stop all the raid arrays (except root) + echo "Stopping raid" + mdstop -a +</verb> +This will cleanly stop all raid devices except root. Root status +is passed to the next boot in <bf/raidstat.ro/. +<p> +The complete shutdown script from my old raid1 Slackware system follows, I +have switched raid1 to the new procedure with the /etc/raidboot.conf file. +<verb> +#! /bin/sh +# +# rc.6 This file is executed by init when it goes into runlevel +# 0 (halt) or runlevel 6 (reboot). It kills all processes, +# unmounts file systems and then either halts or reboots. +# +# Version: @(#)/etc/rc.d/rc.6 1.50 1994-01-15 +# +# Author: Miquel van Smoorenburg <miquels@drinkel.nl.mugnet.org> +# Modified by: Patrick J. Volkerding, <volkerdi@ftp.cdrom.com> +# Modified by: Michael A. Robinton, <michael@bzs.org> for RAID shutdown + + # Set the path. + PATH=/sbin:/etc:/bin:/usr/bin + + # Set linefeed mode to avoid staircase effect. + stty onlcr + + echo "Running shutdown script $0:" + + # Find out how we were called. + case "$0" in + *0) + message="The system is halted." + command="halt" + ;; + *6) + message="Rebooting." + command=reboot + ;; + *) + echo "$0: call me as \"rc.0\" or \"rc.6\" please!" + exit 1 + ;; + esac + + # Kill all processes. + # INIT is supposed to handle this entirely now, but this didn't always + # work correctly without this second pass at killing off the processes. + # Since INIT already notified the user that processes were being killed, + # we'll avoid echoing this info this time around. + if [ "$1" != "fast" ]; then # shutdown did not already kill all processes + killall5 -15 + killall5 -9 + fi + + # Try to turn off quota and accounting. + if [ -x /usr/sbin/quotaoff ] + then + echo "Turning off quota." + /usr/sbin/quotaoff -a + fi + if [ -x /sbin/accton ] + then + echo "Turning off accounting." + /sbin/accton + fi + + # Before unmounting file systems write a reboot or halt record to wtmp. + $command -w + + # Save localtime + [ -e /usr/lib/zoneinfo/localtime ] && cp /usr/lib/zoneinfo/localtime /etc + + # Asynchronously unmount any remote filesystems: + echo "Unmounting remote filesystems." + umount -a -tnfs & + + # you must have issued + # 'cat /proc/mdstat | grep md0 > {your boot vol}/raidboot/raidgood.ref' + # before linuxrc will execute properly with this info + RAIDSTATUS=`/bin/cat /proc/mdstat | /usr/bin/grep md0 # capture raid status` + + # Turn off swap, then unmount local file systems. + # clearing mdtab as well + echo "Turning off swap." + swapoff -a + echo "Unmounting local file systems." + umount -a -tnonfs + + # Don't remount UMSDOS root volumes: + if [ ! "`mount | head -1 | cut -d ' ' -f 5`" = "umsdos" ]; then + mount -n -o remount,ro / + fi + + # root device remains mounted + # mount dos file systems RW + echo "Writing RAID read-only boot FLAG(s)." + mount -n /dosa + mount -n /dosc + # create raid mounted RO flag in duplicate + # containing the shutdown status of the raid array + echo ${RAIDSTATUS} > /dosa/raidboot/raidstat.ro + echo ${RAIDSTATUS} > /dosc/raidboot/raidstat.ro + + umount -n /dosa + umount -n /dosc + + # Stop all the raid arrays (except root) + echo "Stopping raid" + mdstop -a + + # See if this is a powerfail situation. + if [ -f /etc/power_is_failing ]; then + echo "Turning off UPS, bye." + /sbin/powerd -q + exit 1 + fi + + # Now halt or reboot. + echo "$message" + [ ! -f /etc/fastboot ] && echo "On the next boot fsck will be FORCED." + $command -f +</verb> + + +<sect>Appendix E. - Gadi's raid stop patch for the linux kernel <label +id="Appendix-E"> + +<p> +<verb> +--- linux/drivers/block/md.c.old Fri Nov 21 13:37:11 1997 ++++ linux/drivers/block/md.c Sat Dec 6 13:34:28 1997 +@@ -622,8 +622,13 @@ + return do_md_run (minor, (int) arg); + + case STOP_MD: +- return do_md_stop (minor, inode); +- ++ err = do_md_stop(minor, inode); ++ if (err) { ++ printk("md: enabling auto mdstop for %s\n", +kdevname(inode->i_rdev)); ++ md_dev[minor].auto_mdstop = 1; ++ } ++ return err; ++ + case BLKGETSIZE: /* Return device size */ + if (!arg) return -EINVAL; + err=verify_area (VERIFY_WRITE, (long *) arg, sizeof(long)); +@@ -692,6 +697,10 @@ + + sync_dev (inode->i_rdev); + md_dev[minor].busy--; ++ if (!md_dev[minor].busy && md_dev[minor].auto_mdstop) { ++ do_md_stop(minor, inode); ++ md_dev[minor].auto_mdstop = 0; ++ } + } + + static int md_read (struct inode *inode, struct file *file, +--- linux/include/linux/md.h~ Fri Nov 21 13:29:14 1997 ++++ linux/include/linux/md.h Fri Nov 21 13:29:14 1997 +@@ -260,6 +260,7 @@ + int repartition; + int busy; + int nb_dev; ++ int auto_mdstop; + void *private; + }; +</verb> +<sect>Appendix F. - rc.raidown <label id="Appendix-F"> + +<p> +Copy the following text into the script file <bf/rc.raidown/ and save it in +<bf>/etc/rc.d</bf>. +<verb> +#! /bin/sh +# +# rc.raidown This file is executed by init when it goes into runlevel +# 0 (halt) or runlevel 6 (reboot). It saves the status of +# a root mounted raid array for subsequent re-boot +# +# Version: 1.08 3-25-98 Michael A. Robinton < michael@bizsystems.com > +# +############ Save raid boot and status info ############## +if [ -f /etc/raidboot.conf ] +then + { + read RaidBootDevs + read RaidStatusPath + read RaidConfigEtc + } < /etc/raidboot.conf + +# you must have issued +# cat /proc/mdstat | grep md0 > +# {your boot vol mnt(s)}/{RaidStatusPath}/raidgood.ref +# before linuxrc will execute properly with this info +# +# capture raid status + RAIDSTATUS=`/bin/cat /proc/mdstat | /usr/bin/grep md0` + mkdir /tmp/raid$$ + echo "Writing RAID read-only boot FLAG(s)." + for Device in ${RaidBootDevs} + do +# get mount point for raid boot device or use tmp + RBmount=$( cat /proc/mounts | /usr/bin/grep ${Device} ) + if [ -n ${RBmounts} ]; then + RBmount=$( echo ${RBmount} | cut -f 2 -d ' ' ) + else + RBmount="/tmp/raid$$" + mount ${Device} ${RBmount} + fi + if [ -d ${RBmount}/${RaidStatusPath} ]; then +# Create raid mounted RO flag = shutdown status of raid array + echo ${RAIDSTATUS} > ${RBmount}/${RaidStatusPath}/raidboot.ro +# Don't propagate 'fstab' from ramdisk + if [ -f /linuxrc ]; then + FSTAB= + else + FSTAB=fstab + fi + pushd /etc +# Save etc files for rescue system + /bin/tar --ignore-failed-read \ + -cf ${RBmount}/${RaidStatusPath}/raidboot.etc \ + raid*.conf mdtab* ${FSTAB} lilo.conf + popd +# Create new raidboot.cfg + { + /bin/echo ${RaidBootDevs} + /bin/echo ${RaidStatusPath} + /bin/echo ${RaidConfigEtc} + } > ${RBmount}/${RaidStatusPath}/raidboot.cfg + /bin/umount ${RBmount} + fi + done + rmdir /tmp/raid$$ + echo "Raid boot armed" +fi +################## end raid boot ######################### +</verb> +<sect>Appendix G. - linuxrc theory of operation <label id="Appendix-G"> +<p> + This is the complex form of the linuxrc file for root mounted raid. + It must be processed with 'bash' or another shell that recognizes + shell functions. +<p> + The advantage is that it is generic and is not dependent on startup + files and parameters located in the <bf/initrd/ image. +<p> + A <bf/Raid_Conf/ parameter passed to <bf/linuxrc/ by the kernel at boot + from lilo or loadlin contains a pointer to the boot devices and +location the of + initial 2 raidboot files needed by <bf/linuxrc/ (<it>raidboot.etc and +raidboot.cfg placed by the shutdown script</it>). +<quote> + <bf/raidboot.etc/ containing the 'tar'ed files: +<verb> + raid* + mdtab* + fstab + lilo.conf ( if applicable ) +</verb> +from the primary system that are transferred to the + initrd <bf>/etc</bf>etc directory at startup. With care, this file may + be edited if necessary when your system 'really' crashes. +<p> +<bf/raidboot.cfg/ contains the name of the boot partition in use + and applicable backup(s) as well as the path to the rest of + the raid start up file used by <bf/linuxrc/. + This file is normally created by the shutdown file + and may be created manually if necessary. +<p> +<bf/raidboot.cfg/ is of the form, 3 lines - no comments +<verb> + /dev/bootdev1 /dev/bootdev2 [/dev/bootdev3 ... and so on] + raid-status/path + name_of_raidX.conf_file +</verb><quote> + the <bf>raid-status/path</bf> does not include the name of the mountpoint +<p> + the <bf/raidX.conf/ filename is that one found in /etc + and normally used for <bf/ckraid/ and <bf/mkraid/. +</quote></quote> + The following additional files reside on the permanent raid boot partitions. + This is usually the same as above, but in emergency situations + may be loaded from anywhere they are available, such as a floppy boot disk. +<itemize> +<item><bf/raidgood.ref/ created by the command + cat /proc/mdstat | grep md0 > /{raid_status_path}/raidgood.ref +<p> + See the <ref id="modify_shutdown" name="shutdown scripts"> + for saving this file and the next +<p> +<item><bf/raidstat.ro/ created at each shutdown by the shutdown rc file, + saving the exit status of the raid array. +</itemize> + +<!-- RedHat Stuff --> +<sect>Appendix H. Setting up ROOT RAID on RedHat<label id="RedHat"> + +<p> +From the <url url="mailto:linux-raid@vger.rutgers.edu" +name="linux-raid@vger.rutgers.edu"> mail list. + +<verb> +! Has anyone figured out how to do root-mounted RAID (as per +! the Root-RAID HOWTO) using RedHat? The problem is that there +! is no equivalent of Slackware's setup to install the root +! filesystem to the RAID device. All RedHat installs have to +! run from the install floppy, which makes it almost +! impossible to get at the md devices and utilities during the +! install. +! +! I think it's much easier to go out of the distribution and do it by +! hand!! + +Assuming you have enough RAM (or a spare hard disk), install a minimal +system onto what will be your swap space (or onto your spare hard disk) +and/or /boot. Now do your mkraid, your mke2fs, mdrun, and mount. Next, do: + + tar clf - / | tar xpfC - /mnt/raidwasmountedhere + +(you may want a "v" in the second tar's flags) +Once this is done, you can set up lilo (or whatever) so that the new +raid partition is root. Then go in with RPM and/or glint (I hate +glint's behavior in the face of failed dependencies, which was fixed +but they broke it again for RH5.0 plus you can go back and forth +forever between an old and a new version of a package without +realizing the other version is installed) and install what you +really wanted. + +All this assuming you couldn't sneak in at some point in the install +and do your mkraid then at the VC with the shell prompt... + +! I'm building a server at the moment and I think it would be tidier +! and less likely to cause problems in the future if I start with +! glibc2, rather than move to it later. +! +! Me too. +! +! The reason I'd like to be able to use RedHat is that they +! are the only major distribution that I know of with a +! glibc2-based release. +! +! Debian works fine with me. There isn't a CD yet, but you can grab the +! distribution by ftp. + +I avoided root-raid like the plague, largely because initrd is an +extra, very fragile step (having to rdev, and having lilo depend on +the bios' ID number to find the kernel's partition, are bad enough!). +However, Red Hat does have a nice mkinitrd script, needed since they +left all their SCSI drivers modular. Hack that to include your +raid utils, make sure your mdadd -ar is in the right spot in +/etc/rc.d/rc.sysinit (before any fscking) and make sure mdstop -a is +in /etc/rc.d/init.d/halt after the RO-remount of /, and go for it! +</verb> +<quote> + Keith <url url="mailto:kwrohrer@enteract.com" +name="kwrohrer@enteract.com"> +</quote> +</article>