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