Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37527017
en ru br
Репозитории 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
www.altlinux.org/Changes

Группа :: Система/Ядро и оборудование
Пакет: 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
 
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin