1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
Copyright: Charles Steinkuehler <charles@steinkuehler.net>, except he borrowed
some code from other sources. He's cooperative about rewriting and/or doing
the paperwork.
Upstream: pending
Index: b/util/grub-install.in
===================================================================
--- a/util/grub-install.in
+++ b/util/grub-install.in
@@ -81,6 +81,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.
@@ -96,6 +140,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%' \
|