]> git.pld-linux.org Git - projects/geninitrd.git/blame - geninitrd
Updated.
[projects/geninitrd.git] / geninitrd
CommitLineData
bb529f94
JK
1#!/bin/sh
2
3# geninitrd
4#
4e9eb79c 5# by Jacek Konieczny <jajcus@pld-linux.org>
bb529f94 6#
413878f8 7# based on mkinitrd from RedHat
c31050f3 8
28eec2b1 9RCSID='$Id$'
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"
d3fa6ec7 21USEMDADMSTATIC="no"
b2e62ae1 22USEINSMODSTATIC="no"
4ef98747 23USE_SUSPEND="yes"
335cd101 24USE_SUSPEND2="yes"
7c38b114 25uselvm="no"
6fe19d5b 26usenfs="no"
10c3df06
MM
27# it should be safe to remove scsi_mod from here, but I'm not sure...
28PRESCSIMODS="-scsi_mod unknown -sd_mod"
64497ebb
AM
29PREIDEMODS="-ide-core unknown -ide-detect -ide-disk"
30PREIDEMODSOLD="-ide-probe -ide-probe-mod -ide-disk"
bb529f94
JK
31target=""
32kernel=""
33force=""
34verbose=""
35MODULES=""
36img_vers=""
f121024f 37modulefile=""
bb529f94 38fstab="/etc/fstab"
0868f49f
AF
39insmod="insmod"
40modext=".o"
4e9eb79c 41rootdev_nr=0
5b71959c
AM
42# default bootsplash is off, if it have to be on, install bootsplash package
43BOOT_SPLASH=no
bb529f94 44
326d9c3a 45if [ -f /etc/udev/udev.conf -a -x /sbin/initrd-udev ]; then
1606e343
AM
46 USE_UDEV="yes"
47 UDEV_TMPFS="yes"
48 . /etc/udev/udev.conf
49fi
882472ae
ER
50
51if [ -x /sbin/dmraid-initrd ]; then
52 USE_DMRAID="yes"
53fi
ac085800 54
bb529f94 55usage () {
ac085800
ER
56 echo "usage: `basename $0` [--version] [-v] [-f] [--ifneeded] [--preload <module>]"
57 echo " [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]"
58 echo " [--initrdfs=rom|ext2|cram] [--modules-conf=<modules.conf>]"
59 echo " [--with-raidstart] [--without-raidstart] [--with-insmod-static]"
1606e343 60 echo " [--without-bootsplash] [--lvmtoolsversion=1|2] [--without-udev]"
4ef98747 61 echo " [--without-suspend] [--without-suspend2] [--without-dmraid]"
ac085800
ER
62 echo " <initrd-image> <kernel-version>"
63 echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)"
7d2fc5eb 64 exit 1
bb529f94
JK
65}
66
aa69da6e 67
10c3df06
MM
68my_dirname() {
69 echo $1|awk -F/ '{print substr($0, 0, length($0) - length($NF));}'
70}
71
72find_depmod () {
73 typeset mods module f level depfile first
74
75 depfile=/lib/modules/$kernel/modules.dep
ac085800 76
b2e62ae1 77 if [ -f $depfile ] ; then
f6de9380
MM
78 : ok
79 else
c83257bc
AF
80 echo "Error: no $depfile ! Run depmod and rerun geninitrd." 1>&2
81 exit 1
f6de9380 82 fi
ac085800 83
0868f49f 84 # prepend / if no path given, append $modext.gz if not given,
10c3df06 85 # quote /
3b00e899 86 origmodule="$2"
10c3df06 87 module=$(echo "$2" | \
ac085800
ER
88 awk '/\// {print;next} {print "/" $0}' | \
89 awk '/\./ {print;next} {print $0 "'$modext'.gz"}' |
90 awk '{gsub("/","\\/");print}')
10c3df06
MM
91 mods=$(awk '
92BEGIN { here = 0 }
93/'"$module"':(.*)/ { gsub(/:/," "); gsub(/\\/," "); print; here = 1; next }
94/:/ { here = 0 }
95/(.*)/ { gsub(/\\/," "); if (here) print }
4fd11db9
AF
96' $depfile | xargs)
97
0868f49f 98 # fallback to $modext
4fd11db9 99 if [ "$mods" = "" ] ; then
ac085800
ER
100 module=$(echo "$module" | \
101 awk '{gsub("\'$modext'\.gz$","\'$modext'",$0);print}')
102 fi
4fd11db9
AF
103 mods=$(awk '
104BEGIN { here = 0 }
105/'"$module"':(.*)/ { gsub(/:/," "); gsub(/\\/," "); print; here = 1; next }
106/:/ { here = 0 }
107/(.*)/ { gsub(/\\/," "); if (here) print }
10c3df06
MM
108' $depfile | xargs)
109
110 if [ "$mods" = "" ] ; then
111 if [ "$1" != silent ] ; then
3b00e899 112 echo "$origmodule: module not found in $depfile" 1>&2
10c3df06 113 fi
ac085800 114 if ! is_no "$EXIT_IF_MISSING" ; then
fd2dc249
AF
115 exit 1
116 else
3b00e899 117 echo "If $origmodule isn't compiled in kernel then this initrd may not start your system". 1>&2
fd2dc249 118 fi
10c3df06 119 fi
ac085800 120
10c3df06
MM
121 level=$3
122 if [ "$level" = "" ] ; then
123 level=0
124 fi
125 level=$(awk "BEGIN{print $level + 1}")
126 if [ $level -gt 20 ] ; then
3b00e899 127 echo "$origmodule: cycle in $depfile" 1>&2
10c3df06
MM
128 exit 1
129 fi
ac085800 130
10c3df06
MM
131 first=
132 for f in $mods ; do
133 if [ "$first" = "" ] ; then
134 first=$f
413878f8 135 else
10c3df06 136 find_depmod $1 $f $level
9c9f7cdb 137 fi
aa69da6e 138 done
ac085800 139
10c3df06 140 echo $first
aa69da6e 141}
142
10c3df06
MM
143addmodule() {
144 fmPath=$1
145 skiperrors=$2
146
147 if [ ! -f "/lib/modules/$kernel/$fmPath" ]; then
148 if [ -n "$skiperrors" ]; then
149 return
150 fi
151
152 echo "module $fmPath present in modules.dep, but not in filesystem (kernel = $kernel)" 1>&2
153 exit 1
154 fi
155
156 # only need to add each module once
157 # quote /
158 tmpFmPath=$(echo $fmPath | awk '{gsub(/\//,"\\/");print}')
159 if echo "$MODULES" | awk '/'"$tmpFmPath"'/ {exit 1}' ; then
160 MODULES="$MODULES $fmPath"
161 fi
81de8443
AF
162}
163
bb529f94 164findmodule() {
413878f8 165 skiperrors=""
166 modName=$1
10c3df06 167
413878f8 168 if [ "$(echo $modName | awk '{print(substr($0,1,1));}')" = "-" ]; then
169 skiperrors=1
170 modName="$(echo $modName | awk '{print(substr($0,2));}')"
171 fi
bb529f94 172
10c3df06 173 # what's that?
413878f8 174 if [ "$modName" = "pluto" ]; then
175 findmodule fc4
176 findmodule soc
177 fi
178 if [ "$modName" = "fcal" ]; then
179 findmodule fc4
180 findmodule socal
181 fi
bb529f94 182
10c3df06
MM
183 if [ -n "$skiperrors" ]; then
184 allModulesToFind=`find_depmod silent $modName`
185 else
186 allModulesToFind=`find_depmod normal $modName`
187 if [ $? != 0 ] ; then
188 exit 1
413878f8 189 fi
413878f8 190 fi
ac085800 191
10c3df06 192 for mod in $allModulesToFind ; do
ac085800 193 mod=$(echo $mod | awk '{sub(/^\/lib\/modules\/[^\/]*\//,"");print}')
10c3df06
MM
194 addmodule $mod "$skiperrors"
195 done
bb529f94
JK
196}
197
198inst() {
413878f8 199 if [ "$#" != "2" ];then
200 echo "usage: inst <file> <destination>"
201 return
c31050f3 202 fi
413878f8 203 [ -n "$verbose" ] && echo "$1 -> $2"
204 cp "$1" "$2"
bb529f94
JK
205}
206
a2c2980f
AF
207get_label_ext2 () {
208 /sbin/e2label $1 2> /dev/null
209}
210
211get_uuid_ext2 () {
c31050f3 212 /sbin/tune2fs -l $1 2> /dev/null | awk -F: '/UUID:/ {gsub(" ",""); print $2}'
a2c2980f
AF
213}
214
215get_label_xfs () {
3b9c8219 216 /usr/sbin/xfs_db -x -p xfs_admin -c label -r "$1"|awk -F= '{sub("^\"","", $2); sub("\"$", "", $2); print $2}'
c31050f3 217
a2c2980f
AF
218}
219
220get_uuid_xfs () {
3b9c8219 221 /usr/sbin/xfs_db -x -p xfs_admin -c uuid -r "$1"|awk -F= '{print $2}'
a2c2980f
AF
222}
223
c31050f3 224find_root() {
a2c2980f
AF
225 eval `awk '/^[\t ]*#/ {next} {if ( $2 == "/" ) {print "rootdev=\"" $1 "\"\nrootFs=\"" $3 "\""}}' $fstab`
226 case $rootdev in
227 LABEL=*)
4fd11db9
AF
228 if [ -x /sbin/findfs -a \( "$rootFs." = "ext2." -o "$rootFs." = "ext3." \) ] ; then
229 rootdev2="`/sbin/findfs $rootdev 2>/dev/null`"
230 if [ -n "$rootdev2" ] ; then
231 rootdev=$rootdev2
232 rootdev_found=1
a2c2980f 233 fi
4fd11db9
AF
234 fi
235 if [ "$rootdev_found." != "1." ] ; then
236 case $rootFs in
237 ext2|ext3)
238 if [ ! -x /sbin/e2label ] ; then
239 echo "/sbin/e2label is missing" 1>&2
240 exit 1
241 fi
242 get_label="get_label_ext2"
243 ;;
244 xfs)
245 if [ ! -x /usr/sbin/xfs_db ] ; then
246 echo "/usr/sbin/xfs_db is missing" 1>&2
247 exit 1
248 fi
249 get_label="get_label_xfs"
250 ;;
251 *)
252 echo "LABEL on $rootFs in not supported by geninitrd" 1>&2
253 exit 1
254 ;;
255 esac
256 if [ ! -r /proc/partitions ] ; then
257 echo '/proc/partitions is not readable'; 1>&2
3b9c8219
AF
258 exit 1
259 fi
4fd11db9
AF
260 label=${rootdev#"LABEL="}
261 for dev in `awk 'BEGIN {getline;getline} {print "/dev/" $4}' /proc/partitions` ; do
262 if [ -r $dev ] && [ "$label" = "`$get_label $dev`" ] ; then
263 if [ -n "$verbose" ] ; then
264 echo "Using $dev as device for rootfs"
265 fi
266 rootdev=$dev
267 rootdev_found=1
268 break
a2c2980f 269 fi
4fd11db9
AF
270 done
271 if [ "$rootdev_found." != "1." ] ; then
272 echo "geninitrd can't find real device for LABEL=$label" 1>&2
273 exit 1
274 fi
a2c2980f
AF
275 fi
276 ;;
277 UUID=*)
4fd11db9
AF
278 if [ -x /sbin/findfs -a \( "$rootFs." = "ext2." -o "$rootFs." = "ext3." \) ] ; then
279 rootdev2="`/sbin/findfs $rootdev 2>/dev/null`"
280 if [ -n "$rootdev2" ] ; then
281 rootdev=$rootdev2
282 rootdev_found=1
a2c2980f 283 fi
4fd11db9
AF
284 fi
285 if [ "$rootdev_found." != "1." ] ; then
286 case $rootFs in
287 ext2|ext3)
288 if [ ! -x /sbin/tune2fs ] ; then
289 echo "/sbin/tune2fs is missing" 1>&2
290 exit 1
291 fi
292 get_uuid="get_uuid_ext2"
293 ;;
294 xfs)
295 if [ ! -x /usr/sbin/xfs_db ] ; then
296 echo "/usr/sbin/xfs_db is missing" 1>&2
297 exit 1
298 fi
299 get_label="get_uuid_xfs"
300 ;;
301 *)
302 echo "UUID on $rootFs in not supported by geninitrd" 1>&2
303 exit 1
304 ;;
305 esac
306 if [ ! -r /proc/partitions ] ; then
307 echo '/proc/partitions is not readable'; 1>&2
3b9c8219
AF
308 exit 1
309 fi
4fd11db9
AF
310 uuid=${rootdev#"UUID="}
311 for dev in `awk 'BEGIN {getline;getline} {print "/dev/" $4}' /proc/partitions` ; do
312 if [ -r $dev ] && [ "$uuid" = "`$get_uuid $dev`" ] ; then
313 if [ -n "$verbose" ] ; then
314 echo "Using $dev as device for rootfs"
315 fi
316 rootdev=$dev
317 rootdev_found=1
318 break
a2c2980f 319 fi
4fd11db9
AF
320 done
321 if [ "$rootdev_found" != 1 ] ; then
322 echo "geninitrd can't find real device for UUID=$uuid" 1>&2
323 exit 1
324 fi
a2c2980f
AF
325 fi
326 ;;
327 esac
4e9eb79c 328 rootdev1=${rootdev}
a2c2980f 329}
bb529f94 330
7c38b114 331find_modules_softraid() {
ac085800
ER
332 if [ -f /etc/mdadm.conf ]; then
333 [ -n "$verbose" ] && echo "Finding RAID details using mdadm for rootdev=$1"
334 eval `/sbin/mdadm -v --examine --scan --config=/etc/mdadm.conf | awk -v rootdev="$1" '
335 BEGIN {
336 found = "no";
337 dev_list = "";
338 raidlevel = ""
339 rootdev_devfs = rootdev;
340 if (rootdev ~ /\/dev\/md\/[0-9]/) {
341 gsub(/\/dev\/md\//,"/dev/md",rootdev_devfs);
342 }
514a668a 343 }
ac085800
ER
344
345 /^ARRAY/ {
346 if (($2 == rootdev) || ($2 == rootdev_devfs)) {
347 raidlevel=$3;
348 gsub(/level=/,NUL,raidlevel);
349 if (raidlevel ~ /^raid([0-6]|10)/) {
350 gsub(/raid/,NUL,raidlevel);
351 };
352 found="yes";
353 getline x;
354 if (x ~ /devices=/) {
355 dev_list = x;
356 gsub(".*devices=", NUL, dev_list);
357 gsub(",", " ", dev_list);
358 }
359 }
56946560 360 }
ac085800
ER
361
362 END {
363 print "raidfound=" found;
364 print "raidlevel=" raidlevel;
365 print "dev_list=\"" dev_list "\"";
366 }'`
367 fi
7c38b114 368
59846acb
AM
369 if [ "$raidfound" != "yes" -a -f /etc/raidtab ]; then
370 echo "ERROR: raidtools are not longer supported. Please migrate to mdadm setup!" 1>&2
371 exit 1
809cc4cc 372 fi
ac085800 373
7c38b114
AF
374 if is_yes "$raidfound" ; then
375 case "$raidlevel" in
dc9a3d8d 376 [01456]|10)
7c38b114
AF
377 findmodule "raid$raidlevel"
378 ;;
379 linear)
380 findmodule "linear"
381 ;;
382 *)
59846acb 383 echo "raid level $number (in mdadm config) not recognized" 1>&2
7c38b114
AF
384 ;;
385 esac
88614cd1 386 else
ac085800 387 echo "ERROR: RAID devices not found for \"$1\", check your configuration!" 1>&2
88614cd1 388 exit 1
7c38b114 389 fi
4e9eb79c
AM
390
391 rootdev_nr=$(( $rootdev_nr + 1 ))
392 eval "rootdev${rootdev_nr}=\"$1\""
393 eval "dev_list${rootdev_nr}=\"${dev_list}\""
ac085800 394
7c38b114
AF
395 for device in $dev_list; do
396 find_modules_for $device
397 done
398}
399
400find_modules_scsi() {
401 for n in $PRESCSIMODS; do
402 if [ "X$n" = "Xunknown" ] ; then
7c38b114 403 if [ -f "$modulefile" ]; then
d4a15d5f 404 scsimodules="`awk '/scsi_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile`"
7c38b114
AF
405 for n in $scsimodules; do
406 # for now allow scsi modules to come from anywhere. There are some
407 # RAID controllers with drivers in block
408 findmodule "$n"
409 done
410 fi
411 else
412 findmodule "$n"
413 fi
414 done
415}
416
417find_modules_ide() {
ac085800
ER
418 typeset rootdev
419
420 rootdev="$(echo "$1" | awk ' { gsub(/\/dev\//,NUL); gsub(/[0-9].*/, NUL); print $0 } ')"
421 if [ "$pack_version_long" -lt "002004021" ]; then
422 [ -n "$verbose" ] && echo "Finding IDE modules for kernels <= 2.4.20"
423 for n in $PREIDEMODSOLD; do
424 findmodule "$n"
425 done
64497ebb 426 else
ac085800
ER
427 tryauto=1
428 for n in $PREIDEMODS; do
429 if [ "X$n" = "Xunknown" ] ; then
430 if [ -f "$modulefile" ]; then
431 [ -n "$verbose" ] && echo "Finding IDE modules using ide_hostadapter"
432 idemodules="`awk '/ide_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile`"
433 for na in $idemodules; do
434 tryauto=0;
435 findmodule "$na"
436 done
437 fi
64497ebb 438
ac085800
ER
439 if [ "$tryauto" -eq 1 ]; then
440 # If tryauto {{{
441 if [ -r /usr/share/pci-database/ide.pci -a -r /proc/bus/pci/devices ]; then
442 [ -n "$verbose" ] && echo "Finding IDE modules using PCI ID database"
443 # Finding IDE modules using PCI ID database {{{
444 if is_yes "${ide_only_root}"; then
445 if [ -f /sys/block/${rootdev}/device/../../vendor -a -f /sys/block/${rootdev}/device/../../device ]; then
446 vendorid="$(awk ' { gsub(/0x/,NUL); print $0 } ' /sys/block/${rootdev}/device/../../vendor)"
447 deviceid="$(awk ' { gsub(/0x/,NUL); print $0 } ' /sys/block/${rootdev}/device/../../device)"
448 searchpciid="${vendorid}${deviceid}"
449 elif [ -f /proc/ide/${rootdev}/../config ]; then
450 searchpciid="$(awk ' /pci bus/ { print $7$9 } ' /proc/ide/${rootdev}/../config)"
451 fi
452 fi
453
454 if [ -z "${searchpciid}" ]; then
455 searchpciid="$(awk ' { print $2 } ' /proc/bus/pci/devices)"
456 fi
457
458 idemodules=""
459
460 for nb in $searchpciid; do
461 eval `awk -v pciid="$nb" '{
462 gsub("\t"," ");
463 gsub(" +", " ");
464 gsub("^ ","");
465 if (/^[\t ]*#/)
466 next;
467 compmod = $1 ""; # make sure comparison type will be string
468 # cause pci IDs are hexadecimal numeric
469 if (compmod == pciid) {
470 module=$2;
471 # min_kernel=$3; # now in ide.pci $3,$4 = vendor and device name
472 # max_kernel=$4; #
473 exit 0;
474 }
475 }
476
477 END {
478 print "module=" module "\nmin_kernel=" min_kernel "\nmax_kernel=\"" max_kernel "\"\n";
479 }' /usr/share/pci-database/ide.pci`
480 [ -n "$module" ] && idemodules="$idemodules $module"
481 done
482 if is_yes "$(awk ' /ide=reverse/ { print "yes" } ' /proc/cmdline)"; then
483 new_idemodules=""
484 for nc in idemodules; do
485 new_idemodules="$nc $new_idemodules"
486 done
487 idemodules="${new_idemodules}"
488 fi
489
490 if [ -z "$idemodules" ]; then
491 echo "WARNING: rootfs on IDE device but no related modules found, loading ide-generic."
492 idemodules="ide-generic"
493 fi
494
495 # }}}
496 for nd in $idemodules; do
497 findmodule "-$nd"
498 done
499 # }}}
500 # else tryauto {{{
501 else
502 [ -r /usr/share/pci-database/ide.pci ] || echo "WARNING: /usr/share/pci-database/ide.pci missing."
503 [ -r /proc/bus/pci/devices ] || echo "WARNING: /proc/bus/pci/devices missing."
504 echo "Automatic IDE modules finding not available."
505 fi
506 # }}}
507 fi
508 else
509 findmodule "$n"
5de40f1f 510 fi
ac085800 511 done
64497ebb 512 fi
7c38b114
AF
513}
514
a7fce633
ER
515# return true if node is lvm node
516_check_lvm() {
517 local node="$1"
518 if [ ! -e "$node" ]; then
519 return 1
520 fi
521
522 # block-major-58 is lvm1
523 ls -lL "$node" 2> /dev/null | awk '{if (/^b/) { if ($5 == "58,") { exit 0; } else { exit 1; } } else { exit 1; }}'
524 rc=$?
525
526 if [ $rc = 0 ]; then
527 [ -n "$verbose" ] && echo "$node is LVM1 node"
528 # is lvm1
529 return 0
530 fi
531
532 /sbin/lvm lvdisplay "$node" > /dev/null 2>&1
533 rc=$?
534 if [ $rc -gt 127 ]; then
535 # lvdisplay terminated by signal! most likely it segfaulted.
536 echo >&2 "ERROR: Unexpected exit from 'lvdisplay $node': $rc - are your lvm tools broken?"
537 exit 1
538 fi
539
540 if [ $rc = 0 ]; then
541 [ -n "$verbose" ] && echo "$node is lvm2 node"
542 else
543 [ -n "$verbose" ] && echo "$node is not any lvm node"
544 fi
545 return $rc
546}
547
7c38b114 548find_modules_for() {
ac085800
ER
549 if [ -z "$1" ]; then
550 echo "ERROR: no argument passed to find_modules_for() - is your /etc/fstab correct?" >&2
4e9eb79c 551 exit
ac085800 552
5c4cec75
AM
553 elif is_yes "`echo "$1" | awk '/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:|\/dev\/nfs)/ { print "yes"; }'`"; then
554 if [ ! -x /usr/bin/pcidev -a -z "$NFS_ETH_MODULES" ] ; then
ac085800
ER
555 echo "ERROR: root on NFS but /usr/bin/pcidev not found." >&2
556 echo "Please install correct pci-database package and rerun $0." >&2
557 exit 1
6fe19d5b 558 fi
5c4cec75
AM
559 [ -z "$NFS_ETH_MODULES" ] && NFS_ETH_MODULES=$(/usr/bin/pcidev /m net | xargs)
560 for m in $NFS_ETH_MODULES; do
ac085800 561 findmodule "$m"
6fe19d5b
AM
562 done
563 findmodule "-ipv4"
ac085800 564 findmodule "nfs"
6fe19d5b 565 usenfs="yes"
d024196b 566 echo "Remember to use \`root=/dev/ram0 init=/linuxrc' when starting kernel" >&2
ac085800 567 echo "or you will have problems like init(xx) being child process of swapper(1)." >&2
4e9eb79c 568 elif is_yes "`echo "$1" | awk '/^\/dev\/md/ { print "yes"; }'`"; then
7c38b114
AF
569 find_modules_softraid "$1"
570 elif is_yes "$(echo "$1" | awk '/^\/dev\/(sd|scsi)/ { print "yes"; }')" ; then
571 find_modules_scsi
5d27006d 572 elif is_yes "`echo "$1" | awk '/^\/dev\/(hd|ide)/ { print "yes"; }'`" ; then
afa3d7a8 573 find_modules_ide "$1"
7c38b114
AF
574 elif is_yes "`echo "$1" | awk '/\/dev\/rd\// { print "yes"; }'`" ; then
575 findmodule "DAC960"
576 elif is_yes "`echo "$1" | awk '/\/dev\/ida\// { print "yes"; }'`" ; then
577 findmodule "cpqarray"
578 elif is_yes "`echo "$1" | awk '/\/dev\/cciss\// { print "yes"; }'`" ; then
579 findmodule "cciss"
580 elif is_yes "`echo "$1" | awk '/\/dev\/ataraid\// { print "yes"; }'`"; then
ac085800 581 find_modules_ide
7c38b114 582 findmodule "ataraid"
d4a15d5f 583 ataraidmodules="`awk '/ataraid_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile`"
7c38b114
AF
584 if -n "$ataraidmodules" ; then
585 # FIXME: think about modules compiled in kernel
586 echo "ERROR: ataraid_hostadapter alias not defined in $modulefile !"
587 echo "Please set it and run $0 again."
588 exit 1
589 fi
590 for n in $ataraidmodules; do
591 findmodule "$n"
592 done
593 # check to see if we need to set up a loopback filesystem
38228bb7 594 elif is_yes "`echo "$1" | awk -F/ '{print($3);}' | awk '/loop/ { print "yes"; }'`" ; then
7c38b114
AF
595 echo "Sorry, root on loop device isn't supported." 1>&2
596 exit 1
597 # TODO: rewrite for bsp and make nfs ready
598 if [ ! -x /sbin/losetup ]; then
599 echo "losetup is missing"
600 exit 1
601 fi
602 key="^# $(echo $1 | awk -F/ '{print($3);}' | tr '[a-z]' '[A-Z]'):"
603 if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`" ; then
604 echo "The root filesystem is on a $1, but there is no magic entry in $fstab" 1>&2
605 echo "for this device. Consult the geninitrd man page for more information" 1>&2
606 exit 1
607 fi
608
609 line="`awk '/'$key'/ { print $0; }' $fstab`"
610 loopDev="$(echo $line | awk '{print $3}')"
611 loopFs="$(echo $line | awk '{print $4}')"
612 loopFile="$(echo $line | awk '{print $5}')"
613
614 BASICMODULES="$BASICMODULES -loop"
615 findmodule "-$loopFs"
616 BASICMODULES="$BASICMODULES -${loopFs}"
a7fce633 617 elif _check_lvm "$1"; then
9f2d32ed
AM
618 if [ ! -f /sbin/initrd-lvm -o ! -x /sbin/lvdisplay -o ! -x /sbin/pvdisplay ] ; then
619 echo "ERROR: root on LVM but /sbin/initrd-lvm, /sbin/lvdisplay and /sbin/pvdisplay not found." >&2
cff3058d 620 echo "Please install lvm(2) and lvm(2)-initrd package and rerun $0." >&2
7c38b114
AF
621 exit 1
622 fi
ac085800
ER
623 if [ -z "$LVMTOOLSVERSION" ] ; then
624 LVMTOOLSVERSION=$(/sbin/initrd-lvm vgchange --version 2>/dev/null|head -n 1|awk '{gsub("vgchange: Logical Volume Manager ",NIL); gsub("LVM version: ",NIL); gsub(/\..*/,NIL); print $1}')
625 if [ -z "$LVMTOOLSVERSION" ] ; then
626 echo "ERROR: Can't determine LVM tools version. Please set LVMTOOLSVERSION" >&2
627 echo "and rerun $0." >&2
628 exit 1
629 fi
77bcfc68 630 fi
decd277c 631 if [ -z "$PVDEVICES" ] ; then
ac085800
ER
632 VGVOLUME=$(/sbin/lvdisplay -c "$1" 2> /dev/null | awk -F":" ' { print $2 } ')
633 PVDEVICES=$(/sbin/pvdisplay -c | awk -F":" -v vg="$VGVOLUME" ' BEGIN { devices="" } { if ($2 == vg) { devices = devices " " $1 } } END { print devices } ')
decd277c 634 fi
7c38b114
AF
635 if [ -n "$PVDEVICES" ] ; then
636 for device in $PVDEVICES; do
637 find_modules_for $device
638 done
639 else
ac085800 640 echo "ERROR: I wasn't able to find PV (via lvdisplay and pvdisplay)." >&2
b78e6497 641 echo "You can try to set PVDEVICES in /etc/sysconfig/geninitrd." >&2
7c38b114
AF
642 exit 1
643 fi
e0c502bb 644 if [ "$LVMTOOLSVERSION" = "2" ]; then
ac085800 645 findmodule "-dm-mod"
e0c502bb 646 elif [ "$LVMTOOLSVERSION" = "1" ]; then
ac085800
ER
647 findmodule "-lvm"
648 findmodule "-lvm-mod"
93d781d1 649 else
e0c502bb 650 echo "ERROR: LVM version $LVMTOOLSVERSION is not supported yet." >&2
cff3058d 651 exit 1
93d781d1 652 fi
a7fce633 653 [ -n "$verbose" ] && echo "LVM $LVMTOOLSVERSION enabled"
7c38b114
AF
654 uselvm="yes"
655 fi
656}
657
2a5bcca9
AM
658modules_install() {
659 modules="$1"
660
661 for mod in $modules; do
ac085800
ER
662 MODULEDIR="`my_dirname "$mod"`"
663 mkdir -p "$MNTIMAGE/lib/modules/$kernel/$MODULEDIR"
664 cp $verbose -a "/lib/modules/$kernel/$mod" "$MNTIMAGE/lib/modules/$kernel/$mod"
665 gunzip "$MNTIMAGE/lib/modules/$kernel/$mod" 2> /dev/null
2a5bcca9
AM
666 done
667}
668
669modules_add_linuxrc() {
670 modules="$1"
671 linuxrc="$2"
ac085800 672
2a5bcca9 673 for mod in $modules; do
ac085800
ER
674 MODULE2="`my_dirname "$mod"`"
675 NAME2=`basename "$mod" .gz`
676 MODULE2=$MODULE2/$NAME2
677 module="`echo $mod | awk -F/ '{ $0=$NF } /'$modext'.*$/ { gsub(/'$modext'.*/, NIL, $0); } { print $0; }'`"
678 options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`"
ffa1b198 679
7bdf23ec 680 sleep_module=$(echo "${module}" | awk ' { gsub("-", "_", $0) } { print $0; } ')
ffa1b198 681 sleep_var="$(eval echo \$MODULE_${sleep_module}_USLEEP)"
2a5bcca9 682
ac085800
ER
683 if [ -n "$verbose" ]; then
684 echo -n "Loading module [$module] "
685 if [ -n "$options" ] ; then
686 echo -n "with options [$options]"
687 else
688 echo -n "without options"
689 fi
8e598759 690 if [ -n "$sleep_var" ]; then
ba0552ce 691 echo " and $sleep_var usleep."
8e598759
AM
692 else
693 echo "."
694 fi
ac085800
ER
695 fi
696
697 echo "$insmod /lib/modules/$kernel/$MODULE2 $options" >> "$linuxrc"
8e598759
AM
698 if [ -n "${sleep_var}" ]; then
699 echo "usleep $sleep_var" >> "$linuxrc"
700 fi
2a5bcca9
AM
701 done
702}
703
5dc785c7 704if [ -r /etc/sysconfig/geninitrd ] ; then
705 . /etc/sysconfig/geninitrd
706fi
707
5b71959c
AM
708if [ -r /etc/sysconfig/bootsplash ] ; then
709 . /etc/sysconfig/bootsplash
710fi
711
ac085800 712if [ ! -x /bin/initrd-busybox ] ; then
2baa76b4 713 echo "/bin/initrd-busybox is missing !"
fd2dc249 714 exit 1
5dc785c7 715fi
901afd79 716case "$(uname -m)" in
ac085800
ER
717ia64|amd64|x86_64|sparc64)
718 IMAGESIZE=3000
901afd79 719 ;;
ac085800
ER
720*)
721 IMAGESIZE=1500
901afd79
AM
722 ;;
723esac
724
bb529f94 725while [ $# -gt 0 ]; do
413878f8 726 case $1 in
6bd433bc
AF
727 --fstab=*)
728 fstab="`echo $1 | awk -F= '{print $2;}'`"
729 ;;
730 --fstab)
731 fstab="$2"
732 shift
413878f8 733 ;;
cd670d83
AF
734 --modules-conf=*)
735 modulefile="`echo $1 | awk -F= '{print $2;}'`"
736 ;;
57188d60 737 --modules-conf)
cd670d83
AF
738 modulefile="$2"
739 shift
740 ;;
6bd433bc
AF
741 --use-raidstart|--with-raidstart)
742 USERAIDSTART="yes"
743 ;;
744 --without-raidstart)
745 USERAIDSTART="no"
746 ;;
57227e0a
AF
747 --use-insmod-static|--with-insmod-static)
748 USEINSMODSTATIC="yes"
749 ;;
750 --without-insmod-static)
751 USEINSMODSTATIC="no"
752 ;;
5b71959c
AM
753 --without-bootsplash)
754 BOOT_SPLASH="no"
755 ;;
4ef98747
AM
756 --without-suspend)
757 USE_SUSPEND="no";
22b0c9f4 758 ;;
335cd101
JR
759 --without-suspend2)
760 USE_SUSPEND2="no";
2c52f208 761 ;;
e0c502bb
AM
762 --lvmtoolsversion=|--lvmversion=)
763 LVMTOOLSVERSION="`echo $1 | awk -F= '{print $2;}'`"
77bcfc68 764 ;;
e0c502bb
AM
765 --lvmtoolsversion|--lvmversion)
766 LVMTOOLSVERSION="$2"
77bcfc68
AF
767 shift
768 ;;
1606e343
AM
769 --without-udev)
770 USE_UDEV=
771 ;;
882472ae
ER
772 --without-dmraid)
773 USE_DMRAID=
774 ;;
6bd433bc
AF
775 --with=*)
776 BASICMODULES="$BASICMODULES `echo $1 | awk -F= '{print $2;}'`"
777 ;;
778 --with)
779 BASICMODULES="$BASICMODULES $2"
780 shift
413878f8 781 ;;
bb529f94 782 --version)
413878f8 783 echo "geninitrd: version $VERSION"
784 exit 0
785 ;;
bb529f94 786 -v)
413878f8 787 verbose=-v
788 ;;
bb529f94 789 --nocompress)
413878f8 790 COMPRESS="no"
791 ;;
bb529f94 792 --ifneeded)
413878f8 793 ifneeded=1
794 ;;
bb529f94 795 -f)
413878f8 796 force=1
797 ;;
6bd433bc
AF
798 --preload=*)
799 PREMODS="$PREMODS `echo $1 | awk -F= '{print $2;}'`"
800 ;;
801 --preload)
72623c13 802 PREMODS="$PREMODS $2"
6bd433bc 803 shift
413878f8 804 ;;
2ad94d8a
AF
805 --fs=*)
806 echo "Warning: --fs option is obsoleted. Use --initrdfs instead" 1>&2
807 INITRDFS="`echo $1 | awk -F= '{print $2;}'`"
808 ;;
2ad94d8a
AF
809 --fs)
810 echo "Warning: --fs option is obsoleted. Use --initrdfs instead" 1>&2
811 INITRDFS="$2"
812 shift
cd670d83 813 ;;
6bd433bc
AF
814 --initrdfs=*)
815 INITRDFS="`echo $1 | awk -F= '{print $2;}'`"
816 ;;
fd2dc249 817 --initrdfs)
2ad94d8a 818 INITRDFS="$2"
413878f8 819 shift
820 ;;
bb529f94 821 --image-version)
413878f8 822 img_vers=yes
823 ;;
4f4e832d
AM
824 --ide-only-root)
825 ide_only_root="yes"
826 ;;
bb529f94 827 *)
413878f8 828 if [ -z "$target" ]; then
829 target="$1"
830 elif [ -z "$kernel" ]; then
831 kernel="$1"
832 else
833 usage
834 fi
835 ;;
836 esac
837
838 shift
bb529f94
JK
839done
840
06ac05d6 841if [ -z "$target" -o -z "$kernel" ]; then
413878f8 842 usage
06ac05d6
AF
843fi
844
0868f49f 845pack_version="`echo "$kernel"|awk -F. '{print sprintf("%03d%03d",$1,$2)}'`"
64497ebb 846pack_version_long="`echo "$kernel"|awk -F. '{print sprintf("%03d%03d%03d",$1,$2,$3)}'`"
0868f49f 847
48413b7f
AM
848if [ "x" = "x$INITRDFS" ] ; then
849 if [ "x" = "x$FS" ] ; then
850 # default value
f8f9e56d
AM
851 # XXX: initramfs blocked for now
852 if [ "1" = " 0" -a "$pack_version" -ge "002005" ] ; then
ac085800 853 INITRDFS="initramfs"
f8f9e56d 854 else
ac085800 855 INITRDFS="rom"
f8f9e56d 856 fi
48413b7f
AM
857 else
858 echo "Warning: FS configuration options is obsoleted. Use INITRDFS instead" 1>&2
859 INITRDFS="$FS"
860 fi
861fi
862
1606e343 863if [ "$pack_version" -lt "002006" ] ; then
882472ae
ER
864 USE_UDEV=
865 USE_DMRAID=
1606e343
AM
866fi
867[ -z "$USE_UDEV" ] && UDEV_TMPFS=
ac085800 868
0868f49f
AF
869if [ "$pack_version" -ge "002005" ] ; then
870 modext=".ko"
0b6536f5 871 insmod="insmod"
0868f49f
AF
872fi
873
57227e0a
AF
874if is_yes "$USEINSMODSTATIC" ; then
875 insmod="insmod.static"
b2e62ae1 876 INSMOD="/sbin/insmod.static"
f7c18703
AM
877 if [ "$pack_version" -lt "002005" -a -f /sbin/insmod.static.modutils ] ; then
878 INSMOD="/sbin/insmod.static.modutils"
b2e62ae1
AF
879 fi
880 if [ ! -f "$INSMOD" ] ; then
881 echo "insmod.static requested but /sbin/insmod.static not found !" >&2
882 exit 1
883 fi
57227e0a
AF
884fi
885
2ad94d8a 886case "$INITRDFS" in
8b1e4ac7 887 ext2)
722b45a4 888 IMAGESIZE=$((IMAGESIZE + 100))
f5d71bb2 889 if [ ! -x /sbin/mke2fs ]; then
a2c2980f 890 echo "/sbin/mke2fs is missing" 1>&2
8b1e4ac7
AF
891 exit 1
892 fi
893 ;;
894 rom)
895 if [ ! -x /sbin/genromfs ]; then
a2c2980f 896 echo "/sbin/genromfs is missing" 1>&2
8b1e4ac7
AF
897 exit 1
898 fi
899 ;;
900 cram)
901 if [ ! -x /sbin/mkcramfs ]; then
a2c2980f 902 echo "/sbin/mkcramfs is missing" 1>&2
8b1e4ac7
AF
903 exit 1
904 fi
c31050f3 905 ;;
48413b7f
AM
906 initramfs)
907 if [ ! -x /bin/cpio ]; then
ac085800 908 echo "/bin/cpio is missing" 1>&2
48413b7f
AM
909 exit 1
910 fi
911 if [ ! -x /usr/bin/find ]; then
ac085800 912 echo "/usr/bin/find is missing" 1>&2
48413b7f
AM
913 exit 1
914 fi
915 ;;
8b1e4ac7 916 *)
2ad94d8a 917 echo "Filesystem $INITRDFS on initrd is not supported" 1>&2
8b1e4ac7
AF
918 exit 1
919 ;;
920esac
bb529f94 921
bb529f94 922if [ -n "$img_vers" ]; then
413878f8 923 target="$target-$kernel"
bb529f94
JK
924fi
925
35164381 926if [ -z "$force" -a -f "$target" ]; then
a2c2980f 927 echo "$target already exists." 1>&2
413878f8 928 exit 1
bb529f94
JK
929fi
930
35164381 931if [ ! -d "/lib/modules/$kernel" ]; then
a2c2980f 932 echo "/lib/modules/$kernel is not a directory." 1>&2
413878f8 933 exit 1
bb529f94
JK
934fi
935
2ce7656a
AM
936if is_yes "$USE_SUSPEND"; then
937 if is_yes "$USE_SUSPEND2"; then
22b0c9f4
AM
938 echo "Suspend2 shouldn't be used in parallel with mainline suspend!." 1>&2
939 exit 1
940 fi
941fi
942
48762878 943if [ ! -f /proc/mounts ]; then
ac085800 944 echo "WARNING: /proc filesystem not mounted, may cause wrong results or failure." 1>&2
48762878 945fi
f121024f
AM
946
947if [ "$pack_version" -lt "002005" ]; then
948 modulefile=/etc/modules.conf
949 if [ ! -f "$modulefile" -a -f /etc/conf.modules ]; then
950 modulefile=/etc/conf.modules
951 fi
952else
953 modulefile=/etc/modprobe.conf
954fi
ac085800 955
bb529f94 956for n in $PREMODS; do
35164381 957 findmodule "$n"
bb529f94
JK
958done
959
7c38b114
AF
960# allow forcing loading SCSI and/or IDE modules
961if is_yes "$ADDSCSI" ; then
962 find_modules_scsi
bb529f94
JK
963fi
964
7c38b114
AF
965if is_yes "$ADDIDE" ; then
966 find_modules_ide
cd670d83
AF
967fi
968
7c38b114 969find_root
cd670d83 970
4e1e40bd
AM
971org_rootdev="$rootdev1"
972
4e9eb79c 973find_modules_for "$rootdev1"
cd670d83 974
7c38b114 975findmodule "-$rootFs"
bb529f94 976
c31050f3 977for n in $BASICMODULES; do
7d2fc5eb 978 findmodule "$n"
bb529f94
JK
979done
980
335cd101
JR
981if is_yes "$USE_SUSPEND2"; then
982 findmodule "-lzf"
983fi
984
bb529f94 985if [ -n "$ifneeded" -a -z "$MODULES" ]; then
7d2fc5eb 986 if [ -n "$verbose" ]; then
987 echo "No modules are needed -- not building initrd image."
988 fi
989 exit 0
bb529f94
JK
990fi
991
992if [ -n "$verbose" ]; then
7d2fc5eb 993 echo "Using modules: $MODULES"
bb529f94
JK
994fi
995
35164381
SZ
996MNTIMAGE="`mktemp -d /tmp/initrd.XXXXXX`"
997IMAGE="`mktemp -u /tmp/initrd.img-XXXXXX`"
998MNTPOINT="`mktemp -d /tmp/initrd.mnt-XXXXXX`"
999RCFILE="$MNTIMAGE/linuxrc"
bb529f94 1000
35164381 1001if [ -f "$MNTIMAGE" ]; then
c31050f3 1002 echo "$MNTIMAGE already exists. Remove it and try again" 1>&2
7d2fc5eb 1003 exit 1
bb529f94
JK
1004fi
1005
35164381 1006if [ -f "$IMAGE" ]; then
a2c2980f 1007 echo "$IMAGE already exists. Remove it and try again" 1>&2
7d2fc5eb 1008 exit 1
bb529f94
JK
1009fi
1010
2ad94d8a 1011if [ "$INITRDFS" = "ext2" ] ; then
35164381 1012 dd if=/dev/zero of="$IMAGE" bs=1k count="$IMAGESIZE" 2> /dev/null
bb529f94 1013
bb529f94
JK
1014 # We have to "echo y |" so that it doesn't complain about $IMAGE not
1015 # being a block device
35164381 1016 echo y | mke2fs -F "$IMAGE" "$IMAGESIZE" >/dev/null 2>/dev/null
bb529f94 1017
35164381
SZ
1018 mkdir -p "$MNTPOINT"
1019 mount -o loop -t ext2 "$IMAGE" "$MNTPOINT"
bb529f94 1020else
35164381 1021 mkdir -p "$MNTPOINT"
bb529f94
JK
1022fi
1023
8b1e4ac7 1024
cff3058d 1025mkdir -p "$MNTIMAGE"/{lib,bin,etc,dev,loopfs,var}
8b1e4ac7 1026
bb529f94
JK
1027
1028# We don't need this directory, so let's save space
35164381 1029rm -rf "$MNTPOINT"/lost+found
bb529f94 1030
2a5bcca9 1031modules_install "$MODULES"
bb529f94
JK
1032
1033# mknod'ing the devices instead of copying them works both with and
1034# without devfs...
35164381 1035mknod "$MNTIMAGE/dev/console" c 5 1
eb6e37ff
MM
1036mknod "$MNTIMAGE/dev/null" c 1 3
1037mknod "$MNTIMAGE/dev/zero" c 1 5
bb529f94 1038
84670990 1039s="$RCFILE"
566ad08b 1040ln -s /linuxrc $MNTIMAGE/init
ef66f232 1041
7543158a 1042inst /bin/initrd-busybox "$MNTIMAGE/bin/sh"
ee3a3416 1043ln -s sh "$MNTIMAGE/bin/busybox"
ef66f232 1044
b2e62ae1
AF
1045if is_yes "$USEINSMODSTATIC" ; then
1046 inst "$INSMOD" $MNTIMAGE/bin/insmod.static
57227e0a
AF
1047fi
1048
84670990
MM
1049cat > "$s" <<EOF
1050#! /bin/sh
1051
d70364fa 1052set -x
84670990
MM
1053EOF
1054chmod 755 "$s"
c31050f3 1055
2a5bcca9 1056modules_add_linuxrc "$MODULES" "$s"
fd2dc249 1057
4e9eb79c 1058# TODO: rewrite for busybox
fd2dc249
AF
1059#if [ -n "$loopDev" ]; then
1060# if [ ! -d /initrd ]; then
1061# mkdir /initrd
1062# fi
1063#
1064# cp -a "$loopDev" "$MNTIMAGE/dev"
4e9eb79c 1065# cp -a "$rootdev1" "$MNTIMAGE/dev"
fd2dc249
AF
1066# echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE"
1067# echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE"
4e9eb79c
AM
1068# echo "echo Setting up loopback device $rootdev1" >> $RCFILE
1069# echo "losetup $rootdev1 /loopfs$loopFile" >> "$RCFILE"
fd2dc249 1070#fi
bb529f94 1071
22b0c9f4
AM
1072initrd_gen_suspend() {
1073 if [ ! -x /usr/sbin/resume ]; then
1074 echo "/usr/sbin/resume is missing !"
1075 exit 1
1076 fi
1077 mkdir -p $MNTIMAGE/etc
1078 mkdir -p $MNTIMAGE/dev
1079 resume_dev="$(awk '/^resume device =/ { print $4 } ' /etc/suspend.conf)"
1080 cp -HR /dev/snapshot $resume_dev $MNTIMAGE/dev
1081 inst /etc/suspend.conf $MNTIMAGE/etc/suspend.conf
1082 inst /usr/sbin/resume "$MNTIMAGE/bin/resume"
1083 echo "resume" >> "$s"
1084}
1085
9426259f 1086initrd_gen_suspend2() {
ac085800
ER
1087 mkdir -p $MNTIMAGE/sys
1088 mkdir -p $MNTIMAGE/proc
5a61a17c 1089cat << 'EOF' >> "$s"
2b1a3707 1090mount -t proc none /proc
5a61a17c 1091if [ "$(awk ' /resume2=/ { print "yes"; } ' /proc/cmdline)" = "yes" ]; then
2b1a3707 1092EOF
2b1a3707 1093cat << EOF >> "$s"
21c802bf 1094 echo > /proc/suspend2/do_resume
2b1a3707
AM
1095fi
1096umount /proc
1097EOF
2df2e995 1098}
2c52f208 1099
1606e343 1100initrd_gen_udev() {
ac085800 1101 [ -n "$verbose" ] && echo "Setting up udev..."
1606e343 1102 mkdir -p $MNTIMAGE/sbin
d152a29d 1103 mkdir -p $MNTIMAGE/proc
1606e343 1104 mkdir -p $MNTIMAGE/etc/udev
ac085800 1105
1606e343
AM
1106 inst /sbin/initrd-udev $MNTIMAGE/sbin/udev
1107 ln -s udev $MNTIMAGE/sbin/udevstart
1108 inst /etc/udev/udev.conf $MNTIMAGE/etc/udev/udev.conf
1109
1110 ln -s udev $MNTIMAGE/sbin/hotplug
1111
1112 if is_yes "$USE_UDEV"; then
1113 if is_yes "$UDEV_TMPFS"; then
ac085800 1114 cat >> "$s" <<-EOF
1606e343
AM
1115echo Creating /dev
1116mount -o mode=0755 -t tmpfs none /dev
1117mknod /dev/console c 5 1
1118mknod /dev/null c 1 3
1119mknod /dev/zero c 1 5
1120mkdir /dev/pts
1121mkdir /dev/shm
1122EOF
1123 fi
882472ae 1124 cat >> "$s" <<-EOF
b161812e 1125mount -t proc none /proc
1606e343
AM
1126echo Starting udev
1127/sbin/udevstart
1128echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug
b161812e 1129umount /proc
1606e343
AM
1130EOF
1131 fi
1132}
1133
882472ae 1134initrd_gen_dmraid() {
ac085800
ER
1135 if [ ! -x /sbin/dmraid-initrd ] ; then
1136 echo "/sbin/dmraid-initrd is missing missing !"
1137 exit 1
1138 fi
1139
1140 if [ ! -x $MNTIMAGE/sbin/udev ]; then
1141 echo "udev is needed on target initrd for dmraid to work!"
1142 exit 1
1143 fi
1144
1145 mkdir -p "$MNTIMAGE/sbin"
1146 inst /sbin/dmraid-initrd $MNTIMAGE/sbin/dmraid
882472ae
ER
1147cat <<-EOF >> "$s"
1148 mount -t proc none /proc
1149 mount -t sysfs none /sys
1150 # 2 secs was enough for my system to initialize. but really this is udev issue?
1151 usleep 2000000
1152 /sbin/dmraid -ay -i
1153 umount /sys
1154 umount /proc
1155EOF
1156}
1157
1158
2df2e995 1159initrd_gen_softraid() {
4e9eb79c 1160 [ -n "$verbose" ] && echo "Setting up mdadm..."
ac085800 1161
6cca3165 1162 if [ ! -x /sbin/mdadm -o ! -x /sbin/initrd-mdassemble ] ; then
ac085800 1163 echo "/sbin/mdadm or /sbin/initrd-mdassemble is missing !"
8c4ce35e 1164 exit 1
d3fa6ec7 1165 fi
994eb509 1166
6cca3165
AM
1167 inst /sbin/initrd-mdassemble "$MNTIMAGE/bin/mdassemble"
1168
4e9eb79c 1169 # LVM on RAID case
6cca3165
AM
1170 dev_list_extra=$(awk '/^DEVICE / { for (i=2; i<=NF; i++) { printf "%s ", $i; }; } ' /etc/mdadm.conf)
1171 for ex_dev in $dev_list_extra; do
1172 echo "DEVICE $ex_dev" >> "$MNTIMAGE/etc/mdadm.conf"
1173 done
ac085800 1174 do_md0=1
4e9eb79c 1175 for nr in `seq 1 $rootdev_nr`; do
ac085800
ER
1176 eval cr_rootdev="\$rootdev${nr}"
1177 eval cr_dev_list="\$dev_list${nr}"
1178 [ -n "$verbose" ] && echo "Setting up array ($cr_rootdev = $cr_dev_list)"
1179
1180 [ "$cr_rootdev" = "/dev/md0" ] && do_md0=0
1181
1182 echo "DEVICE $cr_dev_list" >> "$MNTIMAGE/etc/mdadm.conf"
1183 cr_dev_list_md="$(echo "$cr_dev_list" | xargs | awk ' { gsub(/ +/,",",$0); print $0; }')"
1184 cr_md_conf=$(/sbin/mdadm --detail --brief --config=/etc/mdadm.conf $cr_rootdev)
1185 if [ -n "$cr_md_conf" ]; then
1186 echo "$cr_md_conf" >> "$MNTIMAGE/etc/mdadm.conf"
1187 else
1188 echo "ARRAY $cr_rootdev devices=$cr_dev_list_md" >> "$MNTIMAGE/etc/mdadm.conf"
1189 fi
1190
1191 for f in $cr_dev_list $cr_rootdev $dev_list_extra; do
1192 # mkdir in case of devfs name
1193 mkdir -p $MNTIMAGE/`my_dirname $f`
1194 [ -e "$MNTIMAGE/$f" ] && continue
1195 [ -n "$verbose" ] && echo "copying $f"
1196 # this works fine with and without devfs
1197 cp -HR $f $MNTIMAGE/$f
1198 done
ef66f232 1199 done
4e9eb79c 1200
6cca3165 1201 echo "mdassemble" >> "$s"
33d24e12 1202
4e9eb79c
AM
1203 # needed to determine md-version
1204 if [ "$do_md0" -eq 1 ] ; then
1205 mknod $MNTIMAGE/dev/md0 b 9 0
1206 fi
2df2e995 1207}
2968c9dd 1208
2df2e995 1209initrd_gen_nfs() {
5a61a17c 1210 # use root=/dev/ram0 init=/linuxrc when starting kernel or you will
51447ab3 1211 # have problems like init(XX) being child process of swapper(1).
5a61a17c 1212 [ -n "$verbose" ] && echo "Adding rootfs on NFS support to initrd (dhcp)"
53623c90 1213 mknod "$MNTIMAGE/dev/urandom" c 1 8
5c4cec75 1214 mkdir "$MNTIMAGE/newroot"
7d400dbe 1215 mkdir "$MNTIMAGE/proc"
5c4cec75
AM
1216 echo "ifconfig lo 127.0.0.1 up" >> "$s"
1217 echo "route add -net 127.0.0.0 netmask 255.0.0.0 lo" >> "$s"
1218 echo "ifconfig eth0 0.0.0.0 up" >> "$s"
ac085800 1219 echo "udhcpc -i eth0 -f -q -s /bin/setdhcp" >> "$s"
5a61a17c 1220 cat << 'EOF' > "$MNTIMAGE/bin/setdhcp"
5c4cec75 1221#!/bin/sh
5a61a17c
ER
1222[ "$1" != "bound" ] && exit
1223[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
1224[ -n "$subnet" ] && NETMASK="netmask $subnet"
5c4cec75 1225set -x
5a61a17c 1226ifconfig $interface $ip $BROADCAST $NETMASK up
5c4cec75 1227set +x
5a61a17c 1228if [ -n "$router" ]; then
ac085800
ER
1229 for r in $router; do
1230 set -x
1231 route add default gw $r dev $interface
1232 set +x
1233 done
5c4cec75 1234fi
7d400dbe
ER
1235
1236mount -t proc none /proc
5a61a17c
ER
1237for o in $(cat /proc/cmdline); do
1238 case $o in
7d400dbe 1239 nfsroot=*)
5a61a17c 1240 rootpath=${o#nfsroot=}
7d400dbe
ER
1241 ;;
1242 esac
1243done
1244umount /proc
1245
5a61a17c 1246if [ -n "$rootpath" ]; then
ac085800
ER
1247 set -x
1248 mount -n -t nfs -o ro,nolock,posix,tcp,wsize=8192,rsize=8192 $rootpath /newroot
1249 set +x
5c4cec75 1250else
ac085800
ER
1251 set +x
1252 echo "Missing rootpath in what DHCP server sent to us. Failing..."
1253 echo "All seen variables are listed below:"
1254 set
1255 set -x
5c4cec75
AM
1256fi
1257EOF
1258 chmod 755 "$MNTIMAGE/bin/setdhcp"
1259 echo "cd /newroot" >> "$s"
c52ba2fe 1260 echo "pivot_root . initrd" >> "$s"
d4a8e40e 1261 echo "[ -x /sbin/chroot ] && exec /sbin/chroot . /sbin/init -i < dev/console > dev/console 2>&1" >> "$s"
c52ba2fe 1262 echo "exec /usr/sbin/chroot . /sbin/init -i < dev/console > dev/console 2>&1" >> "$s"
2df2e995 1263}
6fe19d5b 1264
2df2e995 1265initrd_gen_lvm() {
7c38b114
AF
1266 [ -n "$verbose" ] && echo "Adding LVM support to initrd"
1267 inst /sbin/initrd-lvm $MNTIMAGE/bin/lvm
f34c76a3
AM
1268 mkdir -p $MNTIMAGE/etc
1269 mkdir -p $MNTIMAGE/tmp
1270 mkdir -p $MNTIMAGE/proc
4e1e40bd 1271 mkdir -p $MNTIMAGE/newroot
afaefcb5
AM
1272 if ! is_yes "$USE_UDEV"; then
1273 mkdir -p $MNTIMAGE/dev/mapper
1274 mknod $MNTIMAGE/dev/mapper/control c 10 63
b007399c 1275 for device in $PVDEVICES; do
13b29c8f
ER
1276 # if LVM on RAID then device might be copied already in gen_softraid
1277 [ -e "$MNTIMAGE/dev/$(basename $device)" ] && continue
7bdf23ec 1278 cp -HR $device $MNTIMAGE/dev/
b007399c 1279 done
afaefcb5 1280 fi
84670990 1281 echo "mount -t proc none /proc" >> "$s"
b78e6497 1282 echo "mount -t tmpfs none /tmp" >> "$s"
e0c502bb 1283 if [ "$LVMTOOLSVERSION" = "1" ] ; then
cff3058d 1284 echo "lvm vgscan -T" >> "$s"
90b5b05a 1285 echo "lvm vgchange -T -a y $VGVOLUME" >> "$s"
4e1e40bd 1286 echo "umount /tmp" >> "$s"
ac085800
ER
1287 # fail to umount
1288 echo "umount /dev" >> "$s"
1289 echo "umount /proc" >> "$s"
cff3058d 1290 else
ac085800
ER
1291 echo "cat /etc/lvm.conf > /tmp/lvm.conf" >> "$s"
1292 echo "global {" > "$MNTIMAGE/etc/lvm.conf"
f34c76a3
AM
1293 echo " locking_type = 0" >> "$MNTIMAGE/etc/lvm.conf"
1294 echo " locking_dir = \"/tmp\"" >> "$MNTIMAGE/etc/lvm.conf"
1295 echo "}" >> "$MNTIMAGE/etc/lvm.conf"
ac085800 1296 echo "devices {" >> "$MNTIMAGE/etc/lvm.conf"
8fb0a4d2 1297 echo " sysfs_scan=0" >> "$MNTIMAGE/etc/lvm.conf"
f34c76a3 1298 if is_yes "$raidfound"; then
ac085800 1299 echo " md_component_detection = 1" >> "$MNTIMAGE/etc/lvm.conf"
f34c76a3
AM
1300 fi
1301 lvm dumpconfig | awk '/filter=/' >> "$MNTIMAGE/etc/lvm.conf"
1302 echo "}" >> "$MNTIMAGE/etc/lvm.conf"
4e1e40bd 1303 echo "LVM_SYSTEM_DIR=/tmp lvm vgscan --ignorelockingfailure" >> "$s"
90b5b05a 1304 echo "LVM_SYSTEM_DIR=/tmp lvm vgchange --ignorelockingfailure -a y $VGVOLUME" >> "$s"
d152a29d 1305 echo "LVM_SYSTEM_DIR=/tmp lvm vgscan --ignorelockingfailure --mknodes" >> "$s"
91ed0242
AM
1306 # Find out major/minor
1307 echo "majmin=\"\`LVM_SYSTEM_DIR=/tmp lvm lvdisplay --ignorelockingfailure -c $org_rootdev\`\"" >> "$s"
1308 echo "majmin=\"\${majmin#*/}\"" >> "$s"
1309 echo "majmin=\"\${majmin#*:*:*:*:*:*:*:*:*:*:*:*}\"" >> "$s"
1310 echo "major=\"\${majmin%:*}\"" >> "$s"
1311 echo "minor=\"\${majmin#*:}\"" >> "$s"
1312 # Pass it to kernel
1313 echo "val=\$((256 * \$major + \$minor))" >> "$s"
1314 echo "echo \$val > /proc/sys/kernel/real-root-dev" >> "$s"
4e1e40bd 1315 echo "umount /tmp" >> "$s"
4e1e40bd 1316 echo "umount /proc" >> "$s"
cff3058d 1317 fi
2df2e995
AM
1318}
1319
2b1a3707 1320initrd_gen_procdata() {
ac085800 1321 [ -n "$verbose" ] && echo "Adding rootfs finding based on root= option support."
2b1a3707 1322 mkdir -p $MNTIMAGE/proc
5a61a17c 1323cat << 'EOF' >> "$s"
2b1a3707
AM
1324set +x
1325mount -t proc none /proc
5a61a17c
ER
1326root="$(busybox awk ' /root=\/dev\// { gsub(/.*root=\/dev\//,NIL,$0); gsub(/ .*/,NIL,$0); print $0; } ' /proc/cmdline)"
1327if [ -n "$root" ]; then
ac085800
ER
1328 rootnr="$(busybox awk -v root="$root" ' { if ($4 == root) { print 256*$1+$2; } } ' /proc/partitions)"
1329 if [ -n "$rootnr" ]; then
1330 echo "$rootnr" > /proc/sys/kernel/real-root-dev
1331 fi
2b1a3707 1332fi
9d949203 1333umount /proc
2b1a3707
AM
1334set -x
1335EOF
1336}
1337
2df2e995 1338# main generation
1606e343
AM
1339
1340if is_yes "$USE_UDEV"; then
1341 initrd_gen_udev
1342fi
1343
2ce7656a 1344if is_yes "$USE_SUSPEND"; then
22b0c9f4
AM
1345 initrd_gen_suspend
1346fi
1347
2ce7656a 1348if is_yes "$USE_SUSPEND2"; then
9426259f 1349 initrd_gen_suspend2
2df2e995
AM
1350fi
1351
882472ae
ER
1352if is_yes "$USE_DMRAID"; then
1353 initrd_gen_dmraid
1354fi
1355
2df2e995
AM
1356if is_yes "$usenfs" ; then
1357 initrd_gen_nfs
1358elif is_yes "$USERAIDSTART" && is_yes "$raidfound" ; then
1359 initrd_gen_softraid
1360 if is_yes "$uselvm" ; then
1361 initrd_gen_lvm
bfea009a
AM
1362 else
1363 initrd_gen_procdata
2df2e995
AM
1364 fi
1365elif is_yes "$uselvm" ; then
1366 initrd_gen_lvm
2b1a3707
AM
1367else
1368 initrd_gen_procdata
7c38b114
AF
1369fi
1370
f8f9e56d
AM
1371if [ "$INITRDFS" = "initramfs" ]; then
1372 mkdir -p $MNTIMAGE/newroot
1373 cp -HR $org_rootdev $MNTIMAGE/dev
1374 echo "mount -t $rootFs $org_rootdev /newroot" >> "$s"
1375 echo "switch_root /newroot /sbin/init" >> "$s"
1376 # we need real file, not symlink
1377 rm -f $MNTIMAGE/init
1378 cp -a $MNTIMAGE/linuxrc $MNTIMAGE/init
1379fi
1380
35164381 1381chmod +x "$RCFILE"
bb529f94 1382
35164381 1383(cd "$MNTIMAGE"; tar cf - .) | (cd "$MNTPOINT"; tar xf -)
bb529f94 1384
2ad94d8a 1385case "$INITRDFS" in
8b1e4ac7 1386 ext2)
35164381 1387 umount "$IMAGE"
8b1e4ac7
AF
1388 ;;
1389 rom)
1390 genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel"
1391 ;;
1392 cram)
1393 mkcramfs "$MNTPOINT" "$IMAGE"
8b1e4ac7 1394 ;;
48413b7f 1395 initramfs)
566ad08b 1396 (cd $MNTPOINT ; find . | cpio -H newc -o > "$IMAGE")
48413b7f 1397 ;;
8b1e4ac7 1398 *)
2ad94d8a 1399 echo "Filesystem $INITRDFS not supported by $0";
c31050f3 1400esac
bb529f94
JK
1401
1402if is_yes "$COMPRESS" ; then
7d2fc5eb 1403 gzip -9 < "$IMAGE" > "$target"
bb529f94 1404else
7d2fc5eb 1405 cp -a "$IMAGE" "$target"
bb529f94 1406fi
5b71959c
AM
1407
1408if is_yes "$BOOT_SPLASH"; then
1409 if [ ! -x /bin/splash.bin ]; then
1410 echo "Failed to execute /bin/splash.bin. Is bootsplash package installed?" 1>&2
1411 elif [ -z "$THEME" ]; then
1412 echo "Please configure your /etc/sysconfig/bootsplash first." 1>&2
1413 echo "Generating bootsplashes skipped." 1>&2
1414 else
ac085800
ER
1415 if [ -n "$BOOT_SPLASH_RESOLUTIONS" ]; then
1416 for res in $BOOT_SPLASH_RESOLUTIONS; do
1417 if [ -f "/etc/bootsplash/themes/$THEME/config/bootsplash-$res.cfg" ]; then
1418 /bin/splash.bin -s -f "/etc/bootsplash/themes/$THEME/config/bootsplash-$res.cfg" >> "$target" && \
1419 [ -n "$verbose" ] && echo "Added $res $THEME theme to initrd."
1420 else
1421 echo "/etc/bootsplash/themes/$THEME/config/bootsplash-$res.cfg doesn't exist, skipped" 1>&2
1422 fi
1423 done
1424 else
1425 echo "No BOOT_SPLASH_RESOLUTIONS specified in /etc/sysconfig/bootsplash." 1>&2
1426 echo "Not adding bootsplash to initrd." 1>&2
1427 fi
5b71959c
AM
1428 fi
1429fi
1430
35164381 1431rm -rf "$MNTIMAGE" "$MNTPOINT" "$IMAGE"
ac085800
ER
1432
1433# vim:ts=4:sw=4:noet:fdm=marker
This page took 0.289223 seconds and 4 git commands to generate.