Fwd: Problems/workarounds for install to root on LVM on RAID
Robert Millan
zeratul2@wanadoo.es
Tue, 13 Jul 2004 17:32:23 +0200
On Tue, Jul 13, 2004 at 05:22:04PM +0200, Martin Michlmayr wrote:
> Can you take a look at this?
This is Jason who takes care of update-grub and grub-install. I'm forwarding
this to him and pkg-grub-devel@lists.alioth.debian.org.
> ----- Forwarded message from Charles Steinkuehler <charles@steinkuehler.net> -----
>
> From: Charles Steinkuehler <charles@steinkuehler.net>
> Subject: Re: Bug#251905: Problems/workarounds for install to root on LVM on
> RAID
> Date: Mon, 21 Jun 2004 15:28:29 -0500
> To: Martin Michlmayr <tbm@cyrius.com>, 251905@bugs.debian.org,
> debian-boot@lists.debian.org
> User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.6) Gecko/20040113
> X-Accept-Language: en-us, en
> X-Spam-Status: No, hits=-4.9 required=5.0 tests=AWL,BAYES_00 autolearn=ham
> version=2.63
>
> Martin Michlmayr wrote:
>
> >* tbm <tbm@cyrius.com> [2004-05-31 13:37]:
> >>1) partman won't let you build an LVM on top of a RAID device
> >
> >Still there. This needs changed to libparted - maybe you can look at
> >this.
>
> I haven't looked at this. If it doesn't involve lots of coding, I may
> be able to take a stab at it.
>
> >>3) Grub install fails when /boot is on a RAID1 device
> >
> >Still there.
>
> Attached are two patches to address this (one for grub-install, and one
> for update-grub). Patches are against the version I have installed,
> which according to the changelog is 0.94+cvs20040511-1
>
> update-grub:
> ------------
>
> This one is pretty easy. The convert routine (which fails when passed
> an md device) is only called to get a default grub root device to use if
> one is not provided in the menu.lst file. It's not really necessary to
> have anything provided by this routine (in fact, if device.map doesn't
> exist, the default behavior is simply set the default to (hd0,0)).
>
> I just created a convert_default 'wrapper', which calls convert() and
> returns the result or (hd0,0) if anything goes wrong (ie: convert exits
> with non-zero status).
>
> grub-install:
> -------------
>
> This is a bit more complicated, as we actually have to figure out what
> device(s) to install grub on. My solution was to add a test for an md
> device prior to any of the other processing in the convert() procedure.
> If we're trying to convert /dev/md*, the new procedure getraid_mdadm()
> is called to identify a BIOS device we can then pass to the rest of the
> convert() code.
>
> The getraid_mdadm procedure is pretty much lifted from the Debian
> mkinitrd scripts (at least the part that converts an md device into a
> list of physical drives). I modified the routine to return a single
> device, and to return the highest priority BIOS device that's also part
> of the RAID array. If no RAID members are BIOS devices (according to
> the device.map file), the first device listed by mdadm is returned.
>
> NOTES:
> ------
>
> - I have not implemented support for raidtools extraction of the RAID
> device info (ie: mdadm is required), although the code is in the
> mkinitrd script. If needed, this is left as an exercise for the reader :)
>
> - I did not modify grub-install to install itself on the MBR of *ALL*
> devices in the array (which I usually do manually, in case the 'primary'
> HDD is the one that dies). This may or may not be desired behavior, but
> it seems somewhat unsafe to simply assume this behavior is wanted. You
> can do this manually by:
> grub-install '(hd0)'
> grub-install '(hd1)'
> ...
>
> - I have not yet tested these mods on a 'bare-metal' install, but my
> system still boots after running 'grub-install' and 'update-grub' with
> the included mods. I need to do another re-install, so hopefully I'll
> be able to report on the success (or failure) of these patches on a
> ground-up install.
>
> --
> Charles Steinkuehler
> charles@steinkuehler.net
>
> --- grub-install.was 2004-06-21 14:36:27.000000000 -0500
> +++ grub-install 2004-06-21 14:34:05.000000000 -0500
> @@ -80,6 +80,50 @@
> EOF
> }
>
> +# Usage: getraid_mdadm mddevice
> +# Routine to find a physical device from an md device
> +# If found, the first grub BIOS device (from device.map) is returned
> +# If no BIOS drives match the RAID devices, the first device returned
> +# from mdadm -D is returned
> +getraid_mdadm() {
> + device=$1
> + mdadm=$(mdadm -D "$device") || {
> + echo "$PROG: mdadm -D $device failed" >&2
> + exit 1
> + }
> + eval "$(
> + echo "$mdadm" | awk '
> + $1 == "Number" && $2 == "Major" { start = 1; next }
> + $1 == "UUID" { print "uuid=" $3; start = 0; next }
> + !start { next }
> + $2 == 0 && $3 == 0 { next }
> + { devices = devices "\n" $NF }
> + END { print "devices='\''" devices "'\''" }
> + '
> + )"
> +
> + # Convert RAID devices list into a list of disks
> + tmp_disks=`echo "$devices" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \
> + -e 's%\(d[0-9]*\)p[0-9]*$%\1%' \
> + -e 's%\(fd[0-9]*\)$%\1%' \
> + -e 's%/part[0-9]*$%/disc%' \
> + -e 's%\(c[0-7]d[0-9]*\).*$%\1%' \
> + -e '/^$/d' |
> + sed -n '1h;2,$H;${g;s/\n/|/g;p}'`
> +
> + # Find first BIOS disk that's a member of the RAID array
> + # Default to first RAID member if no tmp_disks are BIOS devices
> + set -- `egrep $tmp_disks $device_map | \
> + sort | \
> + sed -n 1p `
> + device=${2:-${tmp_disks%%|*}}
> +
> + # Return first partition on BIOS disk that's part of the RAID
> + echo "$devices" | \
> + sed -n "\:${device}:p" | \
> + sed -n 1p
> +}
> +
> # Usage: convert os_device
> # Convert an OS device to the corresponding GRUB drive.
> # This part is OS-specific.
> @@ -95,6 +139,10 @@
> # Break the device name into the disk part and the partition part.
> case "$host_os" in
> linux*)
> + # Find an actual physical device if we're passed a RAID device
> + case $1 in
> + /dev/md*) set -- `getraid_mdadm $1`
> + esac
> tmp_disk=`echo "$1" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \
> -e 's%\(d[0-9]*\)p[0-9]*$%\1%' \
> -e 's%\(fd[0-9]*\)$%\1%' \
>
> --- update-grub.was 2004-06-21 14:37:35.000000000 -0500
> +++ update-grub 2004-06-21 14:46:58.000000000 -0500
> @@ -196,6 +196,18 @@
> fi
> }
>
> +# Usage: convert_default os_device
> +# Convert an OS device to the corresponding GRUB drive.
> +# Calls OS-specific convert, and returns a default of
> +# (hd0,0) if anything goes wrong
> +convert_default () {
> + local tmp
> + if tmp=$(convert $1 2>/dev/null) ; then
> + echo $tmp
> + else
> + echo "(hd0,0)"
> + fi
> +}
>
> ## Configuration Options
> # directory's to look for the grub installation and the menu file
> @@ -224,9 +236,9 @@
> # if we don't have a device.map then we can't use the convert function.
> if test -f "$device_map" ; then
> if test -z "$boot_device" ; then
> - grub_root_device=$(convert "$root_device")
> + grub_root_device=$(convert_default "$root_device")
> else
> - grub_root_device=$(convert "$boot_device")
> + grub_root_device=$(convert_default "$boot_device")
> fi
> else
> grub_root_device="(hd0,0)"
>
>
> ----- End forwarded message -----
>
> --
> Martin Michlmayr
> tbm@cyrius.com
--
Robert Millan
"[..] but the delight and pride of Aule is in the deed of making, and in the
thing made, and neither in possession nor in his own mastery; wherefore he
gives and hoards not, and is free from care, passing ever on to some new work."
-- J.R.R.T., Ainulindale (Silmarillion)