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)