这是制作包含 raid 救援工具的 'initrd' 内存磁盘的步骤。
具体而言,本文档涉及 RAID1 和 RAID5 的实现。
救援文件系统可以独立使用。如果您的 raid 阵列挂载失败,您将只能使用已挂载并运行的救援系统。请采取适当的安全预防措施!!!
首先必须完成的是修补和构建您的内核,并熟悉 raid 工具。请务必包含附录 E 中的 Gadi 的 raid stop 补丁。配置、挂载和测试您的 raid 设备。如何执行此操作的详细信息包含在 raidtools 包中,并在本文档稍后部分进行简要回顾。
我使用 Slackware-3.4 发行版来构建救援/启动文件系统和生产机器的文件系统。任何 Linux 发行版都应该可以正常工作。如果您使用不同的发行版,请查看此过程的 Slackware 特定部分,并根据您的需求进行修改。
我使用 loadlin 从 dos 分区启动内核镜像和内存磁盘,仅仅是因为我的系统中存在需要 dos 配置软件的特殊设备。Lilo 也能同样出色地工作,并且可以使用一个小型 linux 分区来代替,该分区仅包含 raid/boot 文件和 lilo 记录。
对于 raid 启动/救援系统,我选择使用 Slackware 'setup' 脚本创建一个最小的内存磁盘系统,然后在我的内存磁盘上的干净 Slackware 安装之上安装 'linuxthreads' 包和 'raidtools'。我使用了完全相同的步骤来构建生产系统。因此,救援系统和生产系统非常相似。
此安装过程为我提供了一个“裸”系统(保存文件副本),我将覆盖
/lib/modules/2.x.x...... /etc .... with a modified fstab, mdtab, raidX.conf, raidboot.conf /etc/rc.d /dev/md*
来自我当前系统的文件,以针对特定内核和机器进行自定义,以便在其上运行/即将运行。
这使得启动/救援系统与在 root 挂载 raid 设备上运行的系统相同,只是稍微精简了一些,同时允许库等修订始终保持最新。
从 root 用户主目录 (/root) 开始
cd /root mkdir raidboot cd raidboot
创建挂载点以进行操作
mkdir mnt mkdir mnt2
创建一个足够大的文件来进行文件系统安装。这将比最终的救援文件系统大得多。我选择了 24 兆字节,因为 16 兆字节不够大
dd if=/dev/zero of=build bs=1024k count=24将该文件与循环设备关联,并在该文件上生成 ext2 文件系统
losetup /dev/loop0 build mke2fs -v -m0 -L initrd /dev/loop0 mount /dev/loop0 mnt
...跳过 Slackware 特定内容 并转到下一节。
现在已创建并挂载了一个空文件系统,运行 “setup”。
Specify /root/raidboot/mnt
作为“目标”。源是您通常从中安装的任何内容。选择您要安装的软件包并继续,但不要配置。
选择“专家”提示模式。
我选择了 “A”、“AP” 和 “N”,仅安装运行系统所需的最低限度,外加我熟悉的编辑器(vi、jed、joe),这些编辑器都相当紧凑。
lqqqqqqqq SELECTING PACKAGES FROM SERIES A (BASE LINUX SYSTEM) qqqqqqqqk x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x x x [X] aaa_base Basic filesystem, shell, and utils - REQUIRED x x x x [X] bash GNU bash-1.14.7 shell - REQUIRED x x x x [X] devs Device files found in /dev - REQUIRED x x x x [X] etc System config files & utilities - REQUIRED x x x x [X] shadow Shadow password suite - REQUIRED x x x x [ ] ide Linux 2.0.30 no SCSI (YOU NEED 1 KERNEL) x x x x [ ] scsi Linux 2.0.30 with SCSI (YOU NEED 1 KERNEL) x x x x [ ] modules Modular Linux device drivers x x x x [ ] scsimods Loadable SCSI device drivers x x x x [X] hdsetup Slackware setup scripts - REQUIRED x x x x [ ] lilo Boots Linux (not UMSDOS), DOS, OS/2, etc. x x x x [ ] bsdlpr BSD lpr - printer spooling system x x x x [ ] loadlin Boots Linux (UMSDOS too!) from MS-DOS x x x x [ ] pnp Plug'n'Play configuration tool x x x x [ ] umsprogs Utilities needed to use the UMSDOS filesystem x x x x [X] sysvinit System V-like INIT programs - REQUIRED x x x x [X] bin GNU fileutils 3.12, elvis, etc. - REQUIRED x x x x [X] ldso Dynamic linker/loader - REQUIRED x x x x [ ] ibcs2 Runs SCO/SysVr4 binaries x x x x [X] less A text pager utility - REQUIRED x x x x [ ] pcmcia PCMCIA card services support x x x x [ ] getty Getty_ps 2.0.7e - OPTIONAL x x x x [X] gzip The GNU zip compression - REQUIRED x x x x [X] ps Displays process info - REQUIRED x x x x [X] aoutlibs a.out shared libs - RECOMMENDED x x x x [X] elflibs The ELF shared C libraries - REQUIRED x x x x [X] util Util-linux utilities - REQUIRED x x x x [ ] minicom Serial transfer and modem comm package x x x x [ ] cpio The GNU cpio backup/archiving utility x x x x [X] e2fsbn Utilities for the ext2 file system x x x x [X] find GNU findutils 4.1 x x x x [X] grep GNU grep 2.0 x x x x [ ] kbd Change keyboard mappings x x x x [X] gpm Cut and paste text with your mouse x x x x [X] sh_utils GNU sh-utils 1.16 - REQUIRED x x x x [X] sysklogd Logs system and kernel messages x x x x [X] tar GNU tar 1.12 - REQUIRED x x x x [ ] tcsh Extended C shell version 6.07 x x x x [X] txtutils GNU textutils-1.22 - REQUIRED x x x x [ ] zoneinfo Configures your time zone x x x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x从 “AP” 系列中,我仅使用 “JOE”(我喜欢的编辑器)和 “MC”(一个小型且有用的文件管理工具)。您可以选择系统上需要的实用程序。
lqqqqqqqqq SELECTING PACKAGES FROM SERIES AP (APPLICATIONS) qqqqqqqqqk x x [ ] ispell The International version of ispell x x x x [ ] jove Jonathan's Own Version of Emacs text editor x x x x [ ] manpgs More man pages (online documentation) x x x x [ ] diff GNU diffutils x x x x [ ] sudo Allow special users limited root access x x x x [ ] ghostscr GNU Ghostscript version 3.33 x x x x [ ] gsfonts1 Ghostscript fonts (part one) x x x x [ ] gsfonts2 Ghostscript fonts (part two) x x x x [ ] gsfonts3 Ghostscript fonts (part three) x x x x [ ] jed JED programmer's editor x x x x [X] joe joe text editor, version 2.8 x x x x [ ] jpeg JPEG image compression utilities x x x x [ ] bc GNU bc - arbitrary precision math language x x x x [ ] workbone a text-based audio CD player x x x x [X] mc The Midnight Commander file manager x x x x [ ] mt_st mt ported from BSD - controls tape drive x x x x [ ] groff GNU troff document formatting system x x x x [ ] quota User disk quota utilities x x x x [ ] sc The 'sc' spreadsheet x x x x [ ] texinfo GNU texinfo documentation system x x x x [ ] vim Improved vi clone x x x x [ ] ash A small /bin/sh type shell - 62K x x x x [ ] zsh Zsh - a custom *nix shell x x x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x从 “N” 软件包中,我仅加载了 TCPIP。这实际上不是必需的,但非常方便,并且允许在修复或更新 root raid 阵列卸载的情况下访问网络。TCPIP 还包含 “biff”,某些 “A” 中的应用程序会使用它。如果您不安装 “N”,您可能仍然需要安装 biff 软件包。
lqqqq SELECTING PACKAGES FROM SERIES N (NETWORK/NEWS/MAIL/UUCP) qqqqqk x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x x x [ ] apache Apache WWW (HTTP) server x x x x [ ] procmail Mail delivery/filtering utility x x x x [ ] dip Handles SLIP/CSLIP connections x x x x [ ] ppp Point-to-point protocol x x x x [ ] mailx The mailx mailer x x x x [X] tcpip TCP/IP networking programs x x x x [ ] bind Berkeley Internet Name Domain server x x x x [ ] rdist Remote file distribution utility x x x x [ ] lynx Text-based World Wide Web browser x x x x [ ] uucp Taylor UUCP 1.06.1 with HDB && Taylor configs x x x x [ ] elm Menu-driven user mail program x x x x [ ] pine Pine menu-driven mail program x x x x [ ] sendmail The sendmail mail transport agent x x x x [ ] metamail Metamail multimedia mail extensions x x x x [ ] smailcfg Extra configuration files for sendmail x x x x [ ] cnews Spools and transmits Usenet news x x x x [ ] inn InterNetNews news transport system x x x x [ ] tin The 'tin' news reader (local or NNTP) x x x x [ ] trn 'trn' for /var/spool/news x x x x [ ] trn-nntp 'trn' for NNTP (install 1 'trn' maximum) x x x x [ ] nn-spool 'nn' for /var/spool/news x x x x [ ] nn-nntp 'nn' for NNTP (install 1 'nn' maximum) x x x x [ ] netpipes Network pipe utilities x x x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x安装完成后,对所有其他内容说“否”(对所有配置请求说“否”),然后退出脚本。
现在您必须安装 “linuxthreads-0.71” 库。我包含了 linuxthreads Makefile 的此差异,而不是手动解释安装的详细信息。保存原始 Makefile,应用差异,然后
cd /usr/src/linuxthreads-0.71 patch make make install
-------------------diff Makefile.old Makefile.raid----------------- 2a3,13 > # If you are building "linuxthreads" for installation on a mount > # point which is not the "root" partition, redefine 'BUILDIR' to > # the mount point to use as the "root" directory > # You may wish to do this if you are building an 'initial ram disk' > # such as used with bootable root raid devices. > # REQUIRES ldconfig version 1.9.5 or better > # do ldconfig -v to check > # > BUILDIR=/root/raidboot/mnt > #BUILDIR= > 81,82c92,93 < install pthread.h $(INCLUDEDIR)/pthread.h < install semaphore.h $(INCLUDEDIR)/semaphore.h --- > install pthread.h $(BUILDIR)$(INCLUDEDIR)/pthread.h > install semaphore.h $(BUILDIR)$(INCLUDEDIR)/semaphore.h 84c95 < test -f /usr/include/sched.h || install sched.h $(INCLUDEDIR)/sched.h --- > test -f $(BUILDIR)/usr/include/sched.h || install sched.h $(BUILDIR)$(INCLUDEDIR)/sched.h 86,89c97,103 < install $(LIB) $(LIBDIR)/$(LIB) < install $(SHLIB) $(SHAREDLIBDIR)/$(SHLIB) < rm -f $(LIBDIR)/$(SHLIB0) < ln -s $(SHAREDLIBDIR)/$(SHLIB) $(LIBDIR)/$(SHLIB0) --- > install $(LIB) $(BUILDIR)$(LIBDIR)/$(LIB) > install $(SHLIB) $(BUILDIR)$(SHAREDLIBDIR)/$(SHLIB) > rm -f $(BUILDIR)$(LIBDIR)/$(SHLIB0) > ln -s $(SHAREDLIBDIR)/$(SHLIB) $(BUILDIR)$(LIBDIR)/$(SHLIB0) > ifneq ($(BUILDIR),) > ldconfig -r ${BUILDIR} -n $(SHAREDLIBDIR) > else 91c105,106 < cd man; $(MAKE) MANDIR=$(MANDIR) install --- > endif > cd man; $(MAKE) MANDIR=$(BUILDIR)$(MANDIR) install
下一步是安装 raid 工具。raidtools-0.42
您必须运行 “configure” 脚本,以将 Makefile 指向内存磁盘文件的构建目录
cd /usr/src/raidtools-0.42 configure --sbindir=/root/raidboot/mnt/sbin --prefix=/root/raidboot/mnt/usr make make install现在!!install 的 Makefile 不完全正确,因此请执行以下操作进行清理。这将在未来的版本中修复,以便不再需要重新链接。
修复 make install 错误
Makefile 中 'LINKS' 中指定的文件链接必须删除并重新链接才能正常运行。
cd /root/raidboot/mnt/sbin ln -fs mdadd mdrun ln -fs mdadd mdstop
从文件系统中删除以下目录(注意:不要从您正在运行的系统中删除),很容易做到,猜猜我是怎么发现的!!!
cd /root/raidboot/mnt rm -r home/ftp/* rm -r lost+found rm -r usr/doc rm -r usr/info rm -r usr/local/man rm -r usr/man rm -r usr/openwin rm -r usr/share/locale rm -r usr/X* rm -r var/man rm -r var/log/packages rm -r var/log/setup rm -r var/log/disk_contents
最后一步只是将 /dev/md* 设备从当前文件系统复制到救援文件系统。您可以使用 mknode 创建这些设备。
cp -a /dev/md* /root/raidboot/mnt/dev
现在您有了一个干净的可重复使用的文件系统,可以进行自定义。自定义后,如果 raid 设备损坏且需要 raid 工具来修复它们,则可以使用此文件系统进行救援。通过添加 linuxrc 文件(将在下一节中讨论),它还将用于启动和 root 挂载 raid 设备。
将文件系统复制到较小的设备以用于 initrd 文件,16 兆字节应该足够大。
创建较小的文件系统并挂载它
cd /root/raidboot dd if=/dev/zero of=bare.fs bs=1024k count=16将该文件与循环设备关联,并在该文件上生成 ext2 文件系统
losetup /dev/loop1 bare.fs mke2fs -v -m0 -L initrd /dev/loop1 mount /dev/loop1 mnt2将 “build” 文件系统复制到 “bare.fs”
cp -a mnt/* mnt2在自定义之前保存 “bare.fs” 系统,以便以后轻松更新。“build” 文件系统不再需要,可以删除。
cd /root/raidboot umount mnt umount mnt2 losetup -d /dev/loop0 losetup -d /dev/loop1 rm build cp bare.fs rescue gzip -9 bare.fs
现在从开发平台复制与内核匹配的系统相关项,或者您可以手动修改救援文件系统中的文件以匹配您的目标系统。
losetup /dev/loop0 rescue mount /dev/loop0 mnt确保您的 etc 目录中没有
*~
、core 和日志文件。接下来的 2 个命令会创建一些警告消息,请忽略它们。cp -dp /etc/* mnt/etc cp -dp /etc/rc.d/* mnt/etc/rc.d mkdir mnt/lib/modules cp -a /lib/modules/2.x.x mnt/lib/modules <--- your current 2.x.x
编辑以下文件以更正它们以适应您的救援系统。下面列出的一些文件名是 Slackware 特有的,但在其他发行版中具有等效项。
cd mnt 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.为您系统独有的 /dev/disk... 创建任何用于挂载的目录。这些是用于启动系统的挂载点(启动分区和备份启动分区)。我的系统使用 loadlin 从 dos 启动,但是 linux 分区和 lilo 也可以正常工作。我的系统使用
cd /root/raidboot/mnt <--- initrd root mkdir dosa dos partition mount point mkdir dosb dos mirror mount point救援文件系统已完成!
您在检查救援文件系统中的文件后会注意到,仍然可以删除许多文件。我没有这样做,因为这会过度复杂化此过程,并且大多数 raid 系统都具有足够的磁盘和内存。如果您想精简文件系统,请继续!
要使救援磁盘启动 raid 设备,您只需要复制可执行脚本文件
linuxrc
到设备的根目录。
此 linuxrc 文件的操作理论在 附录 G,linuxrc 操作理论 中讨论。
附录 D,过时的 linuxrc 和 shutdown 脚本 中包含一个非常简单且更容易理解(工作)的 linuxrc。将以下文本复制到 linuxrc 并保存在您的开发区域中。
-------------------- linuxrc ---------------------- #!/bin/sh # ver 1.13 3-6-98 # ################# BEGIN 'linuxrc' ################## # DEFINE FUNCTIONS # #################################################### # Define 'Fault' function in the event something # goes wrong during the execution of 'linuxrc' # FaultExit () { # correct fstab to show '/dev/ram0' for rescue system /bin/cat /etc/fstab | { while read Line do if [ -z "$( echo ${Line} | /usr/bin/grep md0 )" ]; then echo ${Line} else echo "/dev/ram0 / ext2 defaults 1 1" fi done } > /etc/tmp.$$ /bin/mv /etc/tmp.$$ /etc/fstab # point root at /dev/ram0 (the rescue system) echo 0x100>/proc/sys/kernel/real-root-dev /bin/umount /proc exit } # Define 'Warning' procdure to print banner on boot terminal # Warning () { echo '*********************************' echo -e " $*" echo '*********************************' } # Define 'SplitKernelArg' to help extract 'Raid' related kernel arguments SplitKernelArg () { eval $1='$( IFS=,; echo $2)' } #Define 'SplitConfArgs' to help extract system configuration arguments SplitConfArgs () { RaidBootType=$1 RaidBootDevice=$2 RaidConfigPath=$3 } ######################################################## ################### MAIN linuxrc ####################### ######################################################## # mount the proc file system /bin/mount /proc # Get the boot partition and configuration location from command line CMDLINE=`/bin/cat /proc/cmdline` for Parameter in $CMDLINE; do Parameter=$( IFS='='; echo ${Parameter} ) case $Parameter in Raid*) SplitKernelArg $Parameter;; esac done # check for 'required raid boot' if [ -z "${Raid_Conf}" ]; then Warning Kernel command line \'Raid_Conf\' missing FaultExit fi SplitConfArgs $Raid_Conf # tmp mount the boot partition /bin/mount -t ${RaidBootType} ${RaidBootDevice} /mnt # get etc files from primary raid system pushd /etc # this will un-tar into 'etc' (see rc.6) if [ ! -f /mnt/${RaidConfigPath}/raidboot.etc ]; then # bad news, this file should be here Warning required file \'raidboot.etc\' \ missing from ${RaidBootDevice}/${RaidConfigPath} \\n \ \\tUsing rescue system defaults else /bin/tar -xf /mnt/${RaidConfigPath}/raidboot.etc fi # get 'real' raidboot device for this boot # status path, and name of raidX.conf if [ ! -f /mnt/${RaidConfigPath}/raidboot.cfg ]; then # bad news, this file should be here Warning required file 'raidboot.cfg' \ missing from ${RaidBootDevice}/${RaidConfigPath}\\n \ \\tUsing rescue system defaults # Get the first raidX.conf file name in $RArg1 RaidBootDevs=$RaidBootDevice RaidStatusPath=$RaidConfigPath for RaidConfigEtc in $( ls raid*.conf ) do break; done else { read RaidBootDevs read RaidStatusPath read RaidConfigEtc } < /mnt/${RaidConfigPath}/raidboot.cfg fi popd /bin/umount /mnt # Set a flag in case the raid status file is not found # RAIDOWN="raidboot.ro not found" RAIDREF="raidgood.ref not found" echo "Reading md0 shutdown status." # search for raid shutdown status for Device in ${RaidBootDevs} do # these filesystem types should be in 'fstab' since # the partitions must be mounted for a clean raid shutdown /bin/mount ${Device} /mnt if [ -f /mnt/${RaidStatusPath}/raidboot.ro ]; then RAIDOWN=`/bin/cat /mnt/${RaidStatusPath}/raidboot.ro` RAIDREF=`/bin/cat /mnt/${RaidStatusPath}/raidgood.ref` /bin/umount /mnt break fi /bin/umount /mnt done # Test for a clean shutdown with array matching reference if [ "${RAIDOWN}" != "${RAIDREF}" ]; then Warning shutdown ERROR ${RAIDOWN} FaultExit fi # The raid array is clean, remove shutdown status files for Device in ${RaidBootDevs} do /bin/mount ${Device} /mnt /bin/rm -f /mnt/${RaidStatusPath}/raidboot.ro /bin/umount /mnt done # Write a clean superblock on all raid devices echo "write clean superblocks" /sbin/mkraid -f --only-superblock /etc/${RaidConfigEtc} # Activate raid array(s) if [ -z "$Raid_ALT" ]; then /sbin/mdadd -ar else /sbin/mdadd $Raid_ALT fi # If there are errors - BAIL OUT and leave rescue running if [ $? -ne 0 ]; then Warning some RAID device has errors FaultExit fi # Everything is fine, let the kernel mount /dev/md0 # tell the kernel to switch to /dev/md0 as the /root device # The 0x900 value is the device number calculated by: # 256*major_device_number + minor_device number echo "/dev/md0 mounted on root" echo 0x900>/proc/sys/kernel/real-root-dev # umount /proc to deallocate initrd device ram space /bin/umount /proc exit #------------------ end linuxrc ----------------------将 'linuxrc' 添加到 initrd 启动设备
cd /root/raidboot chmod 777 linuxrc cp -p linuxrc mnt
要完成安装,请修改 rc 脚本以在关机时将 md 状态保存到真实 root 设备。
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.我对 Bohumil Chalupa 的 raid stop 解决方法进行了轻微修改。他的原始解决方案在 附录 A 中介绍。
由于生产系统上除了 md0 之外没有剩余的 linux 分区,因此启动分区用于存储 raidOK 只读状态。我选择在每个重复的启动分区中写入一个文件,其中包含关机时 md 阵列的状态,并表示 md 设备已重新挂载为 RO。这允许系统在任何硬盘驱动器发生故障时都能安全运行。
修改了关机脚本以调用 rc.raidown,该脚本保存必要的信息以成功重启和挂载 raid 设备。各种 linux 发行版的关机脚本示例在 附录 B 中显示。
要捕获 raid 阵列关机状态,请在任何 case 语句(如果存在)之后但在实际关机(kills、状态保存等)开始之前以及文件系统卸载之前插入对 rc.raidown 的调用。
############ Save raid boot and status info ############## # if [ -x /etc/rc.d/rc.raidown ]; then /etc/rc.d/rc.raidown fi ################## end raid boot #########################在所有文件系统卸载后(root 文件系统“不会”卸载),但在任何断电状态检查之前添加
################ 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 ##########################################################这将干净地停止除 root 之外的所有 raid 设备。Root 状态在 raidstat.ro 中传递到下一次启动。
将 rc 文件复制到您的新 raid 阵列、仍然挂载在 /root/raidboot/mnt 上的救援文件系统以及开发系统(如果它在同一台机器上)。
根据需要修改救援 etc/fstab,并确保救援 mdtab 正确。
现在将救援磁盘复制到您的 dos 分区,一切都应该准备好将 raid 设备作为 root 启动。
umount mnt losetup -d /dev/loop0 gzip -9 rescue将 rescue.gz 复制到您的启动分区。
剩下的就是创建配置文件 raidboot.conf 并通过重启来测试新的文件系统。
示例配置文件后面的注释解释了这三行中的每一行。此示例文件适用于具有重复启动分区的 4 驱动器 raid5 scsii 阵列,启动分区位于驱动器 sda1 和 sdb1 上。在此处放置描述您的文件系统的参数。
/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
RESCUE 和 RAID 系统有两个内核变量,只需要指定第一个。
此变量指向 raid 启动设备和配置文件。对于软盘救援启动,您可能需要在内核命令行或 loadlin 或 lilo 启动文件中指定此变量
格式:'filesystem-type,device,path-to-config-from-mountpoint'
使用非冗余 raid 阵列启动时需要的备用 mdadd 参数。这些是 mdadd 的逗号分隔命令行参数。除非需要它们来启动失败/非冗余阵列,否则注释掉或指定为 “NULL”。
即 Raid_ALT=
使用 lilo 启动时,参数以以下形式包含在 lilo 配置文件中
append="Raid_Conf=msdos,/dev/sda1,raidboot" append="Raid_ALT=-r,-p5,/dev/md0,/dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3"有关更多详细信息,请参阅 man lilo.conf。
由于我有一些硬件需要 DOS 配置实用程序,因此我在系统上有一个小的 dos 分区。因此,我使用 loadlin 从 dos 分区启动 raid5 系统,并在配套磁盘上镜像(副本)。raid1 系统使用相同的方法。下面的示例使用 loadlin,但 lilo 的过程非常相似。
我的 dos root 系统包含一个小型编辑器以及实用程序,因此如果需要,我可以修改 loadlin 的启动参数,从而允许我在测试时在我的交换磁盘上重新启动 linux 系统。
dos 系统包含 linux 的这个树结构”
c:\raidboot.bat c:\raidboot\loadlin.exe c:\raidboot\zimage c:\raidboot\rescue.gz c:\raidboot\raidboot.cfg c:\raidboot\raidboot.etc c:\raidboot\raidgood.ref c:\raidboot\raidstat.ro (only at shutdown)linux.bat 包含
---------------------- linux.bat --------------------------- echo "Start the LOADLIN process:" c:\raidboot\loadlin @c:\raidboot\boot.par -------------------- end linux.bat -------------------------boot.par 包含
# loadlin boot parameter file # # version 1.02 3-6-98 # linux kernel image c:\linux\zimage # target root device root=/dev/md0 #root=/dev/ram0 #root=/dev/sdc5 # mount root device as 'ro' ro # size of ram disk ramdisk_size=16384 # initrd file name initrd=c:\raidboot\rescue.gz #noinitrd # memory ends here mem=131072k # points to raid boot device, configuration file # for floppy rescue boot, you may want to specify # this on the command line instead of here # format 'filesystem-type,device,path-to-config-frm_mntpnt' Raid_Conf=msdos,/dev/sda1,raidboot # Alternate mdadd parameters # necessary when boot with non-redundant raid # otherwise, COMMENT OUT OR SPECIFY 'NULL' #Raid_ALT=-r,-p5,/dev/md0,/dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3 # ethernet devices ether=10,0x300,eth0 ***** >> 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.
如果 RAID 阵列失败,救援系统将保持挂载和运行状态。