source: MondoRescue/branches/2.2.5/mondo/src/restore-scripts/mondo/grub-MR@ 1881

Last change on this file since 1881 was 1315, checked in by Bruno Cornec, 17 years ago

Log files are now consistent: mondoarchive.log for mondoarchive (containing also mindi.log) and mondorestore.log for mondorestore (copied from /tmp (ram) to /var/log (disk) at the end of the restore)
One include has been created for each bianry containing only that declaration ofr the moment, but which will be extended to include all local definitions (ps_* e.g.)
Doc updated accordingly
LOGFILE in restore process is now passed in the environment and not duplicated anymore
LogIt is not redifined either
LOGFILE should be put in environment by mondoarchive for mindi's usage but that's a step left for later.

  • Property svn:keywords set to Id
  • Property svn:unix-mode set to 755
File size: 4.1 KB
Line 
1#!/bin/sh
2#
3# $Id: grub-MR 1315 2007-04-16 14:13:59Z bruno $
4#
5# grub-MR ------ a rudimentary replacement for grub-install
6#
7#
8
9Die() {
10 echo "$1" >> /dev/stderr
11 exit 1
12}
13
14
15FindBootPart() {
16 local i
17 bootpart=""
18 BOOTPATHNAME=""
19 for sz in /boot / ; do
20 bootpart=`grep " $sz " $2 | cut -d' ' -f1 | head -n1`
21 [ "$bootpart" ] && [ -e "/mnt/RESTORING/$bootpart" ] && break
22 done
23 [ ! "$bootpart" ] && Die "Cannot find boot partition in mountlist"
24
25 if [ "$sz" = "/boot" ] ; then
26 BOOTPATHNAME=/grub
27 else
28 BOOTPATHNAME=/boot/grub
29 fi
30 if [ -e "$MNT_RESTORING/boot/grub/stage1" ] ; then
31 echo "Alright then."
32 return
33 fi
34
35 cd $MNT_RESTORING
36 for i in usr/lib/grub/* ; do
37 echo "Checking $i"
38 if [ -e "$i/stage1" ] ; then
39 BOOTPATHNAME=/$i
40 mkdir -p /boot/grub
41 cp -au $i/* /boot/grub/
42 echo "BOOTPATHNAME is now $BOOTPATHNAME"
43 return 0
44 fi
45 done
46 cd /
47 echo "Cannot find BOOTPATHNAME"
48 return 1
49}
50
51FindPathOfRESTExe() {
52 local path
53 for path in /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin \
54/bin /sbin ; do
55 if [ -f "/mnt/RESTORING/$path/$1" ] ; then
56 echo "/mnt/RESTORING/$path/$1"
57 return
58 fi
59 done
60 which grub
61}
62
63
64try_grub_hack() {
65 local driveno extraline partno
66 driveno=$1
67 partno=$2
68 extraline="$3"
69
70 echo -en "\
71 device (hd$driveno) $mbrpart\n\
72 $extraline\n\
73 root (hd$driveno,$partno)\n\
74 setup (hd$driveno)\n\
75 quit \n" > /tmp/feed.txt
76 cat /tmp/feed.txt
77 log_file=/tmp/grub.output
78 if [ "$MNT_RESTORING" ] ; then
79 chroot /mnt/RESTORING grub --batch < /tmp/feed.txt > $log_file
80 else
81 grub --batch < /tmp/feed.txt > $log_file
82 fi
83 cat $log_file
84 if grep "Error [0-9]*: " $log_file >/dev/null; then
85 return 1
86 else
87 return 0
88 fi
89}
90
91
92# ---------------------------------- main -----------------------------------
93
94if [ "$#" -ne "2" ] ; then
95 Die "grub-MR <MBR drive> <mountlist filename>; e.g. grub-MR /dev/hda /tmp/mountlist.txt"
96fi
97[ ! -f "$2" ] && Die "mountlist file not found"
98
99if [ -e "/mnt/RESTORING/boot" ] ; then
100 MNT_RESTORING=/mnt/RESTORING
101else
102 MNT_RESTORING=""
103fi
104
105echo "Now I'll use grub-install" >> $LOGFILE
106chroot /mnt/RESTORING grub-install $1 >> $LOGFILE
107res=$?
108echo "grub-install returned $res" >> $LOGFILE
109[ "$res" -eq "0" ] && exit 0
110
111echo "Trying a hack" >> $LOGFILE
112FindBootPart $1 $2
113mbrpart=$1
114if echo $bootpart | grep "/cciss/" > /dev/null ; then
115 partno=`basename $bootpart | cut -d'p' -f2`
116else
117 partno=`basename $bootpart | sed s/[a-z]*//`
118fi
119if [ ! "$partno" ] ; then
120 partno=0
121else
122 partno=$(($partno-1))
123fi
124if echo $bootpart | grep "/md" > /dev/null ; then
125 base=`basename $bootpart`
126 line=`grep $base /proc/mdstat | head -n1`
127 echo "mbrpart was $mbrpart"
128 mbrpart=`parted2fdisk -l | grep /dev/ | head -n1 | tr ':' ' ' \
129| cut -d' ' -f2`
130 echo "mbrpart is $mbrpart"
131 partno="0"; # cheating - FIXME
132fi
133echo ".............Cool."
134
135grub=`FindPathOfRESTExe grub`
136mkdir -p /boot
137[ "$MNT_RESTORING" ] && ln -sf /mnt/RESTORING/boot/grub /boot/grub
138
139# ---------------------------------
140
141for driveno in 0 1 2 ; do
142 try_grub_hack $driveno $partno "" >> $LOGFILE 2>> $LOGFILE && break
143 try_grub_Hack $driveno $partno "find $BOOTPATHNAME/stage1" >> $LOGFILE 2>> $LOGFILE && break
144done
145res=$?
146echo "Hack returned res=$res" >> $LOGFILE
147[ "$res" -eq "0" ] && exit 0
148
149# ---------------------------------
150
151echo "Now I'll use grub-install.patched" >> $LOGFILE
152cp -f `which grub-install.patched` /mnt/RESTORING/sbin
153chroot /mnt/RESTORING grub-install.patched $1 >> $LOGFILE
154res=$?
155echo "grub-install.patched returned $res" >> $LOGFILE
156[ "$res" -eq "0" ] && exit 0
157
158# ---------------------------------
159
160echo "Trying to use the existing grub.conf file in batch mode" >> $LOGFILE
161chroot /mnt/RESTORING grub --batch < /mnt/RESTORING/etc/grub.conf
162res=$?
163echo "Grub.conf approach returned $res" >> $LOGFILE
164[ "$res" -eq "0" ] && exit 0
165
166#echo "Now I'll use grub-install" >> $LOGFILE
167#chroot /mnt/RESTORING grub-install $1 >> $LOGFILE
168#res=$?
169#echo "grub-install returned $res" >> $LOGFILE
170#[ "$res" -eq "0" ] && exit 0
171
172echo "grub-MR returned res=$res" >> $LOGFILE
173
174exit $res
Note: See TracBrowser for help on using the repository browser.