mirror of
https://github.com/vincentmli/bpfire.git
synced 2026-05-11 09:48:24 +02:00
184 lines
5.0 KiB
Diff
184 lines
5.0 KiB
Diff
--- grub-0.95/util/grub-install.in.support_md 2004-12-17 17:50:45.000000000 -0500
|
|
+++ grub-0.95/util/grub-install.in 2004-12-19 19:19:20.509409160 -0500
|
|
@@ -207,6 +207,43 @@
|
|
echo "$tmp_fname"
|
|
}
|
|
|
|
+# Usage: is_raid1_device devicename
|
|
+# Returns 0 if devicename is a raid1 md device, 1 if it is not.
|
|
+is_raid1_device () {
|
|
+ case "$host_os" in
|
|
+ linux*)
|
|
+ level=`mdadm --query --detail $1 2>/dev/null | \
|
|
+ awk '/Raid Level :/ {print $4}'`
|
|
+ if [ "$level" = "raid1" ]; then
|
|
+ return 0
|
|
+ fi
|
|
+ ;;
|
|
+ esac
|
|
+ return 1
|
|
+}
|
|
+
|
|
+# Usage: find_real_devs device
|
|
+# Returns space separated list of devices for linux if device is
|
|
+# a raid1 device. In all other cases, the provided value is returned.
|
|
+find_real_devs () {
|
|
+ source_device=$1
|
|
+ case "$host_os" in
|
|
+ linux*)
|
|
+ if is_raid1_device $source_device ; then
|
|
+ list=""
|
|
+ for device in `mdadm --query --detail "${source_device}" | \
|
|
+ awk '/\/dev\/[^(md)]/ {print $7}'` ; do
|
|
+ list="$list $device"
|
|
+ done
|
|
+ echo $list
|
|
+ return 0
|
|
+ fi
|
|
+ ;;
|
|
+ esac
|
|
+ echo $source_device
|
|
+ return 0
|
|
+}
|
|
+
|
|
# Usage: find_device file
|
|
# Find block device on which the file resides.
|
|
find_device () {
|
|
@@ -219,7 +256,7 @@
|
|
exit 1
|
|
fi
|
|
|
|
- tmp_fname=`resolve_symlink $tmp_fname`
|
|
+ tmp_fname=`resolve_symlink $tmp_fname`
|
|
|
|
echo "$tmp_fname"
|
|
}
|
|
@@ -379,7 +416,11 @@
|
|
# Check for INSTALL_DEVICE.
|
|
case "$install_device" in
|
|
/dev/*)
|
|
+ # If we are running md on a Linux box, just use the first physical device
|
|
+ # at this point.
|
|
install_device=`resolve_symlink "$install_device"`
|
|
+ install_device=`find_real_devs $install_device | awk '{print $1}'`
|
|
+
|
|
install_drive=`convert "$install_device"`
|
|
# I don't know why, but some shells wouldn't die if exit is
|
|
# called in a function.
|
|
@@ -408,14 +449,7 @@
|
|
grub_prefix="/grub"
|
|
fi
|
|
|
|
-# Convert the root device to a GRUB drive.
|
|
-root_drive=`convert "$root_device"`
|
|
-if test "x$root_drive" = x; then
|
|
- exit 1
|
|
-fi
|
|
-
|
|
-# Check if the root directory exists in the same device as the grub
|
|
-# directory.
|
|
+# Check if the root directory exists in the same device as the grub directory.
|
|
grubdir_device=`find_device ${grubdir}`
|
|
|
|
if test "x$grubdir_device" != "x$root_device"; then
|
|
@@ -431,30 +465,40 @@
|
|
test -n "$mkimg" && img_file=`$mkimg`
|
|
test -n "$mklog" && log_file=`$mklog`
|
|
|
|
-for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
|
|
- count=5
|
|
- tmp=`echo $file | sed "s|^${grubdir}|${grub_prefix}|"`
|
|
- while test $count -gt 0; do
|
|
- $grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file
|
|
+for real_device in `find_real_devs $root_device`; do
|
|
+ # Convert the root deviceto a GRUB drive.
|
|
+ root_drive=`convert "$real_device"`
|
|
+ if [ "x$root_drive" = x ]; then
|
|
+ exit 1
|
|
+ fi
|
|
+
|
|
+ for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
|
|
+ count=5
|
|
+ tmp=`echo $file | sed "s|^${grubdir}|${grub_prefix}|"`
|
|
+ while test $count -gt 0; do
|
|
+ sync
|
|
+ $grub_shell --batch $no_floppy --device-map=$device_map \
|
|
+ <<EOF >$log_file
|
|
dump ${root_drive}${tmp} ${img_file}
|
|
quit
|
|
EOF
|
|
- if grep "Error [0-9]*: " $log_file >/dev/null; then
|
|
- :
|
|
- elif cmp $file $img_file >/dev/null; then
|
|
- break
|
|
+ if grep "Error [0-9]*: " $log_file >/dev/null; then
|
|
+ :
|
|
+ elif cmp $file $img_file >/dev/null; then
|
|
+ break
|
|
+ fi
|
|
+ sleep 1
|
|
+ count=`expr $count - 1`
|
|
+ done
|
|
+ if test $count -eq 0; then
|
|
+ echo "The file $file not read correctly." 1>&2
|
|
+ exit 1
|
|
fi
|
|
- sleep 1
|
|
- count=`expr $count - 1`
|
|
done
|
|
- if test $count -eq 0; then
|
|
- echo "The file $file not read correctly." 1>&2
|
|
- exit 1
|
|
- fi
|
|
-done
|
|
|
|
-rm -f $img_file
|
|
-rm -f $log_file
|
|
+ rm -f $img_file
|
|
+ rm -f $log_file
|
|
+done
|
|
|
|
if ! test -e ${grubdir}/grub.conf ; then
|
|
test -e ${grubdir}/menu.lst && ln -s ./menu.lst ${grubdir}/grub.conf
|
|
@@ -463,21 +507,33 @@
|
|
# Create a safe temporary file.
|
|
test -n "$mklog" && log_file=`$mklog`
|
|
|
|
-# Before all invocations of the grub shell, call sync to make sure
|
|
-# the raw device is in sync with any bufferring in filesystems.
|
|
-sync
|
|
+for real_device in `find_real_devs $root_device`; do
|
|
+ # Convert the root deviceto a GRUB drive.
|
|
+ root_drive=`convert "$real_device"`
|
|
+ if [ "x$root_drive" = x ]; then
|
|
+ exit 1
|
|
+ fi
|
|
+
|
|
+ # Before all invocations of the grub shell, call sync to make sure
|
|
+ # the raw device is in sync with any bufferring in filesystems.
|
|
+ sync
|
|
|
|
-# Now perform the installation.
|
|
-$grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file
|
|
+ # Now perform the installation.
|
|
+ $grub_shell --batch $no_floppy --device-map=$device_map <<EOF >>$log_file
|
|
root $root_drive
|
|
-setup $force_lba --stage2=$grubdir/stage2 --prefix=$grub_prefix $install_drive
|
|
+setup $force_lba --stage2=$grubdir/stage2 --prefix=$grub_prefix $root_drive
|
|
quit
|
|
EOF
|
|
|
|
-if grep "Error [0-9]*: " $log_file >/dev/null || test $debug = yes; then
|
|
+done
|
|
+
|
|
+if grep "Error [0-9]*: " $log_file >/dev/null ; then
|
|
cat $log_file 1>&2
|
|
exit 1
|
|
fi
|
|
+if test $debug = yes; then
|
|
+ cat $log_file 1>&2
|
|
+fi
|
|
|
|
rm -f $log_file
|
|
|