Root RAID HOWTO cookbook: Appendix A. - Bohumil Chalupa's md0 shutdown

Next Previous Contents

## 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 -----------------

Next Previous Contents