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