[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[patch] update-grub: Add support for software raid1



reassign 292274 grub
tags 292274 + d-i patch
retitle 292274 update-grub: Add support for software raid1
thanks

I have traced the root of these installation problems to update-grub.
If the device in /etc/fstab is /dev/md?, update-grub will default to 
(hd0,0) as it does not know how to deal with software raid devices in 
functions convert_default and convert.

The attached patch add support for raid1.
The /dev/md? will be converted to the first physical device in the array.

Note: I have chosen to use only the first physical device and not all (as 
suggested in #264262 because there seemed to be some dispute over the 
question if this is useful.

Please consider applying this patch before the release of Sarge, as 
because d-i now supports raid installation, a lot of people will benefit 
from this. Because of this I have left severity at important instead of 
setting it to wishlist.

I have tested the patch on a similar setup as described in this report. 
I've also tested the patch on a box without raid.

Cheers,
Frans Pop
(Debian Installer team)

--- /sbin/update-grub	2005-01-16 23:20:51.000000000 +0100
+++ update-grub	2005-01-29 16:11:59.000000000 +0100
@@ -96,6 +96,34 @@
 	echo $device
 }
 
+# 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])
+            : ;; # 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 -b $1 | grep "^   devices=" | \
+            sed "s/^   devices=//" | cut -d"," -f1)
+    [ -n "$raiddev" ] || return 1
+
+    echo $raiddev
+    return 0
+}
+
 # Usage: convert os_device
 # Convert an OS device to the corresponding GRUB drive.
 # This part is OS-specific.
@@ -208,7 +236,14 @@
 # Calls OS-specific convert, and returns a default of
 # (hd0,0) if anything goes wrong
 convert_default () {
-	if tmp=$(convert $1 2>/dev/null) ; then
+	# 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
+
+	if tmp=$(convert $tmp_dev 2>/dev/null) ; then
 		echo $tmp
 	else
 		echo "(hd0,0)"

Reply to: