source: MondoRescue/branches/3.3/mondo/src/restore-scripts/mondo/mr-grub

Last change on this file was 3733, checked in by Bruno Cornec, 4 years ago

Really use unsupported versions of grub when they exist

  • Property svn:keywords set to Id
  • Property svn:unix-mode set to 755
File size: 6.6 KB
Line 
1#!/bin/sh
2#
3# $Id: mr-grub 3733 2019-11-18 00:44:18Z bruno $
4#
5# mr-grub ------ a rudimentary replacement for grub-install
6#
7#
8
9Die() {
10 echo "$1" >> /dev/stderr
11 exit 1
12}
13
14
15FindBootPart() {
16 # Work only for grub v1
17 local i
18 bootpart=""
19 BOOTPATHNAME=""
20 for sz in /boot / ; do
21 bootpart=`grep " $sz " $2 | cut -d' ' -f1 | head -n1`
22 [ "$bootpart" ] && [ -e "/mnt/RESTORING/$bootpart" ] && break
23 done
24 [ ! "$bootpart" ] && Die "Cannot find boot partition in mountlist"
25
26 if [ "$sz" = "/boot" ] ; then
27 BOOTPATHNAME=/grub
28 else
29 BOOTPATHNAME=/boot/grub
30 fi
31 if [ -e "$MNT_RESTORING/boot/grub/stage1" ] ; then
32 echo "All right then."
33 return
34 fi
35
36 cd $MNT_RESTORING
37 for i in usr/lib/grub/* ; do
38 echo "Checking $i"
39 if [ -e "$i/stage1" ] ; then
40 BOOTPATHNAME=/$i
41 mkdir -p /boot/grub
42 cp -au $i/* /boot/grub/
43 echo "BOOTPATHNAME is now $BOOTPATHNAME"
44 return 0
45 fi
46 done
47 cd /
48 echo "Cannot find BOOTPATHNAME"
49 return 1
50}
51
52FindPathOfRESTExe() {
53 local path
54 for path in /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin \
55/bin /sbin ; do
56 if [ -f "/mnt/RESTORING/$path/$1" ] ; then
57 echo "/mnt/RESTORING/$path/$1"
58 return
59 fi
60 done
61 which grub
62}
63
64
65try_grub_hack() {
66 local driveno extraline partno
67 driveno=$1
68 partno=$2
69 extraline="$3"
70
71 echo -en "\
72 device (hd$driveno) $mbrdev\n\
73 $extraline\n\
74 root (hd$driveno,$partno)\n\
75 setup (hd$driveno)\n\
76 quit \n" > /tmp/feed.txt
77 cat /tmp/feed.txt
78 log_file=/tmp/grub.output
79 if [ "$MNT_RESTORING" ] ; then
80 chroot $MNT_RESTORING grub --batch < /tmp/feed.txt > $log_file
81 else
82 grub --batch < /tmp/feed.txt > $log_file
83 fi
84 cat $log_file
85 if grep "Error [0-9]*: " $log_file >/dev/null; then
86 return 1
87 else
88 return 0
89 fi
90}
91
92
93# ---------------------------------- main -----------------------------------
94
95if [ "$#" -ne "2" ] ; then
96 Die "mr-grub <boot drive> <mountlist filename>; e.g. mr-grub /dev/hda /tmp/mountlist.txt"
97fi
98[ ! -f "$2" ] && Die "mountlist file not found"
99
100if [ -e "/mnt/RESTORING/boot" ] ; then
101 MNT_RESTORING=/mnt/RESTORING
102else
103 MNT_RESTORING=""
104fi
105
106# For some OpenSuSE
107res=1
108if [ "$MNT_RESTORING" ] ; then
109 if [ -x $MNT_RESTORING/usr/sbin/grub-install.unsupported ]; then
110 echo "Now I'll use OpenSuSE/SLES new grub-install in chroot" >> $LOGFILE
111 chroot $MNT_RESTORING /usr/sbin/grub-install.unsupported >> $LOGFILE 2>> $LOGFILE
112 res=$?
113 echo "grub-install.unsupported in chroot returned $res" >> $LOGFILE
114 fi
115else
116 if [ -x /usr/sbin/grub-install.unsupported ]; then
117 echo "Now I'll use OpenSuSE/SLES new grub-install locally" >> $LOGFILE
118 /usr/sbin/grub-install.unsupported >> $LOGFILE 2>> $LOGFILE
119 res=$?
120 echo "grub-install.unsupported returned $res" >> $LOGFILE
121 fi
122fi
123[ "$res" -eq "0" ] && exit 0
124
125echo "Now I'll use grub-install" >> $LOGFILE
126if [ "$MNT_RESTORING" ] ; then
127 echo "Launching: chroot $MNT_RESTORING grub-install $1" >> $LOGFILE
128 chroot $MNT_RESTORING grub-install $1 >> $LOGFILE 2>> $LOGFILE
129 res=$?
130else
131 echo "Launching: grub-install $1" >> $LOGFILE
132 grub-install $1 >> $LOGFILE 2>> $LOGFILE
133 res=$?
134fi
135echo "grub-install returned $res" >> $LOGFILE
136[ "$res" -eq "0" ] && exit 0
137
138if [ "$MNT_RESTORING" ] ; then
139 devfile="$MNT_RESTORING/boot/grub2/device.map"
140else
141 devfile="/boot/grub2/device.map"
142fi
143echo "Content of $devfile" >> $LOGFILE
144echo "-------------------" >> $LOGFILE
145if [ -f "$devfile" ]; then
146 cat $devfile >> $LOGFILE
147else
148 echo "No file $devfile" >> $LOGFILE
149fi
150
151echo "Now I'll use grub2-install" >> $LOGFILE
152if [ "$MNT_RESTORING" ] ; then
153 echo "Launching: chroot $MNT_RESTORING grub2-install --force $1" >> $LOGFILE
154 chroot $MNT_RESTORING grub2-install --force $1 >> $LOGFILE 2>> $LOGFILE
155 res=$?
156else
157 echo "Launching: grub2-install --force $1" >> $LOGFILE
158 grub2-install --force $1 >> $LOGFILE 2>> $LOGFILE
159 res=$?
160fi
161echo "grub2-install returned $res" >> $LOGFILE
162[ "$res" -eq "0" ] && exit 0
163
164echo "Trying a hack" >> $LOGFILE
165FindBootPart $1 $2 2>&1 | tee -a $LOGFILE
166mbrdev=`echo $1 | sed 's/\([^0-9]*\)[0-9]*$/\1/'`
167if echo $mbrdev | grep "/cciss/" > /dev/null ; then
168 partno=`basename $mbrdev | cut -d'p' -f2`
169 mbrdev=`echo $mbrdev | cut -d'p' -f1`
170elif echo $mbrdev | grep "/mapper/mpath" > /dev/null ; then
171 partno=`basename $mbrdev | cut -d'p' -f3`
172 mbrdev=`echo $mbrdev | cut -d'p' -f1-4`
173else
174 partno=`basename $mbrdev | sed 's/[a-z]*//'`
175fi
176if [ ! "$partno" ] ; then
177 partno=0
178else
179 partno=$(($partno-1))
180fi
181if echo $mbrdev | grep "/md" > /dev/null ; then
182 # FIXME: Why this if not used later
183 base=`basename $bootpart`
184 line=`grep $base /proc/mdstat | head -n1`
185 echo "mbrdev was $mbrdev" 2>&1 | tee -a $LOGFILE
186 mbrdev=`mr-parted2fdisk -l 2>/dev/null | grep /dev/ | head -n1 | tr ':' ' ' | cut -d' ' -f2`
187 echo "mbrdev is $mbrdev" 2>&1 | tee -a $LOGFILE
188 partno="0"; # cheating - FIXME
189fi
190echo ".............Cool." 2>&1 | tee -a $LOGFILE
191
192grub=`FindPathOfRESTExe grub | head -1`
193mkdir -p /boot
194[ "$MNT_RESTORING" ] && ln -sf /mnt/RESTORING/boot/grub /boot/grub
195[ "$MNT_RESTORING" ] && ln -sf /mnt/RESTORING/boot/grub2 /boot/grub2
196
197# ---------------------------------
198
199for driveno in 0 1 2 ; do
200 try_grub_hack $driveno $partno "" >> $LOGFILE 2>> $LOGFILE && break
201 try_grub_hack $driveno $partno "find $BOOTPATHNAME/stage1" >> $LOGFILE 2>> $LOGFILE && break
202done
203res=$?
204echo "Hack returned res=$res" >> $LOGFILE
205[ "$res" -eq "0" ] && exit 0
206
207# ---------------------------------
208
209echo "Now I'll use mr-grub-install.patched" >> $LOGFILE
210cp -f `which mr-grub-install.patched` /mnt/RESTORING/sbin
211chroot /mnt/RESTORING mr-grub-install.patched $1 >> $LOGFILE 2>> $LOGFILE
212res=$?
213echo "mr-grub-install.patched returned $res" >> $LOGFILE
214[ "$res" -eq "0" ] && exit 0
215
216# ---------------------------------
217
218if [ -f "/mnt/RESTORING/boot/grub/menu.lst" ]; then
219 grep -vE '^#' /boot/grub/menu.lst > /mnt/RESTORING/tmp/grub.conf
220elif [ -f "/mnt/RESTORING/boot/grub/grub.cfg" ]; then
221 grep -vE '^#' /boot/grub/grub.cfg > /mnt/RESTORING/tmp/grub.conf
222elif [ -f "/mnt/RESTORING/boot/grub2/grub.cfg" ]; then
223 grep -vE '^#' /boot/grub2/grub.cfg > /mnt/RESTORING/tmp/grub.conf
224elif [ -d "/mnt/RESTORING/boot/efi" ]; then
225 grep -vE '^#' `find /boot/efi -name grub.conf` > /mnt/RESTORING/tmp/grub.conf
226else
227 echo "Unable to find Grub conf file" | tee -a $LOGFILE
228 exit -1
229fi
230echo "Trying to use the existing grub conf file in batch mode" >> $LOGFILE
231cat /mnt/RESTORING/tmp/grub.conf >> $LOGFILE
232chroot /mnt/RESTORING grub --batch < /mnt/RESTORING/tmp/grub.conf
233res=$?
234echo "grub conf file approach returned $res" >> $LOGFILE
235rm -f /mnt/RESTORING/tmp/grub.conf
236[ "$res" -eq "0" ] && exit 0
237
238echo "mr-grub returned res=$res" >> $LOGFILE
239
240exit $res
Note: See TracBrowser for help on using the repository browser.