]>
Commit | Line | Data |
---|---|---|
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 | # | |
17 | PATH=/sbin:$PATH | |
18 | export PATH | |
19 | ||
20 | VERSION=%VERSIONTAG% | |
21 | ||
22 | . /etc/rc.d/init.d/functions | |
23 | ||
24 | COMPRESS="yes" | |
25 | FS="rom" | |
26 | PROBESCSI="yes" | |
27 | PROBEIDE="yes" | |
28 | PROBERAID="yes" | |
a0a82190 | 29 | USEBSP="yes" |
bb529f94 JK |
30 | |
31 | if [ -f /etc/sysconfig/initrd ] ; then | |
32 | . /etc/sysconfig/initrd | |
33 | fi | |
34 | ||
35 | target="" | |
36 | kernel="" | |
37 | force="" | |
38 | verbose="" | |
39 | MODULES="" | |
40 | img_vers="" | |
41 | modulefile=/etc/modules.conf | |
42 | if [ `uname -m` = "ia64" ]; then | |
43 | IMAGESIZE=3000 | |
44 | else | |
45 | IMAGESIZE=1500 | |
46 | fi | |
218614aa | 47 | PRESCSIMODS="scsi_mod unknown sd_mod" |
bb529f94 JK |
48 | PREIDEMODS="ide-mod ide-probe-mod ide-disk" |
49 | fstab="/etc/fstab" | |
50 | ||
51 | usage () { | |
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 | ||
61 | findmodule() { | |
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 | ||
110 | inst() { | |
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 | ||
120 | while [ $# -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 | |
207 | done | |
208 | ||
06ac05d6 AF |
209 | if [ -z "$target" -o -z "$kernel" ]; then |
210 | usage | |
211 | fi | |
212 | ||
8b1e4ac7 AF |
213 | case "$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 | ;; | |
236 | esac | |
bb529f94 | 237 | |
bb529f94 JK |
238 | if [ -n "$img_vers" ]; then |
239 | target="$target-$kernel" | |
240 | fi | |
241 | ||
242 | if [ -z "$force" -a -f $target ]; then | |
243 | echo "$target already exists." >&2 | |
244 | exit 1 | |
245 | fi | |
246 | ||
247 | if [ ! -d /lib/modules/$kernel ]; then | |
248 | echo "/lib/modules/$kernel is not a directory." >&2 | |
249 | exit 1 | |
250 | fi | |
251 | ||
252 | for n in $PREMODS; do | |
526ea24a | 253 | findmodule $n |
bb529f94 JK |
254 | done |
255 | ||
256 | rootdev=$(awk '{ if ($2 == "/") { print $1; }}' $fstab) | |
474f647f | 257 | if 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 |
277 | fi |
278 | ||
474f647f | 279 | if 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 |
283 | fi | |
284 | ||
285 | if 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 | |
299 | fi | |
300 | ||
301 | # check to see if we need to set up a loopback filesystem | |
474f647f | 302 | if 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 |
325 | else # Check for other filesystems |
326 | rootFs=`awk '{if ($2 == "/") {print $3}}' $fstab` | |
327 | findmodule "-$rootFs" | |
bb529f94 JK |
328 | fi |
329 | ||
330 | for n in $BASICMODULES; do | |
526ea24a | 331 | findmodule $n |
bb529f94 JK |
332 | done |
333 | ||
334 | if [ -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 | |
339 | fi | |
340 | ||
341 | if [ -n "$verbose" ]; then | |
342 | echo "Using modules: $MODULES" | |
343 | fi | |
344 | ||
675dbdde | 345 | MNTIMAGE=`mktemp -d /tmp/initrd.XXXXXX` |
f5a2a23b | 346 | IMAGE=`mktemp -u /tmp/initrd.img-XXXXXX` |
675dbdde | 347 | MNTPOINT=`mktemp -d /tmp/initrd.mnt-XXXXXX` |
bb529f94 JK |
348 | RCFILE=$MNTIMAGE/linuxrc |
349 | ||
350 | if [ -f $MNTIMAGE ]; then | |
351 | echo "$MNTIMAGE already exists. Remove it and try again" >&2 | |
352 | exit 1 | |
353 | fi | |
354 | ||
355 | if [ -f $IMAGE ]; then | |
356 | echo "$IMAGE already exists. Remove it and try again" >&2 | |
357 | exit 1 | |
358 | fi | |
359 | ||
360 | if [ "$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 |
369 | else |
370 | mkdir -p $MNTPOINT | |
371 | fi | |
372 | ||
8b1e4ac7 AF |
373 | |
374 | mkdir -p $MNTIMAGE/{lib,bin,etc,dev,loopfs} | |
375 | ||
bb529f94 JK |
376 | |
377 | # We don't need this directory, so let's save space | |
378 | rm -rf $MNTPOINT/lost+found | |
379 | ||
bb529f94 JK |
380 | for MODULE in $MODULES; do |
381 | cp $verbose -a /lib/modules/$kernel/$MODULE $MNTIMAGE/lib | |
382 | done | |
383 | ||
384 | # mknod'ing the devices instead of copying them works both with and | |
385 | # without devfs... | |
386 | mknod $MNTIMAGE/dev/console c 5 1 | |
bb529f94 | 387 | |
a0a82190 MM |
388 | if 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 | |
403 | else | |
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 |
441 | fi |
442 | ||
443 | chmod +x $RCFILE | |
444 | ||
445 | (cd $MNTIMAGE; tar cf - .) | (cd $MNTPOINT; tar xf -) | |
446 | ||
8b1e4ac7 AF |
447 | case "$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"; | |
459 | esac | |
bb529f94 JK |
460 | |
461 | if is_yes "$COMPRESS" ; then | |
462 | gzip -9 < $IMAGE > $target | |
463 | else | |
464 | cp -a $IMAGE $target | |
465 | fi | |
466 | rm -rf $MNTIMAGE $MNTPOINT $IMAGE |