Magellan Linux

Contents of /tags/grubby-8_37/new-kernel-pkg

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (show annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 8 months ago) by niro
Original Path: trunk/mkinitrd-magellan/grubby/new-kernel-pkg
File size: 10183 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd

1 #!/bin/bash
2 #
3 # Invoked upon installation or removal of a kernel package, the following
4 # tasks are/can be done here:
5 # creation/removal of initrd
6 # run of depmod/removal of depmod generated files
7 # addition/removal of kernel images from grub/lilo configuration (via grubby)
8 #
9 # Copyright (C) 2002-2005 Red Hat, Inc.
10 #
11 # modified for Magellan-Linux by Niels Rogalla <niro@magellan-linux.de>
12 #
13
14 PATH=/sbin:/bin:$PATH
15
16 lilo=/sbin/lilo
17
18 # some defaults that are sane for most arches
19 kernelName=kernel
20
21 if [ -x ./grubby ]; then
22 grubby=./grubby
23 else
24 grubby=/sbin/grubby
25 fi
26
27 [ -f /etc/sysconfig/kernel ] && . /etc/sysconfig/kernel
28
29 cfgGrub=""
30 cfgLilo=""
31 runLilo=""
32 grubConfig=""
33
34 ARCH=$(uname -m)
35
36 if [ $ARCH = 'ia64' ]; then
37 liloConfig=/boot/efi/EFI/redhat/elilo.conf
38 bootPrefix=/boot/efi/EFI/redhat
39 liloFlag=elilo
40 isx86=""
41 elif [ $ARCH = 'ppc64' -o $ARCH = 'ppc' ]; then
42 liloConfig=/etc/yaboot.conf
43 bootPrefix=/boot
44 lilo=/sbin/ybin
45 liloFlag=yaboot
46 runLilo="yes"
47 isx86=""
48 elif [ $ARCH = 'sparc' -o $ARCH = 'sparc64' ]; then
49 liloConfig=/etc/silo.conf
50 bootPrefix=/boot
51 liloFlag=silo
52 lilo=/sbin/silo
53 isx86=""
54 elif [ $ARCH = 's390' -o $ARCH = 's390x' ]; then
55 liloConfig=/etc/zipl.conf
56 bootPrefix=/boot
57 liloFlag=zipl
58 lilo=/sbin/zipl
59 runLilo="yes"
60 isx86=""
61 else
62 # this leaves i?86 and x86_64
63 liloConfig=/etc/lilo.conf
64 grubConfig=/boot/grub/grub.conf
65 bootPrefix=/boot
66 liloFlag=lilo
67 isx86="yes"
68 fi
69
70 mode=""
71 version=""
72 initrd=""
73 initrdfile=""
74 moddep=""
75 verbose=""
76 makedefault=""
77 package=""
78 mbkernel=""
79 mbargs=""
80
81 usage() {
82 echo "Usage: `basename $0` [-v] [--mkinitrd] [--rminitrd]" >&2
83 echo " [--initrdfile=<initrd-image>] [--depmod] [--rmmoddep]" >&2
84 echo " [--kernel-args=<args>] [--banner=<banner>]" >&2
85 echo " [--multiboot=multiboot] [--mbargs=mbargs]" >&2
86 echo " [--make-default] <--install | --remove> <kernel-version>" >&2
87 echo " (ex: `basename $0` --mkinitrd --depmod --install 2.4.7-2)" >&2
88 exit 1
89 }
90
91 install() {
92 # XXX kernel should be able to be specified also (or work right on ia64)
93 if [ ! -f $bootPrefix/$kernelName-$version ] ; then
94 [ -n "$verbose" ] && echo "kernel for $version does not exist, not running grubby"
95 return
96 fi
97
98 INITRD=""
99 if [ -f $initrdfile ]; then
100 [ -n "$verbose" ] && echo "found $initrdfile and using it with grubby"
101 INITRD="--initrd $initrdfile"
102 fi
103
104 # FIXME: is this a good heuristic to find out if we're on iSeries?
105 if [ -d /proc/iSeries ]; then
106 [ -n "$verbose" ] && echo "On an iSeries, just making img file"
107 if [ -z $initrdfile ]; then
108 [ -n "$verbose" ] && echo "No initrd, just adding system map"
109 /sbin/addSystemMap $bootPrefix/System.map-$version $bootPrefix/$kernelName-$version $bootPrefix/vmlinitrd-$version
110 else
111 /sbin/addSystemMap $bootPrefix/System.map-$version $bootPrefix/$kernelName-$version $bootPrefix/vmlinux.sm-$version
112 /sbin/addRamDisk $initrdfile $bootPrefix/System.map-$version $bootPrefix/vmlinux.sm-$version $bootPrefix/vmlinitrd-$version 2>/dev/null
113 rm $bootPrefix/vmlinux.sm-$version
114 fi
115 return
116 fi
117
118 # get the root filesystem to use; if it's on a label make sure it's
119 # been configured. if not, get the root device from mount
120 rootdevice=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $1; }}' /etc/fstab)
121 short=$(echo $rootdevice | cut -d= -f1)
122 if [ "$short" == "LABEL" ]; then
123 label=$(echo $rootdevice | cut -d= -f2 |head -n 1)
124 device=$(echo "showlabels" | /sbin/nash --force --quiet |
125 awk '$2 == "'$label'" {print $1}')
126 if [ -z "$device" ]; then
127 rootdevice=$(mount | awk '$3 == "/" { print $1 }')
128 fi
129 fi
130
131 if [ -n "$mbkernel" ]; then
132 mb="--add-multiboot=$mbkernel"
133 if [ -n "$mbargs" ]; then
134 mb="$mb --mbargs=$mbargs"
135 fi
136 [ -n "$verbose" ] && echo "multiboot specified, not updating lilo.conf"
137 cfgLilo=""
138 fi
139
140 if [ -n "$cfgGrub" ]; then
141 [ -n "$verbose" ] && echo "adding $version to $grubConfig"
142
143 if [ -n "$banner" ]; then
144 title="$banner ($version)"
145 elif [ -f /etc/mageversion ]; then
146 title="Magellan Linux $(< /etc/mageversion) ($version)"
147 else
148 title="Magellan Linux ($version)"
149 fi
150 /sbin/grubby --add-kernel=$bootPrefix/$kernelName-$version $INITRD \
151 --copy-default $makedefault $mb --title "$title" \
152 --args="root=$rootdevice $kernargs" \
153 --remove-kernel="TITLE=$title"
154 else
155 [ -n "$verbose" ] && echo "$grubConfig does not exist, not running grubby"
156 fi
157
158 if [ -n "$cfgLilo" ]; then
159 [ -n "$verbose" ] && echo "adding $version to $liloConfig"
160
161 /sbin/grubby --add-kernel=$bootPrefix/$kernelName-$version $INITRD \
162 --copy-default $makedefault --title $version \
163 --args="root=$rootdevice $kernargs" \
164 --remove-kernel="TITLE=$version" \
165 --$liloFlag
166
167 if [ -n "$runLilo" ]; then
168 [ -n "$verbose" ] && echo "running $lilo"
169 if [ ! -x $lilo ] ; then
170 [ -n "$verbose" ] && echo "$lilo does not exist"
171 else
172 $lilo > /dev/null
173 fi
174 fi
175 else
176 [ -n "$verbose" ] && echo "$liloConfig does not exist, not running grubby"
177 fi
178
179 }
180
181 remove() {
182 # FIXME: is this a good heuristic to find out if we're on iSeries?
183 if [ -d /proc/iSeries ]; then
184 [ -n "$verbose" ] && echo "On an iSeries, remove img file"
185 rm -f $bootPrefix/$kernelName-$version.img 2>/dev/null
186 return
187 fi
188
189 if [ -n "$cfgGrub" ]; then
190 [ -n "$verbose" ] && echo "removing $version from $grubConfig"
191 /sbin/grubby --remove-kernel=$bootPrefix/$kernelName-$version
192 else
193 [ -n "$verbose" ] && echo "$grubConfig does not exist, not running grubby"
194 fi
195
196 if [ -n "$cfgLilo" ]; then
197 [ -n "$verbose" ] && echo "removing $version from $liloConfig"
198 /sbin/grubby --remove-kernel=$bootPrefix/$kernelName-$version \
199 --$liloFlag
200
201 if [ -n "$runLilo" ]; then
202 [ -n "$verbose" ] && echo "running $lilo"
203 if [ ! -x $lilo ] ; then
204 [ -n "$verbose" ] && echo "$lilo does not exist"
205 else
206 $lilo > /dev/null
207 fi
208 fi
209 else
210 [ -n "$verbose" ] && echo "$liloConfig does not exist, not running grubby"
211 fi
212 }
213
214 mkinitrd() {
215 [ -n "$verbose" ] && echo "creating initrd $initrdfile using $version"
216 /sbin/mkinitrd --allow-missing -f $initrdfile $version
217 rc=$?
218 if [ $rc != 0 ]; then
219 echo "mkinitrd failed" >&2
220 exit 1
221 fi
222 }
223
224 rminitrd() {
225 [ -n "$verbose" ] && echo "removing initrd $initrdfile"
226 [ -f $initrdfile ] && rm -f $initrdfile
227 }
228
229 doDepmod() {
230 [ -n "$verbose" ] && echo "running depmod for $version"
231 depmod -ae -F /boot/System.map-$version $version
232 }
233
234 doRmmoddep() {
235 [ -n "$verbose" ] && echo "removing modules.dep info for $version"
236 [ -d /lib/modules/$version ] && rm -f /lib/modules/$version/modules.*
237 }
238
239
240 while [ $# -gt 0 ]; do
241 case $1 in
242 --mkinitrd)
243 initrd="make"
244 ;;
245
246 --rminitrd)
247 initrd="remove"
248 ;;
249
250 --initrdfile*)
251 if echo $1 | grep '=' >/dev/null ; then
252 initrdfile=`echo $1 | sed 's/^--initrdfile=//'`
253 else
254 initrdfile=$2
255 shift
256 fi
257 ;;
258
259 --kernel-args*)
260 if echo $1 | grep '=' >/dev/null ; then
261 kernargs=`echo $1 | sed 's/^--kernel-args=//'`
262 else
263 kernargs=$2
264 shift
265 fi
266 ;;
267
268 --banner*)
269 if echo $1 | grep '=' >/dev/null ; then
270 banner=`echo $1 | sed 's/^--banner=//'`
271 else
272 banner=$2
273 shift
274 fi
275 ;;
276
277 --multiboot*)
278 if echo $1 |grep '=' >/dev/null; then
279 mbkernel=`echo $1 | sed 's/^--multiboot=//'`
280 else
281 # can't really support having an optional second arg here
282 # sorry!
283 mbkernel="/boot/xen.gz"
284 fi
285 ;;
286
287 --mbargs*)
288 if echo $1 |grep '=' >/dev/null; then
289 mbargs=`echo $1 | sed 's/^--mbargs=//'`
290 else
291 mbargs=$2
292 shift
293 fi
294 ;;
295
296 --depmod)
297 moddep="make"
298 ;;
299
300 --rmmoddep)
301 moddep="remove"
302 ;;
303
304 --make-default)
305 makedefault="--make-default"
306 ;;
307
308 --package)
309 if echo $1 | grep '=' >/dev/null ; then
310 package=`echo $1 | sed 's/^--package=//'`
311 else
312 package=$2
313 shift
314 fi
315 ;;
316
317 -v)
318 verbose=-v
319 ;;
320
321 *)
322 if [ -z "$mode" ]; then
323 mode=$1
324 elif [ -z "$version" ]; then
325 version=$1
326 else
327 usage
328 fi
329 ;;
330 esac
331
332 shift
333 done
334
335 # make sure the mode is valid
336 if [ "$mode" != "--install" -a "$mode" != "--remove" ] ; then
337 usage
338 fi
339
340 if [ -z "$version" ]; then
341 usage
342 fi
343
344 if [ "$mode" != "--install" -a "$makedefault" ]; then
345 usage
346 fi
347
348 # make sure that /dev/loop exist
349 [[ ! -e /dev/loop ]] && modprobe loop
350
351 kernelmajor=`echo $kernel | cut -d . -f 1,2`
352
353 # kernel image for 2.4 is vmlinux
354 if [ $ARCH = 'ppc64' -o $ARCH = 'ppc' ]; then
355 if [ "$kernelmajor" == "2.4" ]; then
356 kernelName=vmlinux
357 fi
358 fi
359
360
361 # set the initrd file based on arch; ia64 is the only currently known oddball
362 if [ -z "$initrdfile" ]; then
363 if [ `uname -m` = "ia64" ]; then
364 initrdfile="/boot/efi/EFI/redhat/initrd-$version.img"
365 else
366 initrdfile="/boot/initrd-$version.img"
367 fi
368
369 fi
370 [ -n "$verbose" ] && echo "initrdfile is $initrdfile"
371
372 # set this as the default if we have the package and it matches
373 if [ "$mode" == "--install" -a "$UPDATEDEFAULT" == "yes" -a -n "$package" -a -n "$DEFAULTKERNEL" -a "$package" == "$DEFAULTKERNEL" ]; then
374 makedefault="--make-default"
375 [ -n "$verbose" ] && echo "making it the default based on config"
376 fi
377
378 if [ "$moddep" == "make" ]; then
379 doDepmod
380 elif [ "$moddep" == "remove" ]; then
381 doRmmoddep
382 fi
383
384 if [ "$initrd" == "make" ]; then
385 mkinitrd
386 elif [ "$initrd" == "remove" ]; then
387 rminitrd
388 fi
389
390 if [ ! -x $grubby ] ; then
391 [ -n "$verbose" ] && echo "$grubby does not exist"
392 exit 0
393 fi
394
395
396 [ -n "$grubConfig" ] && [ -f "$grubConfig" ] && cfgGrub=1;
397 [ -n "$liloConfig" ] && [ -f "$liloConfig" ] && cfgLilo=1;
398
399 # if we have a lilo config on an x86 box, see if the default boot loader
400 # is lilo to determine if it should be run
401 if [ -n "$cfgLilo" -a -n "$isx86" ]; then
402 runLilo=$($grubby --bootloader-probe | grep lilo)
403 fi
404
405 if [ "$mode" == "--install" ]; then
406 install
407 elif [ "$mode" == "--remove" ]; then
408 remove
409 fi
410
411 exit 0

Properties

Name Value
svn:executable *