]> git.pld-linux.org Git - projects/geninitrd.git/blame - geninitrd
- and more things to do
[projects/geninitrd.git] / geninitrd
CommitLineData
bb529f94
JK
1#!/bin/sh
2
3# geninitrd
4#
5# by Jacek Konieczny <jajcus@pld.org.pl>
6#
413878f8 7# based on mkinitrd from RedHat
c31050f3 8
78ba9381 9RCSID='$Id: geninitrd,v 2.24 2002/11/27 17:56:24 wiget Exp $'
bb529f94
JK
10PATH=/sbin:$PATH
11export PATH
12
2b649ae0 13VERSION="`echo "$RCSID"|awk '{print $3}'`"
bb529f94
JK
14
15. /etc/rc.d/init.d/functions
16
17COMPRESS="yes"
2ad94d8a
AF
18# INITRDFS is set later (catch obsoleted FS option)
19#INITRDFS="rom"
6bd433bc 20USERAIDSTART="yes"
7c38b114 21uselvm="no"
10c3df06
MM
22# it should be safe to remove scsi_mod from here, but I'm not sure...
23PRESCSIMODS="-scsi_mod unknown -sd_mod"
24PREIDEMODS="-ide-probe -ide-probe-mod -ide-disk"
bb529f94
JK
25target=""
26kernel=""
27force=""
28verbose=""
29MODULES=""
30img_vers=""
7c38b114
AF
31modulefile="/etc/modules.conf"
32raidtab="/etc/raidtab"
bb529f94
JK
33fstab="/etc/fstab"
34
35usage () {
a2c2980f 36 echo "usage: `basename $0` [--version] [-v] [-f] [--ifneeded] [--preload <module>]" 1>&2
c31050f3 37 echo " [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]" 1>&2
fd2dc249 38 echo " [--initrdfs=rom|ext2|cram] [--modules-conf=<modules.conf>]" 1>&2
6bd433bc 39 echo " [--with-raidstart] [--without-raidstart]" 1>&2
a2c2980f
AF
40 echo " <initrd-image> <kernel-version>" 1>&2
41 echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" 1>&2
7d2fc5eb 42 exit 1
bb529f94
JK
43}
44
aa69da6e 45
10c3df06
MM
46my_dirname() {
47 echo $1|awk -F/ '{print substr($0, 0, length($0) - length($NF));}'
48}
49
50find_depmod () {
51 typeset mods module f level depfile first
52
53 depfile=/lib/modules/$kernel/modules.dep
f6de9380
MM
54
55 if test -f $depfile ; then
56 : ok
57 else
c83257bc
AF
58 echo "Error: no $depfile ! Run depmod and rerun geninitrd." 1>&2
59 exit 1
f6de9380
MM
60 fi
61
4fd11db9 62 # prepend / if no path given, append .o.gz if not given,
10c3df06 63 # quote /
3b00e899 64 origmodule="$2"
10c3df06
MM
65 module=$(echo "$2" | \
66 awk '/\// {print;next} {print "/" $0}' | \
4fd11db9 67 awk '/\./ {print;next} {print $0 ".o.gz"}' |
10c3df06
MM
68 awk '{gsub("/","\\/");print}')
69 mods=$(awk '
70BEGIN { here = 0 }
71/'"$module"':(.*)/ { gsub(/:/," "); gsub(/\\/," "); print; here = 1; next }
72/:/ { here = 0 }
73/(.*)/ { gsub(/\\/," "); if (here) print }
4fd11db9
AF
74' $depfile | xargs)
75
76 # fallback to .o
77 if [ "$mods" = "" ] ; then
78 module=$(echo "$module" | \
79 awk '{gsub("\.o\.gz$","\.o",$0);print}')
80 fi
81 mods=$(awk '
82BEGIN { here = 0 }
83/'"$module"':(.*)/ { gsub(/:/," "); gsub(/\\/," "); print; here = 1; next }
84/:/ { here = 0 }
85/(.*)/ { gsub(/\\/," "); if (here) print }
10c3df06
MM
86' $depfile | xargs)
87
88 if [ "$mods" = "" ] ; then
89 if [ "$1" != silent ] ; then
3b00e899 90 echo "$origmodule: module not found in $depfile" 1>&2
10c3df06 91 fi
fd2dc249
AF
92 if ! is_no "$EXIT_IF_MISSING" ; then
93 exit 1
94 else
3b00e899 95 echo "If $origmodule isn't compiled in kernel then this initrd may not start your system". 1>&2
fd2dc249 96 fi
10c3df06
MM
97 fi
98
99 level=$3
100 if [ "$level" = "" ] ; then
101 level=0
102 fi
103 level=$(awk "BEGIN{print $level + 1}")
104 if [ $level -gt 20 ] ; then
3b00e899 105 echo "$origmodule: cycle in $depfile" 1>&2
10c3df06
MM
106 exit 1
107 fi
108
109 first=
110 for f in $mods ; do
111 if [ "$first" = "" ] ; then
112 first=$f
413878f8 113 else
10c3df06 114 find_depmod $1 $f $level
9c9f7cdb 115 fi
aa69da6e 116 done
10c3df06
MM
117
118 echo $first
aa69da6e 119}
120
10c3df06
MM
121addmodule() {
122 fmPath=$1
123 skiperrors=$2
124
125 if [ ! -f "/lib/modules/$kernel/$fmPath" ]; then
126 if [ -n "$skiperrors" ]; then
127 return
128 fi
129
130 echo "module $fmPath present in modules.dep, but not in filesystem (kernel = $kernel)" 1>&2
131 exit 1
132 fi
133
134 # only need to add each module once
135 # quote /
136 tmpFmPath=$(echo $fmPath | awk '{gsub(/\//,"\\/");print}')
137 if echo "$MODULES" | awk '/'"$tmpFmPath"'/ {exit 1}' ; then
138 MODULES="$MODULES $fmPath"
139 fi
81de8443
AF
140}
141
bb529f94 142findmodule() {
413878f8 143 skiperrors=""
144 modName=$1
10c3df06 145
413878f8 146 if [ "$(echo $modName | awk '{print(substr($0,1,1));}')" = "-" ]; then
147 skiperrors=1
148 modName="$(echo $modName | awk '{print(substr($0,2));}')"
149 fi
bb529f94 150
10c3df06 151 # what's that?
413878f8 152 if [ "$modName" = "pluto" ]; then
153 findmodule fc4
154 findmodule soc
155 fi
156 if [ "$modName" = "fcal" ]; then
157 findmodule fc4
158 findmodule socal
159 fi
bb529f94 160
10c3df06
MM
161 if [ -n "$skiperrors" ]; then
162 allModulesToFind=`find_depmod silent $modName`
163 else
164 allModulesToFind=`find_depmod normal $modName`
165 if [ $? != 0 ] ; then
166 exit 1
413878f8 167 fi
413878f8 168 fi
10c3df06
MM
169
170 for mod in $allModulesToFind ; do
171 mod=$(echo $mod | \
172 awk '{sub(/^\/lib\/modules\/[^\/]*\//,"");print}')
173 addmodule $mod "$skiperrors"
174 done
bb529f94
JK
175}
176
177inst() {
413878f8 178 if [ "$#" != "2" ];then
179 echo "usage: inst <file> <destination>"
180 return
c31050f3 181 fi
413878f8 182 [ -n "$verbose" ] && echo "$1 -> $2"
183 cp "$1" "$2"
bb529f94
JK
184}
185
a2c2980f
AF
186get_label_ext2 () {
187 /sbin/e2label $1 2> /dev/null
188}
189
190get_uuid_ext2 () {
c31050f3 191 /sbin/tune2fs -l $1 2> /dev/null | awk -F: '/UUID:/ {gsub(" ",""); print $2}'
a2c2980f
AF
192}
193
194get_label_xfs () {
3b9c8219 195 /usr/sbin/xfs_db -x -p xfs_admin -c label -r "$1"|awk -F= '{sub("^\"","", $2); sub("\"$", "", $2); print $2}'
c31050f3 196
a2c2980f
AF
197}
198
199get_uuid_xfs () {
3b9c8219 200 /usr/sbin/xfs_db -x -p xfs_admin -c uuid -r "$1"|awk -F= '{print $2}'
a2c2980f
AF
201}
202
c31050f3 203find_root() {
a2c2980f
AF
204 eval `awk '/^[\t ]*#/ {next} {if ( $2 == "/" ) {print "rootdev=\"" $1 "\"\nrootFs=\"" $3 "\""}}' $fstab`
205 case $rootdev in
206 LABEL=*)
4fd11db9
AF
207 if [ -x /sbin/findfs -a \( "$rootFs." = "ext2." -o "$rootFs." = "ext3." \) ] ; then
208 rootdev2="`/sbin/findfs $rootdev 2>/dev/null`"
209 if [ -n "$rootdev2" ] ; then
210 rootdev=$rootdev2
211 rootdev_found=1
a2c2980f 212 fi
4fd11db9
AF
213 fi
214 if [ "$rootdev_found." != "1." ] ; then
215 case $rootFs in
216 ext2|ext3)
217 if [ ! -x /sbin/e2label ] ; then
218 echo "/sbin/e2label is missing" 1>&2
219 exit 1
220 fi
221 get_label="get_label_ext2"
222 ;;
223 xfs)
224 if [ ! -x /usr/sbin/xfs_db ] ; then
225 echo "/usr/sbin/xfs_db is missing" 1>&2
226 exit 1
227 fi
228 get_label="get_label_xfs"
229 ;;
230 *)
231 echo "LABEL on $rootFs in not supported by geninitrd" 1>&2
232 exit 1
233 ;;
234 esac
235 if [ ! -r /proc/partitions ] ; then
236 echo '/proc/partitions is not readable'; 1>&2
3b9c8219
AF
237 exit 1
238 fi
4fd11db9
AF
239 label=${rootdev#"LABEL="}
240 for dev in `awk 'BEGIN {getline;getline} {print "/dev/" $4}' /proc/partitions` ; do
241 if [ -r $dev ] && [ "$label" = "`$get_label $dev`" ] ; then
242 if [ -n "$verbose" ] ; then
243 echo "Using $dev as device for rootfs"
244 fi
245 rootdev=$dev
246 rootdev_found=1
247 break
a2c2980f 248 fi
4fd11db9
AF
249 done
250 if [ "$rootdev_found." != "1." ] ; then
251 echo "geninitrd can't find real device for LABEL=$label" 1>&2
252 exit 1
253 fi
a2c2980f
AF
254 fi
255 ;;
256 UUID=*)
4fd11db9
AF
257 if [ -x /sbin/findfs -a \( "$rootFs." = "ext2." -o "$rootFs." = "ext3." \) ] ; then
258 rootdev2="`/sbin/findfs $rootdev 2>/dev/null`"
259 if [ -n "$rootdev2" ] ; then
260 rootdev=$rootdev2
261 rootdev_found=1
a2c2980f 262 fi
4fd11db9
AF
263 fi
264 if [ "$rootdev_found." != "1." ] ; then
265 case $rootFs in
266 ext2|ext3)
267 if [ ! -x /sbin/tune2fs ] ; then
268 echo "/sbin/tune2fs is missing" 1>&2
269 exit 1
270 fi
271 get_uuid="get_uuid_ext2"
272 ;;
273 xfs)
274 if [ ! -x /usr/sbin/xfs_db ] ; then
275 echo "/usr/sbin/xfs_db is missing" 1>&2
276 exit 1
277 fi
278 get_label="get_uuid_xfs"
279 ;;
280 *)
281 echo "UUID on $rootFs in not supported by geninitrd" 1>&2
282 exit 1
283 ;;
284 esac
285 if [ ! -r /proc/partitions ] ; then
286 echo '/proc/partitions is not readable'; 1>&2
3b9c8219
AF
287 exit 1
288 fi
4fd11db9
AF
289 uuid=${rootdev#"UUID="}
290 for dev in `awk 'BEGIN {getline;getline} {print "/dev/" $4}' /proc/partitions` ; do
291 if [ -r $dev ] && [ "$uuid" = "`$get_uuid $dev`" ] ; then
292 if [ -n "$verbose" ] ; then
293 echo "Using $dev as device for rootfs"
294 fi
295 rootdev=$dev
296 rootdev_found=1
297 break
a2c2980f 298 fi
4fd11db9
AF
299 done
300 if [ "$rootdev_found" != 1 ] ; then
301 echo "geninitrd can't find real device for UUID=$uuid" 1>&2
302 exit 1
303 fi
a2c2980f
AF
304 fi
305 ;;
306 esac
307
308}
bb529f94 309
7c38b114
AF
310find_modules_softraid() {
311 eval `awk -v rootdev="$1" 'BEGIN {
312 found="no";
313 dev_list="";
314}
315
316{
317 gsub("\t"," ");
318 gsub(" +", " ");
319 gsub("^ ","");
320 if (/^[\t ]*#/)
321 next;
322 if (/^raiddev/) {
323 if ($2 == rootdev) {
324 found="yes";
325 } else {
326 if (found == "yes") {
327 exit 0;
328 };
329 };
330 };
331 if (found == "yes") {
332 if ($1 == "device") {
333 dev_list = dev_list " " $2;
334 };
335 if ($1 == "raid-level") {
336 raidlevel=$2;
337 }
338 };
339}
340
341END {
342 print "raidfound=" found "\nraidlevel=" raidlevel "\ndev_list=\"" dev_list "\"\n";
343}' $raidtab `
344 if is_yes "$raidfound" ; then
345 case "$raidlevel" in
346 [0145])
347 findmodule "raid$raidlevel"
348 ;;
349 linear)
350 findmodule "linear"
351 ;;
352 *)
353 echo "raid level $number (in $raidtab) not recognized" 1>&2
354 ;;
355 esac
356 fi
357 for device in $dev_list; do
358 find_modules_for $device
359 done
360}
361
362find_modules_scsi() {
363 for n in $PRESCSIMODS; do
364 if [ "X$n" = "Xunknown" ] ; then
365 if [ ! -f "$modulefile" ]; then
366 modulefile=/etc/conf.modules
367 fi
368 if [ -f "$modulefile" ]; then
369 scsimodules="`awk '/scsi_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile| LC_ALL=C sort -u`"
370 for n in $scsimodules; do
371 # for now allow scsi modules to come from anywhere. There are some
372 # RAID controllers with drivers in block
373 findmodule "$n"
374 done
375 fi
376 else
377 findmodule "$n"
378 fi
379 done
380}
381
382find_modules_ide() {
383 for n in $PREIDEMODS; do
384 findmodule "$n"
385 done
386}
387
388find_modules_for() {
389 if is_yes "`echo "$1" | awk '/^\/dev\/md/ { print "yes"; }'`"; then
390 find_modules_softraid "$1"
391 elif is_yes "$(echo "$1" | awk '/^\/dev\/(sd|scsi)/ { print "yes"; }')" ; then
392 find_modules_scsi
393 elif is_yes "`echo "$1" | awk '/^\/dev\/(hd|ide|ataraid)/ { print "yes"; }'`" ; then
394 find_modules_ide
395 elif is_yes "`echo "$1" | awk '/\/dev\/rd\// { print "yes"; }'`" ; then
396 findmodule "DAC960"
397 elif is_yes "`echo "$1" | awk '/\/dev\/ida\// { print "yes"; }'`" ; then
398 findmodule "cpqarray"
399 elif is_yes "`echo "$1" | awk '/\/dev\/cciss\// { print "yes"; }'`" ; then
400 findmodule "cciss"
401 elif is_yes "`echo "$1" | awk '/\/dev\/ataraid\// { print "yes"; }'`"; then
402 findmodule "ataraid"
403 ataraidmodules="`awk '/ataraid_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile| LC_ALL=C sort -u`"
404 if -n "$ataraidmodules" ; then
405 # FIXME: think about modules compiled in kernel
406 echo "ERROR: ataraid_hostadapter alias not defined in $modulefile !"
407 echo "Please set it and run $0 again."
408 exit 1
409 fi
410 for n in $ataraidmodules; do
411 findmodule "$n"
412 done
413 # check to see if we need to set up a loopback filesystem
414 elif is_yes "`echo "$1" | awk -F/ '{print($3);}' | awk '/loop/ { print "yes"; }'`" ; then
415 echo "Sorry, root on loop device isn't supported." 1>&2
416 exit 1
417 # TODO: rewrite for bsp and make nfs ready
418 if [ ! -x /sbin/losetup ]; then
419 echo "losetup is missing"
420 exit 1
421 fi
422 key="^# $(echo $1 | awk -F/ '{print($3);}' | tr '[a-z]' '[A-Z]'):"
423 if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`" ; then
424 echo "The root filesystem is on a $1, but there is no magic entry in $fstab" 1>&2
425 echo "for this device. Consult the geninitrd man page for more information" 1>&2
426 exit 1
427 fi
428
429 line="`awk '/'$key'/ { print $0; }' $fstab`"
430 loopDev="$(echo $line | awk '{print $3}')"
431 loopFs="$(echo $line | awk '{print $4}')"
432 loopFile="$(echo $line | awk '{print $5}')"
433
434 BASICMODULES="$BASICMODULES -loop"
435 findmodule "-$loopFs"
436 BASICMODULES="$BASICMODULES -${loopFs}"
437 # don't have any clue, how is this supposed to work
438 elif ls -l "$1"|awk '{if (/^b/) { if ($5 == "58,") { exit 0; } else { exit 1; } } else { exit 1; }}'; then
439 if [ ! -f /sbin/initrd-lvm ] ; then
440 echo "ERROR: root on LVM but /sbin/initrd-lvm not found."
441 echo "Please install lvm-initrd package and rerun $0."
442 exit 1
443 fi
444 if [ -n "$PVDEVICES" ] ; then
445 for device in $PVDEVICES; do
446 find_modules_for $device
447 done
448 else
449 echo "ERROR: Sorry, but searching for PV isn't implemented yet."
450 echo "Use PVDEVICES in /etc/sysconfig/geninitrd to set it."
451 exit 1
452 fi
453 findmodule "-lvm"
454 findmodule "-lvm-mod"
455 uselvm="yes"
456 fi
457}
458
5dc785c7 459if [ -r /etc/sysconfig/geninitrd ] ; then
460 . /etc/sysconfig/geninitrd
461fi
462
2ad94d8a
AF
463if [ "x" = "x$INITRDFS" ] ; then
464 if [ "x" = "x$FS" ] ; then
465 # default value
466 INITRDFS="rom"
467 else
468 echo "Warning: FS configuration options is obsoleted. Use INITRDFS instead" 1>&2
469 INITRDFS="$FS"
470 fi
471fi
472
fd2dc249
AF
473if [ ! -x /sbin/bsp ] ; then
474 echo "/sbin/bsp is missing !"
475 exit 1
5dc785c7 476fi
477if [ "`uname -m`" = "ia64" ]; then
478 IMAGESIZE=3000
479else
480 IMAGESIZE=1500
481fi
bb529f94 482while [ $# -gt 0 ]; do
413878f8 483 case $1 in
6bd433bc
AF
484 --fstab=*)
485 fstab="`echo $1 | awk -F= '{print $2;}'`"
486 ;;
487 --fstab)
488 fstab="$2"
489 shift
413878f8 490 ;;
cd670d83
AF
491 --modules-conf=*)
492 modulefile="`echo $1 | awk -F= '{print $2;}'`"
493 ;;
57188d60 494 --modules-conf)
cd670d83
AF
495 modulefile="$2"
496 shift
497 ;;
611e9e47
AF
498 --raidtab=*)
499 raidtab="`echo $1 | awk -F= '{print $2;}'`"
500 ;;
501 --raidtab)
502 raidtab="$2"
503 shift
504 ;;
6bd433bc
AF
505 --use-raidstart|--with-raidstart)
506 USERAIDSTART="yes"
507 ;;
508 --without-raidstart)
509 USERAIDSTART="no"
510 ;;
511 --with=*)
512 BASICMODULES="$BASICMODULES `echo $1 | awk -F= '{print $2;}'`"
513 ;;
514 --with)
515 BASICMODULES="$BASICMODULES $2"
516 shift
413878f8 517 ;;
bb529f94 518 --version)
413878f8 519 echo "geninitrd: version $VERSION"
520 exit 0
521 ;;
bb529f94 522 -v)
413878f8 523 verbose=-v
524 ;;
bb529f94 525 --nocompress)
413878f8 526 COMPRESS="no"
527 ;;
bb529f94 528 --ifneeded)
413878f8 529 ifneeded=1
530 ;;
bb529f94 531 -f)
413878f8 532 force=1
533 ;;
6bd433bc
AF
534 --preload=*)
535 PREMODS="$PREMODS `echo $1 | awk -F= '{print $2;}'`"
536 ;;
537 --preload)
72623c13 538 PREMODS="$PREMODS $2"
6bd433bc 539 shift
413878f8 540 ;;
2ad94d8a
AF
541 --fs=*)
542 echo "Warning: --fs option is obsoleted. Use --initrdfs instead" 1>&2
543 INITRDFS="`echo $1 | awk -F= '{print $2;}'`"
544 ;;
2ad94d8a
AF
545 --fs)
546 echo "Warning: --fs option is obsoleted. Use --initrdfs instead" 1>&2
547 INITRDFS="$2"
548 shift
cd670d83 549 ;;
6bd433bc
AF
550 --initrdfs=*)
551 INITRDFS="`echo $1 | awk -F= '{print $2;}'`"
552 ;;
fd2dc249 553 --initrdfs)
2ad94d8a 554 INITRDFS="$2"
413878f8 555 shift
556 ;;
bb529f94 557 --image-version)
413878f8 558 img_vers=yes
559 ;;
bb529f94 560 *)
413878f8 561 if [ -z "$target" ]; then
562 target="$1"
563 elif [ -z "$kernel" ]; then
564 kernel="$1"
565 else
566 usage
567 fi
568 ;;
569 esac
570
571 shift
bb529f94
JK
572done
573
06ac05d6 574if [ -z "$target" -o -z "$kernel" ]; then
413878f8 575 usage
06ac05d6
AF
576fi
577
2ad94d8a 578case "$INITRDFS" in
8b1e4ac7 579 ext2)
f5d71bb2 580 if [ ! -x /sbin/mke2fs ]; then
a2c2980f 581 echo "/sbin/mke2fs is missing" 1>&2
8b1e4ac7
AF
582 exit 1
583 fi
584 ;;
585 rom)
586 if [ ! -x /sbin/genromfs ]; then
a2c2980f 587 echo "/sbin/genromfs is missing" 1>&2
8b1e4ac7
AF
588 exit 1
589 fi
590 ;;
591 cram)
592 if [ ! -x /sbin/mkcramfs ]; then
a2c2980f 593 echo "/sbin/mkcramfs is missing" 1>&2
8b1e4ac7
AF
594 exit 1
595 fi
c31050f3 596 ;;
8b1e4ac7 597 *)
2ad94d8a 598 echo "Filesystem $INITRDFS on initrd is not supported" 1>&2
8b1e4ac7
AF
599 exit 1
600 ;;
601esac
bb529f94 602
bb529f94 603if [ -n "$img_vers" ]; then
413878f8 604 target="$target-$kernel"
bb529f94
JK
605fi
606
35164381 607if [ -z "$force" -a -f "$target" ]; then
a2c2980f 608 echo "$target already exists." 1>&2
413878f8 609 exit 1
bb529f94
JK
610fi
611
35164381 612if [ ! -d "/lib/modules/$kernel" ]; then
a2c2980f 613 echo "/lib/modules/$kernel is not a directory." 1>&2
413878f8 614 exit 1
bb529f94
JK
615fi
616
617for n in $PREMODS; do
35164381 618 findmodule "$n"
bb529f94
JK
619done
620
7c38b114
AF
621# allow forcing loading SCSI and/or IDE modules
622if is_yes "$ADDSCSI" ; then
623 find_modules_scsi
bb529f94
JK
624fi
625
7c38b114
AF
626if is_yes "$ADDIDE" ; then
627 find_modules_ide
cd670d83
AF
628fi
629
7c38b114 630find_root
cd670d83 631
7c38b114 632find_modules_for "$rootdev"
cd670d83 633
7c38b114 634findmodule "-$rootFs"
bb529f94 635
c31050f3 636for n in $BASICMODULES; do
7d2fc5eb 637 findmodule "$n"
bb529f94
JK
638done
639
7c38b114 640
bb529f94 641if [ -n "$ifneeded" -a -z "$MODULES" ]; then
7d2fc5eb 642 if [ -n "$verbose" ]; then
643 echo "No modules are needed -- not building initrd image."
644 fi
645 exit 0
bb529f94
JK
646fi
647
648if [ -n "$verbose" ]; then
7d2fc5eb 649 echo "Using modules: $MODULES"
bb529f94
JK
650fi
651
35164381
SZ
652MNTIMAGE="`mktemp -d /tmp/initrd.XXXXXX`"
653IMAGE="`mktemp -u /tmp/initrd.img-XXXXXX`"
654MNTPOINT="`mktemp -d /tmp/initrd.mnt-XXXXXX`"
655RCFILE="$MNTIMAGE/linuxrc"
bb529f94 656
35164381 657if [ -f "$MNTIMAGE" ]; then
c31050f3 658 echo "$MNTIMAGE already exists. Remove it and try again" 1>&2
7d2fc5eb 659 exit 1
bb529f94
JK
660fi
661
35164381 662if [ -f "$IMAGE" ]; then
a2c2980f 663 echo "$IMAGE already exists. Remove it and try again" 1>&2
7d2fc5eb 664 exit 1
bb529f94
JK
665fi
666
2ad94d8a 667if [ "$INITRDFS" = "ext2" ] ; then
35164381 668 dd if=/dev/zero of="$IMAGE" bs=1k count="$IMAGESIZE" 2> /dev/null
bb529f94 669
bb529f94
JK
670 # We have to "echo y |" so that it doesn't complain about $IMAGE not
671 # being a block device
35164381 672 echo y | mke2fs -F "$IMAGE" "$IMAGESIZE" >/dev/null 2>/dev/null
bb529f94 673
35164381
SZ
674 mkdir -p "$MNTPOINT"
675 mount -o loop -t ext2 "$IMAGE" "$MNTPOINT"
bb529f94 676else
35164381 677 mkdir -p "$MNTPOINT"
bb529f94
JK
678fi
679
8b1e4ac7 680
35164381 681mkdir -p "$MNTIMAGE"/{lib,bin,etc,dev,loopfs}
8b1e4ac7 682
bb529f94
JK
683
684# We don't need this directory, so let's save space
35164381 685rm -rf "$MNTPOINT"/lost+found
bb529f94 686
bb529f94 687for MODULE in $MODULES; do
81de8443
AF
688 MODULEDIR="`my_dirname "$MODULE"`"
689 mkdir -p "$MNTIMAGE/lib/modules/$kernel/$MODULEDIR"
690 cp $verbose -a "/lib/modules/$kernel/$MODULE" "$MNTIMAGE/lib/modules/$kernel/$MODULE"
4fd11db9 691 gunzip "$MNTIMAGE/lib/modules/$kernel/$MODULE" 2> /dev/null
bb529f94
JK
692done
693
694# mknod'ing the devices instead of copying them works both with and
695# without devfs...
35164381 696mknod "$MNTIMAGE/dev/console" c 5 1
bb529f94 697
fd2dc249 698s="$MNTIMAGE/etc/startup"
ef66f232
MM
699
700if test -f /sbin/bsp-raidless ; then
701 inst /sbin/bsp-raidless "$RCFILE"
702else
703 inst /sbin/bsp "$RCFILE"
704fi
705
fd2dc249
AF
706echo "# autogenerated startup" > "$s"
707echo "" >> "$s"
c31050f3 708
fd2dc249 709for MODULE in $MODULES; do
4fd11db9
AF
710 MODULE2="`my_dirname "$MODULE"`"
711 NAME2=`basename "$MODULE" .gz`
712 MODULE2=$MODULE2/$NAME2
fd2dc249
AF
713 module="`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`"
714 options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`"
c31050f3 715
fd2dc249
AF
716 if [ -n "$verbose" ]; then
717 /bin/echo -n "Loading module $module "
718 if [ -n "$options" ] ; then
719 echo "with options $options."
ea10b6a5 720 else
fd2dc249 721 echo "without options."
7d2fc5eb 722 fi
7d2fc5eb 723 fi
4fd11db9 724 echo "insmod /lib/modules/$kernel/$MODULE2 $options" >> "$s"
fd2dc249
AF
725done
726
727# TODO: rewrite for bsp
728#if [ -n "$loopDev" ]; then
729# if [ ! -d /initrd ]; then
730# mkdir /initrd
731# fi
732#
733# cp -a "$loopDev" "$MNTIMAGE/dev"
734# cp -a "$rootdev" "$MNTIMAGE/dev"
735# echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE"
736# echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE"
737# echo "echo Setting up loopback device $rootdev" >> $RCFILE
738# echo "losetup $rootdev /loopfs$loopFile" >> "$RCFILE"
739#fi
bb529f94 740
7c38b114 741if is_yes "$USERAIDSTART" && is_yes "$raidfound" ; then
ef66f232 742 [ -n "$verbose" ] && echo "Adding raidstart to initrd"
fef73933 743 inst "$raidtab" "$MNTIMAGE/etc/raidtab"
ef66f232
MM
744 # don't use raidless version
745 inst /sbin/bsp "$RCFILE"
fef73933 746
ef66f232
MM
747 # needed to determine md-version
748 if [ "$rootdev" != /dev/md0 ] ; then
749 mknod $MNTIMAGE/dev/md0 b 9 0
750 fi
751
752 for f in $dev_list $rootdev ; do
753 # mkdir in case of devfs name
754 mkdir -p `my_dirname $f`
755 [ -n "$verbose" ] && echo "copying $f"
756 # this works fine with and without devfs
757 cp -HR $f $MNTIMAGE/$f
758 done
fef73933 759
ef66f232 760 echo "raidstart $rootdev" >> "$s"
2968c9dd
AF
761fi
762
7c38b114
AF
763if is_yes "$uselvm" ; then
764 [ -n "$verbose" ] && echo "Adding LVM support to initrd"
765 inst /sbin/initrd-lvm $MNTIMAGE/bin/lvm
766 mkdir $MNTIMAGE/tmp
767 mkdir $MNTIMAGE/proc
768 echo "mount none /proc proc" >> "$s"
769 echo "mount none /tmp tmpfs" >> "$s"
770 echo "mount none /dev devfs" >> "$s"
771 echo "lvm vgscan -T" >> "$s"
78ba9381 772 echo "lvm vgchange -T -a y" >> "$s"
7c38b114
AF
773 echo "umount /tmp" >> "$s"
774 echo "umount /proc" >> "$s"
775 echo "umount /devfs" >> "$s"
776fi
777
35164381 778chmod +x "$RCFILE"
bb529f94 779
35164381 780(cd "$MNTIMAGE"; tar cf - .) | (cd "$MNTPOINT"; tar xf -)
bb529f94 781
2ad94d8a 782case "$INITRDFS" in
8b1e4ac7 783 ext2)
35164381 784 umount "$IMAGE"
8b1e4ac7
AF
785 ;;
786 rom)
787 genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel"
788 ;;
789 cram)
790 mkcramfs "$MNTPOINT" "$IMAGE"
8b1e4ac7
AF
791 ;;
792 *)
2ad94d8a 793 echo "Filesystem $INITRDFS not supported by $0";
c31050f3 794esac
bb529f94
JK
795
796if is_yes "$COMPRESS" ; then
7d2fc5eb 797 gzip -9 < "$IMAGE" > "$target"
bb529f94 798else
7d2fc5eb 799 cp -a "$IMAGE" "$target"
bb529f94 800fi
35164381 801rm -rf "$MNTIMAGE" "$MNTPOINT" "$IMAGE"
This page took 0.204022 seconds and 4 git commands to generate.