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