Репозитории ALT
S: | 2.06-alt16 |
D: | 0.97-alt2 |
5.1: | 0.97-alt5 |
4.1: | 0.97-alt4.M41.1 |
3.0: | 0.95-alt1 |
Группа :: Система/Ядро и оборудование
Пакет: grub
Главная Изменения Спек Патчи Sources Загрузить Gear Bugs and FR Repocop
Патч: grub-0.95-md.patch
Скачать
Скачать
--- 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