On Tue, Apr 29, 2008 at 11:04:21AM -0700, Mike Bird wrote:
> Package: grub
> Version: 0.97-37
> Severity: critical
> Justification: breaks the whole system
> 
> 
> "grub-install '(hd0)'" reports "The file /boot/grub/stage1 not read
> correctly."
> 
> The problem occurs when grub-install is using dump for some kind
> of verification.  The log is written to /tmp file with a random
> name:
> 
> # cat grubJM5Q31 
> 
> 
>     GNU GRUB  version 0.97  (640K lower / 3072K upper memory)
> 
>        [ Minimal BASH-like line editing is supported.   For
>          the   first   word,  TAB  lists  possible  command
>          completions.  Anywhere else TAB lists the possible
>          completions of a device/filename. ]
> grub> dump (md0)/grub/stage1 /tmp/grubrakRL1
> 
> Error 23: Error while parsing number

Please could you test the attached patch?

-- 
Robert Millan

<GPLv2> I know my rights; I want my phone call!
<DRM> What use is a phone call… if you are unable to speak?
(as seen on /.)
--- util/grub-install	2008-04-26 19:38:51.000000000 +0200
+++ /tmp/grub-install	2008-04-30 12:37:34.000000000 +0200
@@ -125,11 +125,57 @@
 		sed -n 1p
 }
 
+## borrowed from update-grub
+# Usage: convert_raid1 os_device
+# Checks if os_device is a software raid1.
+# If so, converts to first physical device in array.
+convert_raid1 ()
+{
+    case $1 in
+        /dev/md[0-9] | /dev/md/[0-9])
+            : ;; # Continue
+        *)
+            return 1 ;;
+    esac
+
+    [ -x /sbin/mdadm ] || return 1
+
+    # Check that the raid device is raid1
+    raidlevel=$(mdadm -D -b $1 | grep "^ARRAY" | \
+            sed "s/^.*level=//" | cut -d" " -f1)
+    [ "$raidlevel" = "raid1" ] || return 1
+    
+    # Take only the first device that makes up the raid
+    raiddev=$(mdadm -D $1 | grep -A1 "Number" | grep "dev" \
+                          | sed "s/^.*\(\/dev\/.*\)$/\1/")
+    [ -n "$raiddev" ] || return 1
+
+    echo $raiddev
+    return 0
+}
+
+## borrowed from update-grub (renamed from convert)
+# Usage: convert_nonraid os_device
+# Convert an OS device to the corresponding GRUB drive.
+convert_nonraid () {
+	if ! test -e ${device_map} ; then
+		echo quit | grub --batch --no-floppy --device-map=${device_map} > /dev/null
+	fi
+	GRUB_LEGACY_0_BASED_PARTITIONS=1 grub-probe --device-map=${device_map} -t drive -d "$1"
+}
+
+## borrowed from update-grub (renamed from convert_default)
 # Usage: convert os_device
 # Convert an OS device to the corresponding GRUB drive.
-# This part is OS-specific.
 convert () {
-	GRUB_LEGACY_0_BASED_PARTITIONS=1 grub-probe --device-map=${device_map} -t drive -d "$1"
+	# Check if device is software raid1 array
+	if tmp_dev=$(convert_raid1 $1 2>/dev/null) ; then
+		: # Use device returned by convert_raid1
+	else
+		tmp_dev=$1
+	fi
+
+	convert_nonraid $tmp_dev
 }
 
 # Usage: resolve_symlink file

Reply via email to