2673 lines
86 KiB
Plaintext
2673 lines
86 KiB
Plaintext
|
Root RAID HOWTO cookbook
|
|||
|
Michael A. Robinton, michael@bzs.org
|
|||
|
<mailto:michael@bzs.org>
|
|||
|
v1.13, July 17, 2000
|
|||
|
|
|||
|
This document only applys to the 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 raid<69>
|
|||
|
tools and accompanying kernel patch to the 2.0.37, 2.2x and 2.3x
|
|||
|
series kernels. You may find the detailed descriptions useful, partic<69>
|
|||
|
ularly if you plan to run root raid or use initrd. Check these links
|
|||
|
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 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 ini<6E>
|
|||
|
trd. 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 linuxrc initrd file
|
|||
|
which may be configured with a single three line ``/etc/raid<69>
|
|||
|
boot.conf'' file for raid1 and raid5 configurations.
|
|||
|
______________________________________________________________________
|
|||
|
|
|||
|
Table of Contents
|
|||
|
|
|||
|
|
|||
|
|
|||
|
1. Introduction
|
|||
|
|
|||
|
1.1 Where to get Up-to-date copies of this document.
|
|||
|
1.2 More up-to-date Boot Root Raid with LILO howto
|
|||
|
1.3 Bugs
|
|||
|
1.4 Acknowledgements
|
|||
|
1.5 Copyright Notice
|
|||
|
|
|||
|
2. What you need BEFORE YOU START
|
|||
|
|
|||
|
2.1 Required Packages
|
|||
|
2.2 Other similar implementations.
|
|||
|
2.3 Documentation -- Recommended Reading
|
|||
|
2.4 RAID resources
|
|||
|
|
|||
|
3. Quick Start for ROOT RAID
|
|||
|
|
|||
|
4. (IT
|
|||
|
|
|||
|
4.1 Security Reminder
|
|||
|
4.2 Build the Kernel and Raid Tools
|
|||
|
4.3 Build the
|
|||
|
4.4 Start the STEP by STEP instructions
|
|||
|
4.5 Install the distribution - Slackware Specific
|
|||
|
4.6 Install linux
|
|||
|
4.7 Install Raid Tools
|
|||
|
4.8 Remove un-needed directories and files from new filesystem.
|
|||
|
4.9 Create /dev/md
|
|||
|
4.10 Create a bare filesystem suitable for
|
|||
|
4.10.1 Create the BOOT/RESCUE
|
|||
|
4.10.2 Corrections for the Rescue System
|
|||
|
4.11 Making 'initrd' boot the RAID device - linuxrc
|
|||
|
4.12 Modifying the rc-scripts for SHUTDOWN
|
|||
|
4.13 Configuring RAIDBOOT - raidboot.conf
|
|||
|
4.14 Kernel 'loadlin and lilo' variables for RESCUE and RAID
|
|||
|
|
|||
|
5. Configuring the Production RAID system.
|
|||
|
|
|||
|
5.1 System specs. Two systems with identical motherboards were configured.
|
|||
|
5.2 Partitioning the hard drives.
|
|||
|
|
|||
|
6. Building the RAID file system.
|
|||
|
|
|||
|
6.1 /etc/raid5.conf
|
|||
|
6.2 /etc/raid1.conf
|
|||
|
6.3 Step by Step procedures for building production RAID file system.
|
|||
|
|
|||
|
7. One last thought.
|
|||
|
|
|||
|
8. Appendix A. - Bohumil Chalupa's md0 shutdown
|
|||
|
|
|||
|
9. Appendix B. - Sample SHUTDOWN scripts
|
|||
|
|
|||
|
9.1 Slackware - /etc/rc.d/rc.6
|
|||
|
9.2 Debian bo - /etc/init.d/halt and /etc/init.d/reboot
|
|||
|
9.2.1 /etc/init.d/halt
|
|||
|
9.2.2 /etc/init.d/reboot
|
|||
|
|
|||
|
10. Appendix C. - other setup files
|
|||
|
|
|||
|
10.1 linuxrc
|
|||
|
10.2 loadlin -- linux.bat file - boot.par
|
|||
|
10.3 linuxthreads Makefile.diff
|
|||
|
10.4 raid1.conf
|
|||
|
10.5 raid5.conf
|
|||
|
10.6 raidboot.conf
|
|||
|
10.7 rc.raidown
|
|||
|
|
|||
|
11. Appendix D. - obsolete linuxrc and shutdown scripts
|
|||
|
|
|||
|
11.1 Obsolete working - linuxrc
|
|||
|
11.2 Obsolete working - shutdown scripts
|
|||
|
|
|||
|
12. Appendix E. - Gadi's raid stop patch for the linux kernel
|
|||
|
|
|||
|
13. Appendix F. - rc.raidown
|
|||
|
|
|||
|
14. Appendix G. - linuxrc theory of operation
|
|||
|
|
|||
|
15. Appendix H. Setting up ROOT RAID on RedHat
|
|||
|
|
|||
|
|
|||
|
|
|||
|
______________________________________________________________________
|
|||
|
|
|||
|
1. Introduction
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
1.1. Where to get Up-to-date copies of this document.
|
|||
|
|
|||
|
Click here to browse the author's latest version
|
|||
|
<ftp://ftp.bizsystems.com/pub/raid/Root-RAID-HOWTO.html> of this
|
|||
|
document. Corrections and suggestions welcome!
|
|||
|
|
|||
|
Root-RAID-HOWTO -- OBSOLETE
|
|||
|
|
|||
|
Available in LaTeX (for DVI and PostScript), plain text, and HTML.
|
|||
|
|
|||
|
http://www.linuxdoc.org/HOWTO/Root-RAID-HOWTO.html
|
|||
|
<http://www.linuxdoc.org/HOWTO/Root-RAID-HOWTO.html>
|
|||
|
|
|||
|
|
|||
|
Available in SGML and HTML.
|
|||
|
|
|||
|
ftp.bizsystems.net/pub/raid/ <ftp://ftp.bizsys<79>
|
|||
|
tems.net/pub/raid/>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
1.2. More up-to-date Boot Root Raid with LILO howto
|
|||
|
|
|||
|
Available in LaTeX (for DVI and PostScript), plain text, and HTML.
|
|||
|
|
|||
|
http://www.linuxdoc.org/HOWTO/Boot+Root+Raid+LILO.html
|
|||
|
<http://www.linuxdoc.org/HOWTO/Boot+Root+Raid+LILO.html>
|
|||
|
|
|||
|
|
|||
|
Available in SGML and HTML.
|
|||
|
|
|||
|
ftp.bizsystems.net/pub/raid/ <ftp://ftp.bizsys<79>
|
|||
|
tems.net/pub/raid/>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
1.3. Bugs
|
|||
|
|
|||
|
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 ckraid the 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.
|
|||
|
|
|||
|
The workaround stores the status of the array at shutdown on the 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.
|
|||
|
|
|||
|
Rebuilding the superblock causes the system to ignore that the array
|
|||
|
was powered down without mdstop by marking all the drives as 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.
|
|||
|
|
|||
|
None of this applies to raid0 which does not have to be mdstopped
|
|||
|
before shutdown.
|
|||
|
|
|||
|
Final proposed solutions to this problem include a finalrd similar to
|
|||
|
initrd, and mdrootstop which writes the 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!!!
|
|||
|
|
|||
|
|
|||
|
1.4. Acknowledgements
|
|||
|
|
|||
|
The writings and e-mail from the following individuals helped to make
|
|||
|
this document possible. Many of the ideas were stolen from the
|
|||
|
helpful work of others, I have just tried to put it all in COOKBOOK
|
|||
|
form so that it is straightforward to use. My thanks to:
|
|||
|
|
|||
|
<20> Linas Vepstas <mailto:linas@linas.org>
|
|||
|
for the RAID howto that explained most of this to me.
|
|||
|
|
|||
|
<20> Gadi Oxman <mailto:gadio@netvision.net.il>
|
|||
|
for answering my dumb 'newbie' questions.
|
|||
|
|
|||
|
<20> Ed Welbon <mailto:welbon@bga.com>
|
|||
|
for the execellent initrd.md package that inspired me to write
|
|||
|
this.
|
|||
|
|
|||
|
<20> Bohumil Chalupa <mailto:bochal@apollo.karlov.mff.cuni.cz> for
|
|||
|
implementing the re-boot 'workaround' that allows root-mounted-raid
|
|||
|
to work in a production environment.
|
|||
|
|
|||
|
<20> Keith W. <mailto:kwrohrer@ce.mediaone.net> for his explaination of
|
|||
|
setting up root raid with RedHat.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<20> and many others who contributed to this work in one way or another.
|
|||
|
|
|||
|
|
|||
|
1.5. Copyright Notice
|
|||
|
|
|||
|
This document is GNU copyleft by Michael Robinton michael@bzs.org
|
|||
|
<mailto:michael@bzs.org>.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
2. What you need BEFORE YOU START
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
2.1. Required Packages
|
|||
|
|
|||
|
You need to obtain the most recent versions of these packages.
|
|||
|
|
|||
|
<20> a linux kernel that supports raid, initrd and /dev/loopx
|
|||
|
|
|||
|
I used linux-2.0.33 <ftp://sunsite.unc.edu/pub/Linux/ker<65>
|
|||
|
nel/> from sunsite
|
|||
|
|
|||
|
|
|||
|
<20> raid145-971022-2.0.31
|
|||
|
<ftp://ftp.kernel.org/pub/linux/daemons/raid/> patch adds support
|
|||
|
for raid1/4/5
|
|||
|
|
|||
|
<20> raidtools-pre3-0.42 <ftp://ftp.kernel.org/pub/linux/daemons/raid/>
|
|||
|
tools to create and maintain raid devices (documentation too).
|
|||
|
|
|||
|
<20> ``Gadi's raid stop patch'' in Appendix E.
|
|||
|
|
|||
|
<20> linuxthreads-0.71
|
|||
|
<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
|
|||
|
|
|||
|
<20> A Linux distribution, ready to install.
|
|||
|
|
|||
|
I used Slackware-3.4 <ftp://ftp.cdrom.com/pub/linux>
|
|||
|
|
|||
|
|
|||
|
Helpful but not required
|
|||
|
|
|||
|
<20> raidboot-0.01.tar.gz <ftp://ftp.bizsystems.com/pub/raid/> pre-built
|
|||
|
raid rescue/boot system.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
The patches, tool assortment, etc... may vary with 2.1 kernels.
|
|||
|
Please check the most recent documentation at:
|
|||
|
|
|||
|
|
|||
|
ftp.kernel.org/pub/linux/daemons/raid/ <ftp://ftp.ker<65>
|
|||
|
nel.org/pub/linux/daemons/raid/>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
2.2. Other similar implementations.
|
|||
|
|
|||
|
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 Ed Welbon's <mailto:welbon@bga.com> 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.
|
|||
|
|
|||
|
|
|||
|
http://www.realtime.net/~welbon/initrd.md.tar.gz
|
|||
|
<http://www.realtime.net/~welbon/initrd.md.tar.gz>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
2.3. Documentation -- Recommended Reading
|
|||
|
|
|||
|
Please read:
|
|||
|
|
|||
|
/usr/src/linux/Documentation/initrd.txt
|
|||
|
|
|||
|
|
|||
|
|
|||
|
as well as the documentation and man pages that accompany the
|
|||
|
raidtools set. In particular, read man mdadd as well as the
|
|||
|
QuickStart.RAID document included in the raidtools package.
|
|||
|
|
|||
|
|
|||
|
You may also wish to review:
|
|||
|
|
|||
|
<20> BootPrompt-HOWTO <http://sunsite.unc.edu/mdw/HOWTO/BootPrompt-
|
|||
|
HOWTO.html>
|
|||
|
|
|||
|
<20> man lilo
|
|||
|
|
|||
|
<20> man lilo.conf
|
|||
|
|
|||
|
|
|||
|
2.4. RAID resources
|
|||
|
|
|||
|
|
|||
|
<20> www.linas.org/linux/Software-RAID/Software-RAID.html
|
|||
|
<http://http://www.linas.org/linux/Software-RAID/Software-
|
|||
|
RAID.html>
|
|||
|
|
|||
|
<20> www.ssc.com/lg/issue17/raid.html
|
|||
|
<http://www.ssc.com/lg/issue17/raid.html>
|
|||
|
|
|||
|
<20> linas.org/linux/raid.html <http://linas.org/linux/raid.html>
|
|||
|
|
|||
|
<20> ftp.kernel.org/pub/linux/daemons/raid/
|
|||
|
<ftp://ftp.kernel.org/pub/linux/daemons/raid/>
|
|||
|
|
|||
|
<20> www.realtime.net/~welbon/initrd.md.tar.gz
|
|||
|
<http://www.realtime.net/~welbon/initrd.md.tar.gz>
|
|||
|
<20> luthien.nuclecu.unam.mx/~miguel/raid/
|
|||
|
<http://luthien.nuclecu.unam.mx/~miguel/raid/>
|
|||
|
|
|||
|
Mailing lists can be joined at:
|
|||
|
|
|||
|
<20> majordomo@nuclecu.unam.mx <mailto:majordomo@nuclecu.unam.mx> send a
|
|||
|
message to subscribe raiddev
|
|||
|
|
|||
|
send mail to: raiddev@nuclecu.unam.mx
|
|||
|
<mailto:raiddev@nuclecu.unam.mx>
|
|||
|
|
|||
|
<20> majordomo@vger.rutgers.edu <mailto:majordomo@vger.rutgers.edu> send
|
|||
|
a message to subscribe linux-raid
|
|||
|
|
|||
|
send mail to: linux-raid@vger.rutgers.edu <mailto:linux-
|
|||
|
raid@vger.rutgers.edu> (this seems to be the most active list)
|
|||
|
|
|||
|
|
|||
|
3. Quick Start for ROOT RAID
|
|||
|
|
|||
|
If you use RedHat, see the ``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.
|
|||
|
|
|||
|
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:
|
|||
|
|
|||
|
ftp.bizsystems.com/pub/raid/raidboot-0.01.tar.gz
|
|||
|
<ftp://ftp.bizsystems.com/pub/raid/>
|
|||
|
|
|||
|
|
|||
|
Perform the following steps:
|
|||
|
|
|||
|
<20> Compile the raid enabled kernel with built in support for your disk
|
|||
|
subsystem
|
|||
|
|
|||
|
<20> Test that the raid array will configure and mount correctly
|
|||
|
|
|||
|
<20> Build your OS on the raid system
|
|||
|
|
|||
|
<20> Correct the entries in fstab to show /dev/md0 as the root device.
|
|||
|
Make sure that the partition(s) you use for booting are included in
|
|||
|
fstab.
|
|||
|
|
|||
|
<20> Modify your shutdown halt and reboot script(s) (mine is
|
|||
|
/etc/rc.d/rc.6) as shown in ``Modifying the rc-scripts for
|
|||
|
SHUTDOWN''
|
|||
|
|
|||
|
<20> Copy the following from you development filesystem to the rescue
|
|||
|
system AND the new raid system
|
|||
|
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
|
|||
|
Some Linux distributions include a test for the ro/rw status of the
|
|||
|
root file system. The rc startup files need to have this test removed
|
|||
|
for the initrd rescue system. See the instructions in the section on
|
|||
|
``Correctons for Rescue System''.
|
|||
|
|
|||
|
Correct the entries in fstab to show /dev/md0 as the root device. Make
|
|||
|
sure that the partition(s) you use for booting is included in fstab.
|
|||
|
|
|||
|
|
|||
|
Create /etc/raidboot.conf which describes the raid boot configuration.
|
|||
|
This file may NOT contain comments in the first three lines, after
|
|||
|
that it doesn't matter.
|
|||
|
|
|||
|
raidboot.conf
|
|||
|
|
|||
|
/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
|
|||
|
|
|||
|
|
|||
|
A few more things to do and the raid systems is ready to boot.
|
|||
|
|
|||
|
Create ``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.
|
|||
|
|
|||
|
umount mnt
|
|||
|
losetup -d /dev/loop0
|
|||
|
mv rescue.clean rescue
|
|||
|
gzip rescue
|
|||
|
|
|||
|
|
|||
|
Copy the rescue file to the raidboot partitions.
|
|||
|
|
|||
|
cp rescue.gz /mnt_point(1)/raidboot
|
|||
|
cp rescue.gz /mnt_point(2)/raidboot
|
|||
|
|
|||
|
|
|||
|
Activate the raid array.
|
|||
|
|
|||
|
mdadd -ar
|
|||
|
|
|||
|
|
|||
|
Save the good reference status to the raidboot partition
|
|||
|
|
|||
|
cat /proc/mdstat | grep md0 > /mnt_point(1)/raidboot/raidgood.ref
|
|||
|
cat /proc/mdstat | grep md0 > /mnt_point(1)/raidboot/raidgood.ref
|
|||
|
|
|||
|
|
|||
|
Lastly, configure the boot program as outlined in ``Boot Time Configu<67>
|
|||
|
ration Parameters'' and reboot your system onto the raid array.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4. initrd Cookbook for root mounted RAID
|
|||
|
|
|||
|
This is the procedure to make an 'initrd' ramdisk with rescue tools
|
|||
|
for raid.
|
|||
|
|
|||
|
Specifically, this document referrs to RAID1 and RAID5
|
|||
|
implementations.
|
|||
|
|
|||
|
4.1. Security Reminder
|
|||
|
|
|||
|
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!!!
|
|||
|
|
|||
|
|
|||
|
4.2. Build the Kernel and Raid Tools
|
|||
|
|
|||
|
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
|
|||
|
``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
|
|||
|
raidtools package and briefly reviewed later in this document.
|
|||
|
|
|||
|
|
|||
|
4.3. Build the initrd Rescue and Boot filesystem
|
|||
|
|
|||
|
I used the 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.
|
|||
|
|
|||
|
|
|||
|
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 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 identical procedure to build
|
|||
|
the production system. So the rescue and production systems are very
|
|||
|
similar.
|
|||
|
|
|||
|
This installation process gives me a 'bare' system (save a copy of the
|
|||
|
file) to which I overlay
|
|||
|
|
|||
|
|
|||
|
/lib/modules/2.x.x......
|
|||
|
/etc .... with a modified fstab, mdtab, raidX.conf, raidboot.conf
|
|||
|
/etc/rc.d
|
|||
|
/dev/md*
|
|||
|
|
|||
|
|
|||
|
|
|||
|
from my current system to customize it for the particular kernel and
|
|||
|
machine that it is/will-be running on.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
4.4. Start the STEP by STEP instructions
|
|||
|
|
|||
|
From the root home directory (/root):
|
|||
|
|
|||
|
|
|||
|
cd /root
|
|||
|
mkdir raidboot
|
|||
|
cd raidboot
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Create a mountpoints to work on
|
|||
|
|
|||
|
|
|||
|
mkdir mnt
|
|||
|
mkdir mnt2
|
|||
|
|
|||
|
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
dd if=/dev/zero of=build bs=1024k count=24
|
|||
|
|
|||
|
|
|||
|
associate the file with a loop device and generate an ext2 file system
|
|||
|
on the file
|
|||
|
|
|||
|
|
|||
|
losetup /dev/loop0 build
|
|||
|
mke2fs -v -m0 -L initrd /dev/loop0
|
|||
|
mount /dev/loop0 mnt
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.5. Install the distribution - Slackware Specific
|
|||
|
|
|||
|
``...skip Slackware Specific stuff'' and go to next section.
|
|||
|
|
|||
|
Now that an empty filesystem is created and mounted, run "setup".
|
|||
|
|
|||
|
|
|||
|
Specify /root/raidboot/mnt
|
|||
|
|
|||
|
|
|||
|
|
|||
|
as the 'target'. The source is whatever you normally install from.
|
|||
|
Select the packages you wish to install and proceed but DO NOT
|
|||
|
configure.
|
|||
|
|
|||
|
Choose 'EXPERT' prompting mode.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
|
|||
|
From the 'N' package I only loaded TCPIP. This isn't really neces<65>
|
|||
|
sary, 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 any<6E>
|
|||
|
way.
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
|
|||
|
With the installation complete, say no to everything else (no to all
|
|||
|
configuration requests) and exit the script.
|
|||
|
|
|||
|
|
|||
|
4.6. Install linux pthreads
|
|||
|
|
|||
|
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:
|
|||
|
|
|||
|
|
|||
|
cd /usr/src/linuxthreads-0.71
|
|||
|
patch
|
|||
|
make
|
|||
|
make install
|
|||
|
|
|||
|
|
|||
|
|
|||
|
-------------------diff Makefile.old Makefile.raid-----------------
|
|||
|
2a3,13
|
|||
|
> # If you are building "linuxthreads" for installation on a mount
|
|||
|
> # point which is not the "root" partition, redefine 'BUILDIR' to
|
|||
|
> # the mount point to use as the "root" directory
|
|||
|
> # You may wish to do this if you are building an 'initial ram disk'
|
|||
|
> # such as used with bootable root raid devices.
|
|||
|
> # REQUIRES ldconfig version 1.9.5 or better
|
|||
|
> # do ldconfig -v to check
|
|||
|
> #
|
|||
|
> BUILDIR=/root/raidboot/mnt
|
|||
|
> #BUILDIR=
|
|||
|
>
|
|||
|
81,82c92,93
|
|||
|
< install pthread.h $(INCLUDEDIR)/pthread.h
|
|||
|
< install semaphore.h $(INCLUDEDIR)/semaphore.h
|
|||
|
---
|
|||
|
> install pthread.h $(BUILDIR)$(INCLUDEDIR)/pthread.h
|
|||
|
> install semaphore.h $(BUILDIR)$(INCLUDEDIR)/semaphore.h
|
|||
|
84c95
|
|||
|
< test -f /usr/include/sched.h || install sched.h $(INCLUDEDIR)/sched.h
|
|||
|
---
|
|||
|
> test -f $(BUILDIR)/usr/include/sched.h || install sched.h $(BUILDIR)$(INCLUDEDIR)/sched.h
|
|||
|
86,89c97,103
|
|||
|
< install $(LIB) $(LIBDIR)/$(LIB)
|
|||
|
< install $(SHLIB) $(SHAREDLIBDIR)/$(SHLIB)
|
|||
|
< rm -f $(LIBDIR)/$(SHLIB0)
|
|||
|
< ln -s $(SHAREDLIBDIR)/$(SHLIB) $(LIBDIR)/$(SHLIB0)
|
|||
|
---
|
|||
|
> install $(LIB) $(BUILDIR)$(LIBDIR)/$(LIB)
|
|||
|
> install $(SHLIB) $(BUILDIR)$(SHAREDLIBDIR)/$(SHLIB)
|
|||
|
> rm -f $(BUILDIR)$(LIBDIR)/$(SHLIB0)
|
|||
|
> ln -s $(SHAREDLIBDIR)/$(SHLIB) $(BUILDIR)$(LIBDIR)/$(SHLIB0)
|
|||
|
> ifneq ($(BUILDIR),)
|
|||
|
> ldconfig -r ${BUILDIR} -n $(SHAREDLIBDIR)
|
|||
|
> else
|
|||
|
91c105,106
|
|||
|
< cd man; $(MAKE) MANDIR=$(MANDIR) install
|
|||
|
---
|
|||
|
> endif
|
|||
|
> cd man; $(MAKE) MANDIR=$(BUILDIR)$(MANDIR) install
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.7. Install Raid Tools
|
|||
|
|
|||
|
The next step is the installation of the raid tools. raidtools-0.42
|
|||
|
|
|||
|
You must run the "configure" script to point the Makefile at the build
|
|||
|
directory for the ramdisk files
|
|||
|
cd /usr/src/raidtools-0.42
|
|||
|
configure --sbindir=/root/raidboot/mnt/sbin --prefix=/root/raidboot/mnt/usr
|
|||
|
make
|
|||
|
make install
|
|||
|
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
Fix the make install error
|
|||
|
|
|||
|
|
|||
|
The file links specified in the Makefile at 'LINKS' must be removed
|
|||
|
and re-linked to operate properly.
|
|||
|
|
|||
|
cd /root/raidboot/mnt/sbin
|
|||
|
ln -fs mdadd mdrun
|
|||
|
ln -fs mdadd mdstop
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.8. Remove un-needed directories and files from new filesystem.
|
|||
|
|
|||
|
Delete the following directories from filesystem (CAUTION DON'T DELETE
|
|||
|
FROM YOUR RUNNING SYSTEM) it's easy to do, guess how I found out!!!
|
|||
|
|
|||
|
cd /root/raidboot/mnt
|
|||
|
rm -r home/ftp/*
|
|||
|
rm -r lost+found
|
|||
|
rm -r usr/doc
|
|||
|
rm -r usr/info
|
|||
|
rm -r usr/local/man
|
|||
|
rm -r usr/man
|
|||
|
rm -r usr/openwin
|
|||
|
rm -r usr/share/locale
|
|||
|
rm -r usr/X*
|
|||
|
rm -r var/man
|
|||
|
rm -r var/log/packages
|
|||
|
rm -r var/log/setup
|
|||
|
rm -r var/log/disk_contents
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.9. Create /dev/md x
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
cp -a /dev/md* /root/raidboot/mnt/dev
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.10. Create a bare filesystem suitable for initrd
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
Copy the file system to a smaller device for the initrd file, 16 megs
|
|||
|
should be large enough.
|
|||
|
|
|||
|
Create the smaller file system and mount it
|
|||
|
|
|||
|
cd /root/raidboot
|
|||
|
dd if=/dev/zero of=bare.fs bs=1024k count=16
|
|||
|
|
|||
|
|
|||
|
associate the file with a loop device and generate a ext2 file system
|
|||
|
on the file
|
|||
|
|
|||
|
losetup /dev/loop1 bare.fs
|
|||
|
mke2fs -v -m0 -L initrd /dev/loop1
|
|||
|
mount /dev/loop1 mnt2
|
|||
|
|
|||
|
|
|||
|
Copy the 'build' file system to 'bare.fs'
|
|||
|
|
|||
|
cp -a mnt/* mnt2
|
|||
|
|
|||
|
|
|||
|
Save the 'bare.fs' system before customization so later update is
|
|||
|
easy. The 'build' file system is no longer needed and may be deleted.
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.10.1. Create the BOOT/RESCUE initrd filesystem
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
losetup /dev/loop0 rescue
|
|||
|
mount /dev/loop0 mnt
|
|||
|
|
|||
|
|
|||
|
Make sure your etc directory is clean of *~, core and log files. The
|
|||
|
next 2 commands creates some warning messages, ignore them.
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.10.2. Corrections for the Rescue System
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
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 loadlin, however linux partition(s) and lilo will work
|
|||
|
fine. My system uses:
|
|||
|
|
|||
|
cd /root/raidboot/mnt <--- initrd root
|
|||
|
mkdir dosa dos partition mount point
|
|||
|
mkdir dosb dos mirror mount point
|
|||
|
|
|||
|
|
|||
|
The rescue file system is complete!
|
|||
|
|
|||
|
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!
|
|||
|
|
|||
|
|
|||
|
4.11. Making 'initrd' boot the RAID device - linuxrc
|
|||
|
|
|||
|
To make the rescue disk boot the raid device, you need only copy the
|
|||
|
executable script file:
|
|||
|
|
|||
|
|
|||
|
linuxrc
|
|||
|
|
|||
|
|
|||
|
to the root of the device.
|
|||
|
|
|||
|
The theory of operation for this linuxrc file is discussed in
|
|||
|
``Appendix G, linuxrc theory of operation''.
|
|||
|
|
|||
|
A very simple and much easier to understand (working) linuxrc is
|
|||
|
included in ``Appendix D'', obsolete linuxrc and shutdown scripts.
|
|||
|
Copy the following text to linuxrc and save in your development area.
|
|||
|
|
|||
|
|
|||
|
-------------------- 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 ----------------------
|
|||
|
|
|||
|
|
|||
|
Add 'linuxrc' to initrd boot device
|
|||
|
|
|||
|
cd /root/raidboot
|
|||
|
chmod 777 linuxrc
|
|||
|
cp -p linuxrc mnt
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.12. Modifying the rc-scripts for SHUTDOWN
|
|||
|
|
|||
|
To complete the installation, modify the rc scripts to save the md
|
|||
|
status to the real root device when shutdown occurs.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
I have modified Bohumil Chalupa's raid stop work-around slightly. His
|
|||
|
original solution is presented in ``Appendix A''.
|
|||
|
|
|||
|
Since there are no linux partitions left on the production system
|
|||
|
except md0, the boot partitions are used to store the 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.
|
|||
|
|
|||
|
The shutdown script is modified to call ``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 ``Appendix B''.
|
|||
|
|
|||
|
|
|||
|
To capture the raid array shutdown status insert a call to
|
|||
|
``rc.raidown'' after any case statements (if present) but before the
|
|||
|
actual shutdown (kills, status saves, etc...) begins and before the
|
|||
|
file systems are dismounted.
|
|||
|
|
|||
|
############ Save raid boot and status info ##############
|
|||
|
#
|
|||
|
if [ -x /etc/rc.d/rc.raidown ]; then
|
|||
|
/etc/rc.d/rc.raidown
|
|||
|
fi
|
|||
|
################## end raid boot #########################
|
|||
|
|
|||
|
|
|||
|
After all the file systems are dismounted (the root file system
|
|||
|
|
|||
|
################ 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
|
|||
|
##########################################################
|
|||
|
|
|||
|
|
|||
|
This will cleanly stop all raid devices except root. Root status is
|
|||
|
passed to the next boot in raidstat.ro.
|
|||
|
|
|||
|
|
|||
|
Copy the rc file to your new raid array, the rescue file system that
|
|||
|
is still mounted on /root/raidboot/mnt and the development system if
|
|||
|
it is on the same machine.
|
|||
|
|
|||
|
Modify rescue etc/fstab as needed and make sure rescue mdtab is
|
|||
|
correct.
|
|||
|
|
|||
|
Now copy the rescue disk to your dos partition and everything should
|
|||
|
be ready to boot the raid device as root.
|
|||
|
|
|||
|
umount mnt
|
|||
|
losetup -d /dev/loop0
|
|||
|
gzip -9 rescue
|
|||
|
|
|||
|
|
|||
|
Copy rescue.gz to your boot partitions.
|
|||
|
|
|||
|
All that remains is to creat the configuration file raidboot.conf and
|
|||
|
test the new file system by rebooting.
|
|||
|
|
|||
|
|
|||
|
4.13. Configuring RAIDBOOT - raidboot.conf
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
/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
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.14. Kernel 'loadlin and lilo' variables for RESCUE and RAID
|
|||
|
|
|||
|
There are two kernel variables for the RESCUE and RAID system, only
|
|||
|
the first need be specified.
|
|||
|
|
|||
|
<20> Raid_Conf=msdos,/dev/sda1,raidboot
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
|
|||
|
format: 'filesystem-type,device,path-to-config-from-mount<6E>
|
|||
|
point'
|
|||
|
|
|||
|
|
|||
|
<20> Raid_ALT=-r,-p5,/dev/md0,/dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3
|
|||
|
|
|||
|
Alternate mdadd parameters necessary when booting with non-
|
|||
|
redundant raid array. These are the comma separated command
|
|||
|
line parameters for mdadd. Unless they are needed to start a
|
|||
|
failed/non-redundant array, COMMENT OUT OR SPECIFY WITH A
|
|||
|
'NULL'.
|
|||
|
|
|||
|
|
|||
|
i.e. Raid_ALT=
|
|||
|
|
|||
|
|
|||
|
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).
|
|||
|
|
|||
|
|
|||
|
When booting with lilo, the parameters are included in the lilo config
|
|||
|
file in the form:
|
|||
|
|
|||
|
append="Raid_Conf=msdos,/dev/sda1,raidboot"
|
|||
|
append="Raid_ALT=-r,-p5,/dev/md0,/dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3"
|
|||
|
|
|||
|
|
|||
|
See man lilo.conf for more detailed information.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
The dos system contains this tree for linux"
|
|||
|
|
|||
|
c:\raidboot.bat
|
|||
|
c:\raidboot\loadlin.exe
|
|||
|
c:\raidboot\zimage
|
|||
|
c:\raidboot\rescue.gz
|
|||
|
c:\raidboot\raidboot.cfg
|
|||
|
c:\raidboot\raidboot.etc
|
|||
|
c:\raidboot\raidgood.ref
|
|||
|
c:\raidboot\raidstat.ro (only at shutdown)
|
|||
|
|
|||
|
|
|||
|
---------------------- linux.bat ---------------------------
|
|||
|
echo "Start the LOADLIN process:"
|
|||
|
c:\raidboot\loadlin @c:\raidboot\boot.par
|
|||
|
-------------------- end linux.bat -------------------------
|
|||
|
|
|||
|
|
|||
|
boot.par contains:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# 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.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
If the RAID array fails, the rescue system is left mounted and
|
|||
|
running.
|
|||
|
|
|||
|
|
|||
|
5. Configuring the Production RAID system.
|
|||
|
|
|||
|
|
|||
|
5.1. Two systems with identical motherboards were configured. System
|
|||
|
specs.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
|
|||
|
The disk drives are designated by linux as 'sda' through 'sdd' on the
|
|||
|
raid5 system and 'hda' and 'hdc' on the raid1 system.
|
|||
|
|
|||
|
|
|||
|
5.2. Partitioning the hard drives.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<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
|
|||
|
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
<20> If any single hard drive fails, the boot will abort, and the rescue
|
|||
|
system will run. Examination of the screen message or
|
|||
|
/dosx/raidboot/raidstat.ro will tell the operator the status of the
|
|||
|
failed array.
|
|||
|
|
|||
|
<20> 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 xda 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:
|
|||
|
|
|||
|
"/sbin/mkraid /etc/raid<it/x/.conf -f --only-superblock"
|
|||
|
|
|||
|
|
|||
|
to rebuild the remaining superblock(s).
|
|||
|
|
|||
|
<20> Once this is done, then
|
|||
|
|
|||
|
|
|||
|
mdadd -ar
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<20> 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.
|
|||
|
|
|||
|
|
|||
|
cat /proc/mdstat | grep md0 > /dosx/raidboot/raidgood.ref
|
|||
|
|
|||
|
shutdown -r now
|
|||
|
|
|||
|
|
|||
|
to do a clean reboot, and the system is up again.
|
|||
|
|
|||
|
6. Building the RAID file system.
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
6.1. /etc/raid5.conf
|
|||
|
|
|||
|
|
|||
|
# 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
|
|||
|
|
|||
|
|
|||
|
6.2. /etc/raid1.conf
|
|||
|
|
|||
|
|
|||
|
# 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
|
|||
|
|
|||
|
|
|||
|
|
|||
|
6.3. Step by Step procedures for building production RAID file sys<79>
|
|||
|
tem.
|
|||
|
|
|||
|
For my RAID5 system I did a complete install of:
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Create and format the raid device.
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
|
|||
|
Create the reference files that reboot will use, this may be different
|
|||
|
on your system.
|
|||
|
|
|||
|
cat /proc/mdstat | grep md0 > /dosa/raidboot/raidgood.ref
|
|||
|
cat /proc/mdstat | grep md0 > /dosb/raidboot/raidgood.ref
|
|||
|
|
|||
|
|
|||
|
Use Slackware-3.4 or another distribution to build your OS
|
|||
|
|
|||
|
setup
|
|||
|
|
|||
|
|
|||
|
Specify '/md' as the target, and the source whatever your normally
|
|||
|
use. Select and install the disksets of interest except for the ker<65>
|
|||
|
nel. Configure the system, but skip the section on lilo and kernel
|
|||
|
booting. Exit setup.
|
|||
|
|
|||
|
Install 'pthreads'
|
|||
|
|
|||
|
cd /usr/src/linuxthreads-0.71
|
|||
|
|
|||
|
|
|||
|
edit the Makefile and specify
|
|||
|
|
|||
|
|
|||
|
|
|||
|
BUILDIR=/md
|
|||
|
|
|||
|
make
|
|||
|
make install
|
|||
|
|
|||
|
|
|||
|
Install 'raidtools'
|
|||
|
|
|||
|
cd /usr/src/raidtools-0.42
|
|||
|
configure --sbindir=/md/sbin --prefix=/md/usr
|
|||
|
|
|||
|
|
|||
|
fix the raidtools make install error
|
|||
|
|
|||
|
cd /md/sbin
|
|||
|
rm mdrun
|
|||
|
rm mdstop
|
|||
|
ln -s mdadd mdrun
|
|||
|
ln -s mdadd mdstop
|
|||
|
|
|||
|
|
|||
|
Create /dev/mdx
|
|||
|
|
|||
|
cp -a /dev/md* /md/dev
|
|||
|
|
|||
|
|
|||
|
Add the system configuration from the current system (ignore errors).
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
|
|||
|
Edit the following files to correct them for your file system
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
Create any directories for mounting /dev/disk... as may be required
|
|||
|
that are unique to your system. Mine need:
|
|||
|
|
|||
|
cd /md <--- new file system root
|
|||
|
mkdir dosa dos partition mount point
|
|||
|
mkdir dosb dos mirror mount point
|
|||
|
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
mount the dos partitions on dosa and dosb
|
|||
|
|
|||
|
cat /proc/mdstat | grep md0 > /dosa/raidboot/raidgood.ref
|
|||
|
cat /proc/mdstat | grep md0 > /dosb/raidboot/raidgood.ref
|
|||
|
|
|||
|
mdstop /dev/md0
|
|||
|
|
|||
|
|
|||
|
|
|||
|
7. One last thought.
|
|||
|
|
|||
|
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 Michael@bzs.org <mailto:michael@bzs.org>
|
|||
|
|
|||
|
|
|||
|
8. Appendix A. - Bohumil Chalupa's md0 shutdown
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
> 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 -----------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
9. Appendix B. - Sample SHUTDOWN scripts
|
|||
|
|
|||
|
|
|||
|
<20> ``Slackware''
|
|||
|
|
|||
|
<20> ``Debian''
|
|||
|
|
|||
|
|
|||
|
9.1. Slackware - /etc/rc.d/rc.6
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#! /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 #################################
|
|||
|
|
|||
|
|
|||
|
|
|||
|
9.2. Debian bo - /etc/init.d/halt and /etc/init.d/reboot
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
9.2.1. /etc/init.d/halt
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#! /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 ####################
|
|||
|
|
|||
|
|
|||
|
|
|||
|
9.2.2. /etc/init.d/reboot
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#! /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
|
|||
|
|
|||
|
|
|||
|
|
|||
|
10. Appendix C. - other setup files
|
|||
|
|
|||
|
|
|||
|
10.1. linuxrc``linuxrc file''
|
|||
|
|
|||
|
|
|||
|
10.2. loadlin -- linux.bat file - boot.par``linux.bat file -
|
|||
|
boot.par''
|
|||
|
|
|||
|
|
|||
|
10.3. linuxthreads Makefile.diff``linuxthreads Makefile.diff''
|
|||
|
|
|||
|
|
|||
|
10.4. raid1.conf``raid1.conf''
|
|||
|
|
|||
|
|
|||
|
10.5. raid5.conf``raid5.conf''
|
|||
|
|
|||
|
|
|||
|
10.6. raidboot.conf``raidboot.conf''
|
|||
|
|
|||
|
|
|||
|
10.7. rc.raidown``rc.raidown''
|
|||
|
|
|||
|
11. Appendix D. - obsolete linuxrc and shutdown scripts
|
|||
|
|
|||
|
|
|||
|
11.1. Obsolete working - linuxrc
|
|||
|
|
|||
|
This linuxrc file works fine with the shutdown procedure in the next
|
|||
|
subsection.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
---------------------- 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 ----------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
11.2. Obsolete working - shutdown scripts
|
|||
|
|
|||
|
This shutdown procedure works fine with the preceeding linuxrc
|
|||
|
|
|||
|
To capture the raid array shutdown status, just before the file
|
|||
|
systems are dismounted insert:
|
|||
|
|
|||
|
RAIDSTATUS=`/bin/cat /proc/mdstat | /usr/bin/grep md0`
|
|||
|
|
|||
|
|
|||
|
After all the file systems are dismounted (the root file system
|
|||
|
|
|||
|
# 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
|
|||
|
|
|||
|
|
|||
|
This will cleanly stop all raid devices except root. Root status is
|
|||
|
passed to the next boot in raidstat.ro.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#! /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
|
|||
|
|
|||
|
|
|||
|
|
|||
|
12. Appendix E. - Gadi's raid stop patch for the linux kernel
|
|||
|
|
|||
|
|
|||
|
|
|||
|
--- 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",
|
|||
|
devname(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;
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
13. Appendix F. - rc.raidown
|
|||
|
|
|||
|
Copy the following text into the script file rc.raidown and save it in
|
|||
|
/etc/rc.d.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#! /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 #########################
|
|||
|
|
|||
|
|
|||
|
14. Appendix G. - linuxrc theory of operation
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
The advantage is that it is generic and is not dependent on startup
|
|||
|
files and parameters located in the initrd image.
|
|||
|
|
|||
|
A Raid_Conf parameter passed to 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 linuxrc (raidboot.etc and
|
|||
|
raidboot.cfg placed by the shutdown script).
|
|||
|
|
|||
|
raidboot.etc containing the 'tar'ed files:
|
|||
|
|
|||
|
raid*
|
|||
|
mdtab*
|
|||
|
fstab
|
|||
|
lilo.conf ( if applicable )
|
|||
|
|
|||
|
|
|||
|
from the primary system that are transferred to the initrd
|
|||
|
/etcetc directory at startup. With care, this file may be
|
|||
|
edited if necessary when your system 'really' crashes.
|
|||
|
|
|||
|
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 linuxrc. This file is
|
|||
|
normally created by the shutdown file and may be created
|
|||
|
manually if necessary.
|
|||
|
|
|||
|
raidboot.cfg is of the form, 3 lines - no comments
|
|||
|
|
|||
|
/dev/bootdev1 /dev/bootdev2 [/dev/bootdev3 ... and so on]
|
|||
|
raid-status/path
|
|||
|
name_of_raidX.conf_file
|
|||
|
|
|||
|
|
|||
|
|
|||
|
the raid-status/path does not include the name of the mount<6E>
|
|||
|
point
|
|||
|
|
|||
|
the raidX.conf filename is that one found in /etc and
|
|||
|
normally used for ckraid and mkraid.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The following additional files reside on the permanent raid boot par<61>
|
|||
|
titions. This is usually the same as above, but in emergency situa<75>
|
|||
|
tions may be loaded from anywhere they are available, such as a floppy
|
|||
|
boot disk.
|
|||
|
|
|||
|
<20> raidgood.ref created by the command cat /proc/mdstat | grep md0 >
|
|||
|
/{raid_status_path}/raidgood.ref
|
|||
|
|
|||
|
|
|||
|
See the ``shutdown scripts'' for saving this file and the next
|
|||
|
|
|||
|
|
|||
|
<20> raidstat.ro created at each shutdown by the shutdown rc file,
|
|||
|
saving the exit status of the raid array.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
15. Appendix H. Setting up ROOT RAID on RedHat
|
|||
|
|
|||
|
From the linux-raid@vger.rutgers.edu <mailto:linux-
|
|||
|
raid@vger.rutgers.edu> mail list.
|
|||
|
|
|||
|
|
|||
|
! 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!
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Keith kwrohrer@enteract.com <mailto:kwrohrer@enteract.com>
|
|||
|
|
|||
|
|
|||
|
|