]> git.pld-linux.org Git - projects/geninitrd.git/blame - geninitrd
Bug fix: bsp was never used.
[projects/geninitrd.git] / geninitrd
CommitLineData
bb529f94
JK
1#!/bin/sh
2
3# geninitrd
4#
5# by Jacek Konieczny <jajcus@pld.org.pl>
6#
526ea24a 7# based on mkinitrd written by Erik Troan <ewt@redhat.com>
bb529f94
JK
8# and contributors:
9# Elliot Lee <sopwith@cuc.edu>
10# Miguel de Icaza <miguel@nuclecu.unam.mx>
11# Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
12# Michael K. Johnson <johnsonm@redhat.com>
13# Pierre Habraken <Pierre.Habraken@ujf-grenoble.fr>
14# Jakub Jelinek <jj@ultra.linux.cz>
15# Carlo Arenas Belon (carenas@chasqui.lared.net.pe>
16#
17PATH=/sbin:$PATH
18export PATH
19
20VERSION=%VERSIONTAG%
21
22. /etc/rc.d/init.d/functions
23
24COMPRESS="yes"
25FS="rom"
26PROBESCSI="yes"
27PROBEIDE="yes"
28PROBERAID="yes"
a0a82190 29USEBSP="yes"
bb529f94
JK
30
31if [ -f /etc/sysconfig/initrd ] ; then
32 . /etc/sysconfig/initrd
33fi
34
35target=""
36kernel=""
37force=""
38verbose=""
39MODULES=""
40img_vers=""
41modulefile=/etc/modules.conf
42if [ `uname -m` = "ia64" ]; then
43 IMAGESIZE=3000
44else
45 IMAGESIZE=1500
46fi
218614aa 47PRESCSIMODS="scsi_mod unknown sd_mod"
bb529f94
JK
48PREIDEMODS="ide-mod ide-probe-mod ide-disk"
49fstab="/etc/fstab"
50
51usage () {
52 echo "usage: `basename $0` [--version] [-v] [-f] [--ifneeded] [--preload <module>]" >&2
a0a82190
MM
53 echo " [--omit-scsi-modules] [--omit-raid-modules] [--omit-ide-modules]" >&2
54 echo " [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]" >&2
55 echo " [--fs=rom|ext2|cram] [--no-bsp]" >&2
bb529f94
JK
56 echo " <initrd-image> <kernel-version>" >&2
57 echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" >&2
58 exit 1
59}
60
61findmodule() {
62 skiperrors=""
526ea24a 63 modName=$1
bb529f94
JK
64 if [ $(echo $modName | cut -b1) = "-" ]; then
65 skiperrors=1
66 modName=$(echo $modName | cut -b2-)
67 fi
68
69 if [ "$modName" = "pluto" ]; then
526ea24a
AF
70 findmodule fc4
71 findmodule soc
bb529f94
JK
72 fi
73 if [ "$modName" = "fcal" ]; then
526ea24a
AF
74 findmodule fc4
75 findmodule socal
bb529f94
JK
76 fi
77
526ea24a 78 fmPath=`(cd /lib/modules/$kernel; find -type f -name $modName.o)`
bb529f94
JK
79
80 if [ ! -f /lib/modules/$kernel/$fmPath ]; then
81 if [ -n "$skiperrors" ]; then
82 return
83 fi
84
85 # ignore the absence of the scsi modules
86 for n in $PRESCSIMODS; do
87 if [ "$n" = "$modName" ]; then
88 return;
89 fi
90 done;
91
92 # ignore the absence of the ide modules
93 for n in $PREIDEMODS; do
94 if [ "$n" = "$modName" ]; then
95 return;
96 fi
97 done;
98
99 echo "No module $modName found for kernel $kernel" >&2
100 exit 1
101 fi
102
103 # only need to add each module once
474f647f 104 tmpFmPath=`echo $fmPath|awk -F/ '{for(i=1;i<NF;i++) { printf("%s\\/",$i); } { print $NF; }}'`
105 if is_yes "`echo $MODULES | awk '/"'$tmpFmPath'"/ { print "yes"; }' `" ; then : ; else
bb529f94
JK
106 MODULES="$MODULES $fmPath"
107 fi
108}
109
110inst() {
111 if [ "$#" != "2" ];then
112 echo "usage: inst <file> <destination>"
113 return
114 fi
115 [ -n "$verbose" ] && echo "$1 -> $2"
116 cp $1 $2
117}
118
119
120while [ $# -gt 0 ]; do
121 case $1 in
a0a82190
MM
122 --no-bsp)
123 USEBSP="no"
124 ;;
125
bb529f94 126 --fstab*)
474f647f 127 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
f5a2a23b 128 fstab=`echo $1 | awk -F= '{print $2;}'`
bb529f94
JK
129 else
130 fstab=$2
131 shift
132 fi
133 ;;
134
135 --with*)
474f647f 136 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
f5a2a23b 137 modname=`echo $1 | awk -F= '{print $2;}'`
bb529f94
JK
138 else
139 modname=$2
140 shift
141 fi
142
143 BASICMODULES="$BASICMODULES $modname"
144 ;;
145
146 --version)
147 echo "geninitrd: version $VERSION"
148 exit 0
149 ;;
150
151 -v)
152 verbose=-v
153 ;;
154
155 --nocompress)
156 COMPRESS="no"
157 ;;
158
159 --ifneeded)
160 ifneeded=1
161 ;;
162
163 -f)
164 force=1
165 ;;
166 --preload)
474f647f 167 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
f5a2a23b 168 modname=`echo $1 | awk -F= '{print $2;}'`
bb529f94
JK
169 else
170 modname=$2
171 shift
172 fi
173 PREMODS="$PREMODS $modname"
174 ;;
175 --omit-scsi-modules)
176 PRESCSIMODS=""
177 PROBESCSI="no";
178 ;;
179 --omit-raid-modules)
180 PROBERAID="no";
181 ;;
182 --omit-ide-modules)
183 PROBEIDE="no";
184 ;;
06ac05d6 185 --fs)
03315813
AF
186 FS=$2
187 shift
188 ;;
189 --fs*)
f5a2a23b 190 FS=`echo $1 | awk -F= '{print $2;}'`
bb529f94
JK
191 ;;
192 --image-version)
193 img_vers=yes
194 ;;
195 *)
196 if [ -z "$target" ]; then
197 target=$1
198 elif [ -z "$kernel" ]; then
199 kernel=$1
200 else
201 usage
202 fi
203 ;;
204 esac
205
206 shift
207done
208
06ac05d6
AF
209if [ -z "$target" -o -z "$kernel" ]; then
210 usage
211fi
212
8b1e4ac7
AF
213case "$FS" in
214 ext2)
f5d71bb2
JK
215 if [ ! -x /sbin/mke2fs ]; then
216 echo "mke2fs is missing"
8b1e4ac7
AF
217 exit 1
218 fi
219 ;;
220 rom)
221 if [ ! -x /sbin/genromfs ]; then
222 echo "genromfs is missing"
223 exit 1
224 fi
225 ;;
226 cram)
227 if [ ! -x /sbin/mkcramfs ]; then
228 echo "mkcramfs is missing"
229 exit 1
230 fi
231 ;;
232 *)
233 echo "Filesystem $FS not supported"
234 exit 1
235 ;;
236esac
bb529f94 237
bb529f94
JK
238if [ -n "$img_vers" ]; then
239 target="$target-$kernel"
240fi
241
242if [ -z "$force" -a -f $target ]; then
243 echo "$target already exists." >&2
244 exit 1
245fi
246
247if [ ! -d /lib/modules/$kernel ]; then
248 echo "/lib/modules/$kernel is not a directory." >&2
249 exit 1
250fi
251
252for n in $PREMODS; do
526ea24a 253 findmodule $n
bb529f94
JK
254done
255
256rootdev=$(awk '{ if ($2 == "/") { print $1; }}' $fstab)
474f647f 257if is_yes "$PROBESCSI" && is_yes "`echo "$rootdev" | awk '/^\/dev\/sd/ { print "yes"; }'`" ; then
bb529f94
JK
258
259 for n in $PRESCSIMODS; do
218614aa
JK
260 if [ "$n" = "unknown" ] ; then
261 if [ ! -f $modulefile ]; then
262 modulefile=/etc/conf.modules
263 fi
264 if [ -f $modulefile ]; then
474f647f 265 scsimodules=`awk '/scsi_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile| LC_ALL=C sort -u`
218614aa
JK
266 for n in $scsimodules; do
267 # for now allow scsi modules to come from anywhere. There are some
268 # RAID controllers with drivers in block/
526ea24a 269 findmodule $n
218614aa
JK
270 done
271 fi
272 else
526ea24a 273 findmodule $n
218614aa 274 fi
bb529f94
JK
275 done
276
bb529f94
JK
277fi
278
474f647f 279if is_yes "$PROBEIDE" && is_yes "`echo "$rootdev" | awk '/^\/dev\/hd/ { print "yes"; }'`" ; then
bb529f94 280 for n in $PREIDEMODS; do
526ea24a 281 findmodule $n
bb529f94
JK
282 done
283fi
284
285if is_yes "$PROBERAID" ; then
286 # load appropriate raid devices if necessary
474f647f 287 if is_yes "`awk '/^\/dev\/md/ && ! /noauto/ { print "yes"; }' $fstab`" ; then
288 for number in $(awk '/^[\t ]*raid-level/ { print $2; }' /etc/raidtab | LC_ALL=C sort -u) ; do
bb529f94
JK
289 case $number in
290 [0145])
526ea24a 291 findmodule raid$number
bb529f94
JK
292 ;;
293 *)
294 echo "raid level $number (in /etc/raidtab) not recognized" >&2
295 ;;
296 esac
297 done
298 fi
299fi
300
301# check to see if we need to set up a loopback filesystem
474f647f 302if is_yes "`echo $rootdev | cut -d/ -f3 | awk '/loop/ { print "yes"; }'`" ; then
8dce5fcc
JK
303 if [ ! -x /sbin/losetup ]; then
304 echo "losetup is missing"
305 exit 1
306 fi
bb529f94 307 key="^# $(echo $rootdev | cut -d/ -f3 | tr '[a-z]' '[A-Z]'):"
474f647f 308 if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`" ; then
bb529f94
JK
309 echo "The root filesystem is on a $rootdev, but there is no magic entry in $fstab" 1>&2
310 echo "for this device. Consult the geninitrd man page for more information" 2>&2
311 exit 1
312 fi
313
474f647f 314 line=`awk '/'$key'/ { print $0; }' $fstab`
bb529f94
JK
315 loopDev=$(echo $line | awk '{print $3}')
316 loopFs=$(echo $line | awk '{print $4}')
317 loopFile=$(echo $line | awk '{print $5}')
318
319 BASICMODULES="$BASICMODULES -loop"
526ea24a 320 findmodule "-$loopFs"
bb529f94 321 BASICMODULES="$BASICMODULES -${loopFs}"
a0a82190
MM
322 # don't have any clue, how is this supposed to work,
323 # anyway no bsp
324 USEBSP="no"
2b9510ad
MM
325else # Check for other filesystems
326 rootFs=`awk '{if ($2 == "/") {print $3}}' $fstab`
327 findmodule "-$rootFs"
bb529f94
JK
328fi
329
330for n in $BASICMODULES; do
526ea24a 331 findmodule $n
bb529f94
JK
332done
333
334if [ -n "$ifneeded" -a -z "$MODULES" ]; then
335 if [ -n "$verbose" ]; then
336 echo "No modules are needed -- not building initrd image."
337 fi
338 exit 0
339fi
340
341if [ -n "$verbose" ]; then
342 echo "Using modules: $MODULES"
343fi
344
675dbdde 345MNTIMAGE=`mktemp -d /tmp/initrd.XXXXXX`
f5a2a23b 346IMAGE=`mktemp -u /tmp/initrd.img-XXXXXX`
675dbdde 347MNTPOINT=`mktemp -d /tmp/initrd.mnt-XXXXXX`
bb529f94
JK
348RCFILE=$MNTIMAGE/linuxrc
349
350if [ -f $MNTIMAGE ]; then
351 echo "$MNTIMAGE already exists. Remove it and try again" >&2
352 exit 1
353fi
354
355if [ -f $IMAGE ]; then
356 echo "$IMAGE already exists. Remove it and try again" >&2
357 exit 1
358fi
359
360if [ "$FS" = "ext2" ] ; then
361 dd if=/dev/zero of=$IMAGE bs=1k count=$IMAGESIZE 2> /dev/null
362
bb529f94
JK
363 # We have to "echo y |" so that it doesn't complain about $IMAGE not
364 # being a block device
f5d71bb2 365 echo y | mke2fs -F $IMAGE $IMAGESIZE >/dev/null 2>/dev/null
bb529f94
JK
366
367 mkdir -p $MNTPOINT
f5d71bb2 368 mount -o loop -t ext2 $IMAGE $MNTPOINT
bb529f94
JK
369else
370 mkdir -p $MNTPOINT
371fi
372
8b1e4ac7
AF
373
374mkdir -p $MNTIMAGE/{lib,bin,etc,dev,loopfs}
375
bb529f94
JK
376
377# We don't need this directory, so let's save space
378rm -rf $MNTPOINT/lost+found
379
bb529f94
JK
380for MODULE in $MODULES; do
381 cp $verbose -a /lib/modules/$kernel/$MODULE $MNTIMAGE/lib
382done
383
384# mknod'ing the devices instead of copying them works both with and
385# without devfs...
386mknod $MNTIMAGE/dev/console c 5 1
bb529f94 387
a0a82190
MM
388if is_yes "$USEBSP" ; then
389 s=$MNTIMAGE/etc/startup
390 inst /sbin/bsp "$RCFILE"
391 echo "# autogenerated startup" > $s
392 echo "" >> $s
393
394 for MODULE in $MODULES; do
395 module=`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`
396 options=`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' $modulefile`
397
398 if [ -n "$verbose" ]; then
399 echo "Loading module $module with options $options"
400 fi
401 echo "insmod $module.o $options" >> $s
402 done
403else
404 inst /bin/trash "$MNTIMAGE/bin/sh"
405 inst /sbin/insmod.static "$MNTIMAGE/bin/insmod"
406
407 mknod $MNTIMAGE/dev/null c 1 3
408 mknod $MNTIMAGE/dev/ram b 1 1
409 mknod $MNTIMAGE/dev/systty c 4 0
410 for i in 1 2 3 4; do
411 mknod $MNTIMAGE/dev/tty$i c 4 1
412 done
413 mknod $MNTIMAGE/dev/zero c 1 5
414
415 echo "#!/bin/sh" > $RCFILE
416 echo "" >> $RCFILE
417
418 for MODULE in $MODULES; do
419 module=`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`
420 options=`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' $modulefile`
421
422 if [ -n "$verbose" ]; then
423 echo "Loading module $module with options $options"
424 fi
425 echo "echo \"Loading $module module\"" >> $RCFILE
426 echo "insmod /lib/$module.o $options" >> $RCFILE
427 done
428
429 if [ -n "$loopDev" ]; then
430 if [ ! -d /initrd ]; then
431 mkdir /initrd
432 fi
433
434 cp -a $loopDev $MNTIMAGE/dev
435 cp -a $rootdev $MNTIMAGE/dev
436 echo "echo Mounting device containing loopback root filesystem" >> $RCFILE
437 echo "mount -t $loopFs $loopDev /loopfs" >> $RCFILE
438 echo "echo Setting up loopback device $rootdev" >> $RCFILE
439 echo "losetup $rootdev /loopfs$loopFile" >> $RCFILE
bb529f94 440 fi
bb529f94
JK
441fi
442
443chmod +x $RCFILE
444
445(cd $MNTIMAGE; tar cf - .) | (cd $MNTPOINT; tar xf -)
446
8b1e4ac7
AF
447case "$FS" in
448 ext2)
f5d71bb2 449 umount $IMAGE
8b1e4ac7
AF
450 ;;
451 rom)
452 genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel"
453 ;;
454 cram)
455 mkcramfs "$MNTPOINT" "$IMAGE"
8b1e4ac7
AF
456 ;;
457 *)
458 echo "Filesystem $FS not supported by $0";
459esac
bb529f94
JK
460
461if is_yes "$COMPRESS" ; then
462 gzip -9 < $IMAGE > $target
463else
464 cp -a $IMAGE $target
465fi
466rm -rf $MNTIMAGE $MNTPOINT $IMAGE
This page took 0.142178 seconds and 4 git commands to generate.