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

Last change on this file since 3683 was 3683, checked in by Bruno Cornec, 7 years ago

force grub2-install execution (at least useful on OpeSUSE Leap) (patch from Stanislav Tokoš stanislav.tokos_atiba-group.com)

  • Property svn:keywords set to Id
  • Property svn:unix-mode set to 755
File size: 6.1 KB
Line 
1#!/bin/sh
2#
3# $Id: mr-grub 3683 2017-08-18 10:16:52Z 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 >> $LOGFILE 2>> $LOGFILE
112 res=$?
113 echo "grub-install 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 >> $LOGFILE 2>> $LOGFILE
119 res=$?
120 echo "grub-install 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
138
139echo "Now I'll use grub2-install" >> $LOGFILE
140if [ "$MNT_RESTORING" ] ; then
141 chroot $MNT_RESTORING grub2-install --force $1 >> $LOGFILE 2>> $LOGFILE
142 res=$?
143else
144 grub2-install --force $1 >> $LOGFILE 2>> $LOGFILE
145 res=$?
146fi
147echo "grub2-install returned $res" >> $LOGFILE
148[ "$res" -eq "0" ] && exit 0
149
150echo "Trying a hack" >> $LOGFILE
151FindBootPart $1 $2 2>&1 | tee -a $LOGFILE
152mbrdev=`echo $1 | sed 's/\([^0-9]*\)[0-9]*$/\1/'`
153if echo $mbrdev | grep "/cciss/" > /dev/null ; then
154 partno=`basename $mbrdev | cut -d'p' -f2`
155 mbrdev=`echo $mbrdev | cut -d'p' -f1`
156elif echo $mbrdev | grep "/mapper/mpath" > /dev/null ; then
157 partno=`basename $mbrdev | cut -d'p' -f3`
158 mbrdev=`echo $mbrdev | cut -d'p' -f1-4`
159else
160 partno=`basename $mbrdev | sed 's/[a-z]*//'`
161fi
162if [ ! "$partno" ] ; then
163 partno=0
164else
165 partno=$(($partno-1))
166fi
167if echo $mbrdev | grep "/md" > /dev/null ; then
168 # FIXME: Why this if not used later
169 base=`basename $bootpart`
170 line=`grep $base /proc/mdstat | head -n1`
171 echo "mbrdev was $mbrdev" 2>&1 | tee -a $LOGFILE
172 mbrdev=`mr-parted2fdisk -l 2>/dev/null | grep /dev/ | head -n1 | tr ':' ' ' | cut -d' ' -f2`
173 echo "mbrdev is $mbrdev" 2>&1 | tee -a $LOGFILE
174 partno="0"; # cheating - FIXME
175fi
176echo ".............Cool." 2>&1 | tee -a $LOGFILE
177
178grub=`FindPathOfRESTExe grub | head -1`
179mkdir -p /boot
180[ "$MNT_RESTORING" ] && ln -sf /mnt/RESTORING/boot/grub /boot/grub
181[ "$MNT_RESTORING" ] && ln -sf /mnt/RESTORING/boot/grub2 /boot/grub2
182
183# ---------------------------------
184
185for driveno in 0 1 2 ; do
186 try_grub_hack $driveno $partno "" >> $LOGFILE 2>> $LOGFILE && break
187 try_grub_hack $driveno $partno "find $BOOTPATHNAME/stage1" >> $LOGFILE 2>> $LOGFILE && break
188done
189res=$?
190echo "Hack returned res=$res" >> $LOGFILE
191[ "$res" -eq "0" ] && exit 0
192
193# ---------------------------------
194
195echo "Now I'll use mr-grub-install.patched" >> $LOGFILE
196cp -f `which mr-grub-install.patched` /mnt/RESTORING/sbin
197chroot /mnt/RESTORING mr-grub-install.patched $1 >> $LOGFILE 2>> $LOGFILE
198res=$?
199echo "mr-grub-install.patched returned $res" >> $LOGFILE
200[ "$res" -eq "0" ] && exit 0
201
202# ---------------------------------
203
204if [ -f "/mnt/RESTORING/boot/grub/menu.lst" ]; then
205 grep -vE '^#' /boot/grub/menu.lst > /mnt/RESTORING/tmp/grub.conf
206elif [ -f "/mnt/RESTORING/boot/grub/grub.cfg" ]; then
207 grep -vE '^#' /boot/grub/grub.cfg > /mnt/RESTORING/tmp/grub.conf
208elif [ -f "/mnt/RESTORING/boot/grub2/grub.cfg" ]; then
209 grep -vE '^#' /boot/grub2/grub.cfg > /mnt/RESTORING/tmp/grub.conf
210elif [ -d "/mnt/RESTORING/boot/efi" ]; then
211 grep -vE '^#' `find /boot/efi -name grub.conf` > /mnt/RESTORING/tmp/grub.conf
212else
213 echo "Unable to find Grub conf file" | tee -a $LOGFILE
214 exit -1
215fi
216echo "Trying to use the existing grub conf file in batch mode" >> $LOGFILE
217cat /mnt/RESTORING/tmp/grub.conf >> $LOGFILE
218chroot /mnt/RESTORING grub --batch < /mnt/RESTORING/tmp/grub.conf
219res=$?
220echo "grub conf file approach returned $res" >> $LOGFILE
221rm -f /mnt/RESTORING/tmp/grub.conf
222[ "$res" -eq "0" ] && exit 0
223
224echo "mr-grub returned res=$res" >> $LOGFILE
225
226exit $res
Note: See TracBrowser for help on using the repository browser.