]> git.pld-linux.org Git - projects/geninitrd.git/blame - geninitrd
Don't require /sbin/mdadm. Use initrd mdadm when needed.
[projects/geninitrd.git] / geninitrd
CommitLineData
bb529f94
JK
1#!/bin/sh
2
3# geninitrd
4#
45d4d8cb 5# by PLD Linux Team
bb529f94 6#
9e1ceabe 7# based on mkinitrd from RedHat Linux
e4b07ddc 8#
c31050f3 9
897acff9 10RCSID='$Revision$ $Date$'
c5fea685 11R=${RCSID#* *}; VERSION=${R%% *}
ca2c2012 12PROGRAM=${0##*/}
bb529f94
JK
13
14. /etc/rc.d/init.d/functions
ded87775 15. /lib/geninitrd/functions
e2405b29 16. /etc/sysconfig/system
bb529f94 17
c124d0cf
ER
18# list of geninitrd modules which need setup routine after commandline args parsing
19GENINITRD_MODS=""
c3667d07 20COMPRESS=yes
bb529f94
JK
21target=""
22kernel=""
23force=""
24verbose=""
25MODULES=""
26img_vers=""
c3667d07 27fstab=/etc/fstab
c3667d07 28modext=.o
4e9eb79c 29rootdev_nr=0
738c05d8
ER
30# device node for rootfs from fstab
31rootdev=""
bb529f94 32
8bd582f1
ER
33# internal variables
34# is /dev on tmpfs
b64f015b
ER
35dev_mounted=no
36# is /proc mounted
37proc_mounted=no
38# is /sys mounted
39sys_mounted=no
40# is /tmp mounted on tmpfs
41tmp_mounted=no
42
43# are /dev nodes already created from /proc/devices info?
8bd582f1 44proc_partitions=no
6b013929 45
b64f015b 46usage() {
553786c4 47 uname_r=$(uname -r)
00eaa938 48 echo "usage: $PROGRAM [--version] [-v] [-f] [--ifneeded] [--preload <module>]"
ac085800 49 echo " [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]"
29f7d622 50 echo " [--compress=yes|xz|lzma|bzip2|gzip]"
92ed99b6 51 echo " [--initrdfs=rom|initramfs|ext2|cram] [--modules-conf=<modules.conf>]"
ba5d09f0 52 echo " [--with-bootsplash] [--without-bootsplash]"
6c69a2d4
ER
53 echo " [--with-fbsplash] [--without-fbsplash]"
54 echo " [--with-fbcondecor] [--without-fbcondecor]"
e4b07ddc 55 echo " [--lvmtoolsversion=1|2] [--with-udev] [--without-udev]"
ba5d09f0 56 echo " [--with-suspend] [--without-suspend]"
1cd2aabd 57 echo " [--with-tuxonice] [--without-tuxonice]"
ecd7bf46
ER
58 echo " [--without-dmraid]"
59 echo " [--with-multipath=DEVPATH] [--without-multipath]"
3ef3d717 60 echo " [--without-blkid] [--without-luks]"
ac085800 61 echo " <initrd-image> <kernel-version>"
553786c4
ER
62 echo ""
63 echo "example:"
00eaa938 64 echo " $PROGRAM -f --initrdfs=rom /boot/initrd-$uname_r.gz $uname_r"
36523626 65 exit 0
bb529f94
JK
66}
67
779a218a 68msg() {
f4010f7f
AM
69 echo "$PROGRAM: $*"
70}
71
72warn() {
4a60c01f 73 msg "WARNING: $*" >&2
779a218a
AM
74}
75
94769f11 76debug() {
4a60c01f 77 [ -n "$verbose" ] && msg "$*" >&2
94769f11 78}
aa69da6e 79
bf6c3fcb
ER
80# aborts program abnormally
81die() {
b5f5c089 82 local rc=${2:-1}
046c68c9 83 msg "ERROR: $1" >&2
bf6c3fcb
ER
84 exit $rc
85}
86
684d5d2a
ER
87# find program from specified paths
88find_tool() {
89 local x
90 for x in "$@"; do
91 if [ -x "$x" ]; then
92 echo $x
93 debug "find_tool: found $x"
94 return 0
95 fi
96 done
97 debug "find_tool: did not found any of: $@"
98 return 1
99}
100
c124d0cf
ER
101# loads geninitrd modules
102geninitrd_load_mods() {
103 local mod
104 for mod in "$@"; do
105 if [ ! -f /lib/geninitrd/mod-$mod.sh ]; then
106 die "$mod geninitrd module can't be loaded"
107 fi
108 . /lib/geninitrd/mod-$mod.sh
109
110 if type setup_mod_$mod > /dev/null; then
111 # add to list which need init
112 GENINITRD_MODS="$GENINITRD_MODS $mod"
113 fi
114 done
115}
116
117# setup geninitrd modules
118geninitrd_setup_mods() {
119 local mod
120
121 for mod in $GENINITRD_MODS; do
122 eval setup_mod_$mod
123 done
124}
125
c6c6ce01
ER
126# append text to /linuxrc
127# takes STDIN as input
128add_linuxrc() {
b64f015b 129 cat >> "$RCFILE"
c6c6ce01
ER
130}
131
b64f015b
ER
132# generate code to mount /dev on tmpfs and create initial nodes
133# can be called multiple times. /dev is cleaned up (umounted) automatically at
134# the end of script.
135mount_dev() {
136 if [ "$INITRDFS" = "initramfs" ]; then
137 # initramfs is read-write filesystem, no need for tmpfs
138 return
139 fi
140
141 # we already generated tmpfs code; return
142 if is_yes "$dev_mounted"; then
143 return
144 fi
145
146 dev_mounted=yes
147
148 busybox_applet mount mknod mkdir
149 add_linuxrc <<-EOF
150 : 'Creating /dev'
151 mount -o mode=0755 -t tmpfs none /dev
152 mknod /dev/console c 5 1
153 mknod /dev/null c 1 3
154 mknod /dev/zero c 1 5
8b7ac737 155 mknod /dev/urandom c 1 9
b64f015b
ER
156 mkdir /dev/pts
157 mkdir /dev/shm
158 EOF
159}
160
161# generate code to mount /proc on initrd
162# can be called multiple times
163mount_proc() {
164 if is_yes "$proc_mounted"; then
165 return
166 fi
167
168 proc_mounted=yes
2bface63
ER
169 if [ "$INITRDFS" = "initramfs" ]; then
170 # /proc is mounted with initramfs 2.6.22.14 kernel
171 # XXX: remove when it is clear why proc was already mounted
172 echo "[ -f /proc/cmdline ] || mount -t proc none /proc" | add_linuxrc
173 else
174 echo "mount -t proc none /proc" | add_linuxrc
175 fi
b64f015b
ER
176}
177
178# generate code to mount /sys on initrd
179# can be called multiple times
180mount_sys() {
181 if is_yes "$sys_mounted"; then
182 return
183 fi
184
185 sys_mounted=yes
186 echo "mount -t sysfs none /sys" | add_linuxrc
187}
188
189# generate code to mount /tmp on initrd
190# can be called multiple times
191mount_tmp() {
192 if [ "$INITRDFS" = "initramfs" ]; then
193 # initramfs is read-write filesystem, no need for tmpfs
194 return
195 fi
196
197 if is_yes "$tmp_mounted"; then
198 return
199 fi
200
201 tmp_mounted=yes
202 echo "mount -t tmpfs none /tmp" | add_linuxrc
203}
204
205# unmount all mountpoints mounted by geninitrd
206umount_all() {
ec49b7e6
ER
207
208 add_linuxrc <<-'EOF'
903f21ea 209 : Last shell before umounting all and giving control over to real init.
ec49b7e6
ER
210 debugshell
211 EOF
5b70f84d 212
b64f015b
ER
213 if is_yes "$dev_mounted"; then
214 echo 'umount /dev' | add_linuxrc
215 dev_mounted=no
216 fi
217 if is_yes "$proc_mounted"; then
218 echo 'umount /proc' | add_linuxrc
219 proc_mounted=no
220 fi
221 if is_yes "$sys_mounted"; then
222 echo 'umount /sys' | add_linuxrc
223 sys_mounted=no
224 fi
225 if is_yes "$tmp_mounted"; then
226 echo 'umount /tmp' | add_linuxrc
227 tmp_mounted=no
228 fi
229}
230
231
9299682f
ER
232# Checks if busybox has support for APPLET(s)
233# Exits from geninitrd if the support is not present.
234#
235# NB! XXX do not output to STDOUT, it will appear in initrd images in some cases!
236busybox_applet() {
30495bbf 237 local err=0 applet
9299682f
ER
238
239 if [ -z "$busybox_functions" ]; then
684d5d2a 240 local tmp=$($busybox 2>&1)
9b1373fb
ER
241
242 # BusyBox v1.1.3 says applet not found if it's not called 'busybox'.
243 if [[ "$tmp" = *applet\ not\ found* ]]; then
244 local t=$(mktemp -d)
684d5d2a 245 ln -s $busybox $t/busybox
9b1373fb
ER
246 local tmp=$($t/busybox 2>&1)
247 rm -rf $t
248 fi
249
250 busybox_functions=$(echo "$tmp" | \
9299682f
ER
251 sed -ne '/Currently defined functions:/,$p' | \
252 xargs | sed -e 's,.*Currently defined functions: ,,'
253 )
254 fi
255 for applet in $*; do
256 local have
257 # try cache
258 eval have='$'busybox_have_$applet
259 if [ -z "$have" ]; then
260 have=$(echo "$busybox_functions" | egrep -c "( |^)$applet(,|$)")
261 if [ "$have" = 0 ]; then
f4010f7f 262 warn "This setup requires busybox-initrd compiled with applet '$applet' support"
9299682f
ER
263 err=1
264 fi
265 eval busybox_have_$applet=$have
266 fi
267 done
268 if [ $err = 1 ]; then
00eaa938 269 die "Aborted"
9299682f
ER
270 fi
271}
272
7ffba534
ER
273# Finds module dependencies
274#
7ffba534
ER
275# @param $module
276#
046c68c9 277# Outputs full path to module and it's dependencies
7ffba534 278find_depmod() {
fe280785 279 local module="$1"
046c68c9
ER
280 local skiperrors=0
281
282 # if module is prefixed with dash, we should ignore errors if the module
283 # can't be found.
284 if [ ${module#-} != $module ]; then
285 skiperrors=1
286 module=${module#-}
287 fi
288
046c68c9
ER
289 # This works when user has module-init-tools installed even on 2.4 kernels
290 local modprobe
291 modprobe=$(modprobe --set-version $kernel --show-depends $module --ignore-install 2>&1)
292
293 if [ $? != 0 ]; then
294 if [ $skiperrors = 1 ]; then
7cac5014
ER
295 return
296 fi
046c68c9 297 echo >&2 "$modprobe"
7cac5014 298
7ffba534 299 if ! is_no "$EXIT_IF_MISSING"; then
046c68c9 300 die "$module: module not found for $kernel kernel"
7ffba534 301 fi
046c68c9
ER
302
303 warn "$module: module not found for $kernel kernel"
304 warn "If $module isn't compiled in kernel then this initrd may not start your system."
7ffba534
ER
305 fi
306
046c68c9 307 echo "$modprobe" | \
c25765ed 308 while read insmod modpath options; do
59a68735 309 [ "$insmod" = "insmod" ] && echo $modpath
7ffba534
ER
310 done
311}
312
4a60c01f
AM
313find_firmware() {
314 local module="$1"
601127ea
ER
315
316 # no firmware support in 2.4 kernels
317 if [ "$kernel_version_long" -lt "002005048" ]; then
318 return
319 fi
320 echo -n $(NEW_MODINFO=1 modinfo -k $kernel -F firmware $module 2>/dev/null | xargs)
4a60c01f
AM
321}
322
046c68c9
ER
323# @param $module
324find_module() {
325 local mod depmod module=$1
ac085800 326
046c68c9 327 depmod=$(find_depmod $module) || exit 1
fe280785 328 for mod in $depmod; do
7ffba534 329 mod=${mod#/lib/modules/$kernel/}
fe280785
ER
330
331 # add each module only once
332 local m have=0
333 for m in $MODULES; do
334 [ $m = $mod ] && have=1
335 done
336 if [ $have = 0 ]; then
c2eb7d4f 337 MODULES="$MODULES $mod"
fe280785 338 fi
10c3df06 339 done
bb529f94
JK
340}
341
034fdd5d
ER
342# install a file to temporary mount image.
343# it will operate recursively (copying directories)
344# and will symlink destinations if source is symlink.
bb529f94 345inst() {
17e97aec 346 if [ $# -lt 2 ]; then
a9ace64a 347 die 'Usage: inst <file> [<file>] <destination>'
c31050f3 348 fi
17e97aec
ER
349
350 local src i=0 c=$(($# - 1))
351 while [ $i -lt $c ]; do
352 src="$src $1"
353 i=$((i + 1))
354 shift
355 done
356 local dest=$1
357 set -- $src
242f2358
PZ
358 parentDir=$(dirname $DESTDIR$dest)
359 [ ! -d "$parentDir" ] && (debug "+ mkdir -p $parentDir"; mkdir -p $parentDir)
d8056591 360 debug "+ cp $* $DESTDIR$dest"
9b557a09 361 cp -HR "$@" "$DESTDIR$dest"
bb529f94
JK
362}
363
dab92b1d 364inst_d() {
17e97aec 365 if [ $# = 0 ]; then
a9ace64a 366 die 'Usage: inst_d <destination> <destination>'
034fdd5d
ER
367 fi
368 for dir in "$@"; do
9b557a09 369 install -d "$DESTDIR$dir"
034fdd5d
ER
370 done
371}
372
209061e3
ER
373# install executable and it's shared libraries
374inst_exec() {
17e97aec 375 if [ $# -lt 2 ]; then
3601c2fa 376 die "Invalid params ($@), Usage: inst_exec <file>[, <file>] <destination>"
17e97aec 377 fi
209061e3
ER
378 local src i=0 c=$(($# - 1))
379 while [ $i -lt $c ]; do
380 src="$src $1"
381 i=$((i + 1))
382 shift
383 done
9b532fe6 384 local dest=$1
209061e3
ER
385 set -- $src
386
9b532fe6
ER
387 inst "$@" $dest
388
5265962d 389 local lib libs=$(ldd "$@" | awk '/statically|linux-(gate|vdso)\.so/{next} NF == 2 {print $1} /=/{print $3}' | sort -u)
9b532fe6 390 for lib in $libs; do
9b557a09 391 if [ ! -f "$DESTDIR/$_lib/${lib##*/}" ]; then
7efbe841
ER
392 inst_d /$_lib
393 inst_exec $lib /$_lib
17e97aec 394 fi
209061e3 395 done
c7ade647
ER
396
397 # hack for uclibc linked binaries requiring this fixed path
398 # XXX: shouldn't rpath be used here instead so th
399 if [ -f $DESTDIR/$_lib/libc.so.0 ]; then
400 local lib=$DESTDIR/$_lib/libc.so.0
401 lib=$(ldd "$lib" | awk '/statically|linux-(gate|vdso)\.so/{next} NF == 2 {print $1} /=/{print $3}' | sort -u)
402 local libdir=$(cd $(dirname "$lib"); pwd)
403 if [ ! -e $DESTDIR$libdir ]; then
404 libdir=$(dirname "$libdir")
405 inst_d $libdir
406 debug "+ ln -s /$_lib $DESTDIR$libdir"
407 ln -s /$_lib $DESTDIR$libdir
408 fi
409 fi
209061e3
ER
410}
411
82474db9
ER
412# output modules.conf / modprobe.conf
413modprobe_conf() {
414 echo "$modprobe_conf_cache"
415}
416
417#
418# defaults to modprobe -c if not told otherwise, this means include statements
419# work from there.
420cache_modprobe_conf() {
707f5e60 421 if [ "$kernel_version" -lt "002005" ]; then
82474db9
ER
422 modulefile=/etc/modules.conf
423 if [ ! -f "$modulefile" -a -f /etc/conf.modules ]; then
424 modulefile=/etc/conf.modules
425 fi
426 fi
427
428 if [ -n "$modulefile" ]; then
d8056591 429 debug "Using $modulefile for modules config"
82474db9
ER
430 modprobe_conf_cache=$(cat $modulefile)
431 else
d8056591 432 debug "Using modprobe -c to get modules config"
520412e9 433 modprobe_conf_cache=$(modprobe -c --set-version $kernel)
82474db9
ER
434 fi
435}
436
bc0d6f2d 437# find modules for $devpath
d8056591 438find_modules_for_devpath() {
bc0d6f2d
ER
439 local devpath="$1"
440 if [ -z "$devpath" ]; then
d8056591 441 die "No argument passed to find_modules_for_devpath() - is your /etc/fstab correct?"
f6536797 442 fi
ac085800 443
c2eb7d4f
ER
444 if [[ "$devpath" = /dev/dm-* ]]; then
445 # /dev/dm-3 -> /dev/mapper/sil_ahbgadcbchfc3
bc0d6f2d 446 devpath=$(dm_longname "$devpath")
c2eb7d4f
ER
447 fi
448
67aa84bd 449 if [ -L "$devpath" ] && ! is_lvm "$devpath"; then
c2eb7d4f
ER
450 # sanitize things like:
451 # /dev/block/104:2 -> /dev/cciss/c0d0p2
452 devpath=$(readlink -f "$devpath")
453 fi
454
d8056591 455 debug "Finding modules for device path $devpath"
bc0d6f2d 456
3ef3d717
ER
457 if is_luks "$devpath"; then
458 find_modules_luks "$devpath"
459 return
460 fi
461
74d45ce1
ER
462 if is_nfs "$devpath"; then
463 find_modules_nfs "$devpath"
d9179777
ER
464 return
465 fi
466
e16414d9 467 if is_md "$devpath"; then
df738638 468 find_modules_md "$devpath"
d9179777
ER
469 return
470 fi
471
c3b54060 472 if is_multipath "$devpath"; then
07137fe3 473 if find_modules_multipath "$devpath"; then
9baf4f3f 474 return
9baf4f3f 475 fi
ecd7bf46 476
9baf4f3f
ER
477 # fallback
478 fi
479
36523626 480 if is_dmraid "$devpath"; then
c083ae23
ER
481 if find_modules_dmraid "$devpath"; then
482 return
483 fi
484 # fallback
485 fi
486
35043b20
ER
487 if is_scsi "$devpath"; then
488 find_modules_scsi "$devpath"
d9179777
ER
489 return
490 fi
491
30ca4815 492 if is_ide "$devpath"; then
bc0d6f2d 493 find_modules_ide "$devpath"
d9179777
ER
494 return
495 fi
496
07b09cf9 497 if [[ "$devpath" == /dev/rd/* ]]; then
046c68c9 498 find_module "DAC960"
c3313cd6 499 rootdev_add=/dev/rd/
d9179777
ER
500 return
501 fi
502
07b09cf9 503 if [[ "$devpath" == /dev/ida/* ]]; then
046c68c9 504 find_module "cpqarray"
c3313cd6 505 rootdev_add=/dev/ida/
d9179777
ER
506 return
507 fi
508
08651ad1 509 if [[ "$devpath" == /dev/cciss/* ]]; then
046c68c9 510 find_module "cciss"
c3313cd6 511 rootdev_add=/dev/cciss/
d9179777
ER
512 return
513 fi
514
07b09cf9 515 if [[ "$devpath" == /dev/ataraid/* ]]; then
ac085800 516 find_modules_ide
046c68c9 517 find_module "ataraid"
82474db9 518 ataraidmodules=$(modprobe_conf | awk '/ataraid_hostadapter/ && ! /^[\t ]*#/ { print $3; }')
9ae446b9 519 if [ -n "$ataraidmodules" ]; then
7c38b114 520 # FIXME: think about modules compiled in kernel
82474db9 521 die "ataraid_hostadapter alias not defined in modprobe.conf! Please set it and run $PROGRAM again."
7c38b114
AF
522 fi
523 for n in $ataraidmodules; do
046c68c9 524 find_module "$n"
7c38b114 525 done
c3313cd6 526 rootdev_add=/dev/ataraid/
d9179777
ER
527 return
528 fi
529
7c38b114 530 # check to see if we need to set up a loopback filesystem
07b09cf9 531 if [[ "$devpath" == /dev/loop* ]]; then
00eaa938 532 die "Sorry, root on loop device isn't supported."
7c38b114
AF
533 # TODO: rewrite for bsp and make nfs ready
534 if [ ! -x /sbin/losetup ]; then
00eaa938 535 die "losetup is missing"
7c38b114 536 fi
bc0d6f2d 537 key="^# $(echo $devpath | awk -F/ '{print($3);}' | tr '[a-z]' '[A-Z]'):"
82474db9 538 if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`"; then
42820142 539 die "The root filesystem is on a $devpath, but there is no magic entry in $fstab for this device. Consult the $PROGRAM man page for more information"
7c38b114
AF
540 fi
541
542 line="`awk '/'$key'/ { print $0; }' $fstab`"
543 loopDev="$(echo $line | awk '{print $3}')"
544 loopFs="$(echo $line | awk '{print $4}')"
545 loopFile="$(echo $line | awk '{print $5}')"
546
547 BASICMODULES="$BASICMODULES -loop"
046c68c9 548 find_module "-$loopFs"
7c38b114 549 BASICMODULES="$BASICMODULES -${loopFs}"
d9179777
ER
550 return
551 fi
552
67aa84bd
ER
553 if is_lvm "$devpath"; then
554 find_modules_lvm "$devpath"
d9179777 555 return
7c38b114
AF
556 fi
557}
558
b64f015b 559firmware_install_module() {
c3667d07 560 local module="$1"
c6c6ce01 561 local firmware_files="$2"
9ed6e1db 562
94769f11 563 debug "Adding Firmwares ($firmware_files) to initrd for module $module"
9ed6e1db 564 # firmware not yet installed
9b557a09 565 if [ ! -f "$DESTDIR/lib/firmware/firmware.sh" ]; then
034fdd5d 566 inst_d /lib/firmware
9b557a09 567cat << 'EOF' >> "$DESTDIR/lib/firmware/firmware.sh"
9ed6e1db 568#!/bin/sh -e
8639f99a
AM
569echo 1 > /sys$DEVPATH/loading
570cat "/lib/firmware/$FIRMWARE" > /sys$DEVPATH/data
571echo 0 > /sys$DEVPATH/loading
572exit 0
9ed6e1db 573EOF
9b557a09 574 chmod 755 "$DESTDIR/lib/firmware/firmware.sh"
9ed6e1db
AM
575 fi
576
577 for firmware in $firmware_files; do
80b23733 578 if [ -f "/lib/firmware/$kernel/$firmware" ]; then
486d26a5 579 FIRMWAREDIR=${firmware%/*}
4a9920e7 580 [ "$FIRMWAREDIR" != "$firmware" ] && inst_d /lib/firmware/$FIRMWAREDIR
80b23733
ER
581 inst /lib/firmware/$kernel/$firmware /lib/firmware/$firmware
582 elif [ -f "/lib/firmware/$firmware" ]; then
c661b23c 583 FIRMWAREDIR=${firmware%/*}
584 [ "$FIRMWAREDIR" != "$firmware" ] && inst_d /lib/firmware/$FIRMWAREDIR
80b23733 585 inst /lib/firmware/$firmware /lib/firmware/$firmware
c661b23c 586 else
80b23733 587 die "firmware file /lib/firmware/$firmware nor /lib/firmware/$kernel/$firmware found."
4a60c01f 588 fi
9ed6e1db
AM
589 done
590
b64f015b 591 mount_sys
c6c6ce01 592 echo "echo -n "/lib/firmware/firmware.sh" > /proc/sys/kernel/hotplug" | add_linuxrc
9ed6e1db
AM
593}
594
2a5bcca9 595modules_install() {
c3667d07
ER
596 local modules="$1"
597 local mod
2a5bcca9
AM
598
599 for mod in $modules; do
fe280785 600 MODULEDIR=${mod%/*}
4a9920e7 601 inst_d "/lib/modules/$kernel/$MODULEDIR"
9b557a09
ER
602 cp -a "/lib/modules/$kernel/$mod" "$DESTDIR/lib/modules/$kernel/$mod"
603 gunzip "$DESTDIR/lib/modules/$kernel/$mod" 2> /dev/null
2a5bcca9
AM
604 done
605}
606
607modules_add_linuxrc() {
fe280785 608 local mod modpath
ac085800 609
fe280785
ER
610 for mod in "$@"; do
611 # module path without optional compression
612 modpath=${mod%.gz}
613
614 # name of the module
8011a76c
ER
615 local module=${modpath##*/}; module=${module%$modext}
616 local options=$(modprobe_conf | awk -vmodule="$module" '{ if ($1 == "options" && $2 == module) { for(i=3;i<=NF;i++) printf("%s ",$i); }}' | xargs)
617 local genericname=$(echo $module | tr - _)
618 local usleep=$(eval echo \$MODULE_${genericname}_USLEEP)
619 local firmware=$(eval echo \$MODULE_${genericname}_FIRMWARE)
2a5bcca9 620
3e1d0df9
AM
621 if [ "$module" = "scsi_mod" -a "$kernel_version_long" -ge "002006030" ]; then
622 options="scan=sync $options"
623 fi
624
ac085800 625 if [ -n "$verbose" ]; then
8a47b72c
ER
626 s=""
627 if [ "$options" ]; then
628 s="$s with options [$options]"
629 fi
8011a76c
ER
630 if [ "$usleep" ]; then
631 s="$s and $usleep usleep"
8a47b72c 632 fi
4a60c01f 633 debug "Loading module [$module]$s"
ac085800
ER
634 fi
635
8011a76c
ER
636 if [ -n "$firmware" ]; then
637 firmware_install_module "$module" "$firmware"
4a60c01f 638 else
06e481d7
ER
639 for file in $(find_firmware "$module"); do
640 firmware_install_module "$module" "$file"
641 done
9ed6e1db 642 fi
4a60c01f 643
18ece493 644 echo "insmod /lib/modules/$kernel/$modpath $options" | add_linuxrc
8011a76c
ER
645 if [ -n "$usleep" ]; then
646 echo "usleep $usleep" | add_linuxrc
8e598759 647 fi
e00dcfcb 648 if [ "$module" = "scsi_wait_scan" ]; then
d29583e0
ER
649 if [ "$(busybox_applet rmmod 2>/dev/null; echo $?)" = 0 ]; then
650 echo "rmmod scsi_wait_scan" | add_linuxrc
651 fi
e00dcfcb
AM
652 fi
653
2a5bcca9
AM
654 done
655}
656
82b2dba2
ER
657# Generates /dev nodes based on /proc/partitions information.
658# Needs /proc mounted.
659# Can be called multiple times.
660initrd_gen_devices() {
661 if is_yes "$proc_partitions"; then
662 return
663 fi
664 proc_partitions=yes
335cd101 665
82b2dba2
ER
666 mount_dev
667 add_linuxrc <<-'EOF'
668 : 'Making device nodes'
669 cat /proc/partitions | (
8d4aba01 670 # ignore first two lines: header, empty line
82b2dba2 671 read b; read b
2cc3ae8b 672
82b2dba2
ER
673 while read major minor blocks dev rest; do
674 node=/dev/$dev
675 mkdir -p ${node%/*}
8d4aba01 676 [ -e $node ] || mknod $node b $major $minor
82b2dba2
ER
677 done
678 )
679 EOF
680}
bb529f94 681
82b2dba2 682
4828c787 683initrd_gen_setrootdev() {
5a761721 684 debug "Adding rootfs finding based on kernel cmdline root= option support."
82b2dba2 685 add_linuxrc <<-'EOF'
dcdf6b49
ER
686 if [ "${ROOT##/dev/}" != "${ROOT}" ]; then
687 rootnr="$(busybox awk -v rootnode="${ROOT##/dev/}" '$4 == rootnode { print 256 * $1 + $2 }' /proc/partitions)"
82b2dba2
ER
688 if [ -n "$rootnr" ]; then
689 echo "$rootnr" > /proc/sys/kernel/real-root-dev
690 fi
691 fi
b64f015b 692 EOF
1606e343
AM
693}
694
4671d086
ER
695initrd_gen_initramfs_switchroot() {
696 inst_d /newroot
697 if [ "$rootdev" = "/dev/nfs" ]; then
698 echo "rootfs on NFS root=/dev/nfs"
699 else
700 [ ! -e "$DESTDIR/$rootdev" ] && inst $rootdev $rootdev
701 fi
5845b321
ER
702
703 # parse 'root=xxx' kernel commandline
4671d086
ER
704 # We support passing root as hda3 /dev/hda3 0303 0x0303 and 303
705 add_linuxrc <<-'EOF'
706 device=/dev/no_partition_found
707 eval "$(busybox awk -v c="$ROOT" '
708 BEGIN {
709 num_pattern_short = "[0-9a-f][0-9a-f][0-9a-f]";
710 num_pattern = "[0-9a-f]" num_pattern_short;
711 dev_pattern = "[hms][a-z][a-z]([0-9])+";
712 partition = "no_partition_found";
713 min = -1; maj = -1;
714
715 sub("^0x", "", c);
716 if (c ~ "^" num_pattern_short "$") sub("^", "0", c);
717 if (c ~ "^" num_pattern "$") {
718 maj = sprintf("%s",substr(c,1,2));
719 min = sprintf("%s",substr(c,3));
720 }
721 if (c ~ "^\/dev\/" dev_pattern "$") sub("^/dev/","", c);
722 if (c ~ "^" dev_pattern "$") partition = c;
723 }
724
725 $4 ~ partition { maj = $1; min = $2; }
726 $1 ~ maj && $2 ~ min { partition = $4; }
727
728 END {
fa3a5452
ER
729 if (maj >= 0 && min >= 0) {
730 printf("device=/dev/%s; maj=%s; min=%s;\n", partition, maj, min);
731 }
4671d086
ER
732 }
733 ' /proc/partitions)"
734 if [ "$device" != '/dev/no_partition_found' -a ! -b $device ]; then
735 mknod $device b $maj $min
736 fi
737 EOF
738
739 add_linuxrc <<-EOF
740 rootdev=$rootdev
741 rootfs=$rootFs
742 EOF
743
744 add_linuxrc <<-'EOF'
745 if [ "$device" = '/dev/no_partition_found' ]; then
746 device=$rootdev
747 fi
748
749 mount -t $rootfs -r $device /newroot
750 init="$(echo "$CMDLINE" | busybox awk '/init=\// { gsub(/.*init=/,NIL,$0); gsub(/ .*/,NIL,$0); print }')"
751 if [ -z "$init" -o ! -x "/newroot$init" ]; then
752 init=/sbin/init
753 fi
754 EOF
755
756 umount_all
757 busybox_applet switch_root
758 add_linuxrc <<-'EOF'
f8ea6a63 759 exec switch_root /newroot $init ${1:+"$@"}
4671d086
ER
760
761 echo "Error! initramfs should not reach this place."
762 echo "It probably means you've got old version of busybox, with broken"
763 echo "initramfs support. Trying to boot anyway, but won't promise anything."
764
f8ea6a63 765 exec chroot /newroot $init ${1:+"$@"}
4671d086
ER
766
767 echo "Failed to chroot!"
768 EOF
769 # we need /init being real file, not symlink, otherwise the initramfs will
770 # not be ran by pid 1 which is required for switch_root
771 mv $DESTDIR/linuxrc $DESTDIR/init
772 ln -s init $DESTDIR/linuxrc
773}
774
c552503c
ER
775# find if $symbol exists in System.map $mapfile
776sym_exists() {
777 local mapfile="$1"
778 local symbol="$2"
779 if [ ! -f $mapfile ]; then
780 # missing mapfile (not a pld kernel?)
781 return 1
782 fi
783
784 awk -vc=1 -vsymbol="$symbol" '$2 == "T" && $3 == symbol {c = 0} END {exit c}' $mapfile
785}
786
787# find best compressor (or forced one) for initrd
788find_compressor() {
789 local mode="$1"
790 # the best compressor list
29f7d622 791 local compressors='xz lzma bzip2 gzip'
c552503c
ER
792
793 # a specified one, take it
55aaf2fe
AM
794 if ! is_yes "$mode"; then
795 compressors="$mode"
c552503c
ER
796 fi
797
798 debug "finding compressor: $compressors (via $mode)"
799 # check for compressor validity
800 local c prog map=/boot/System.map-$kernel
801 for c in $compressors; do
802 case $c in
66d146a5 803 xz)
29f7d622
AM
804 sym=unxz
805 prog=/usr/bin/xz
806 ;;
807 lzma)
c552503c 808 sym=unlzma
66d146a5 809 prog=/usr/bin/xz
c552503c
ER
810 ;;
811 bzip2)
812 sym=bzip2
c42692d4 813 prog=/usr/bin/bzip2
c552503c
ER
814 ;;
815 gzip)
816 sym=gunzip
c42692d4 817 prog=/bin/gzip
c552503c
ER
818 ;;
819 *)
820 die "Unknown compressor $c"
821 ;;
822 esac
c454c66e 823 if sym_exists $map $sym && [ -x $prog ]; then
c552503c
ER
824 echo $c
825 return
826 fi
827 done
828
829 debug "using gzip for compressor (fallback)"
830 echo gzip
831}
832
82b2dba2
ER
833if [ -r /etc/sysconfig/geninitrd ]; then
834 . /etc/sysconfig/geninitrd
835fi
2cc3ae8b 836
c215292c
AG
837if [ ! -f /proc/mounts ]; then
838 warn "/proc filesystem not mounted, may cause wrong results or failure."
839fi
840
35043b20 841geninitrd_load_mods ide luks multipath dmraid lvm md blkid udev tuxonice suspend fbsplash condecor bootsplash uvesafb nfs scsi
c124d0cf 842
82b2dba2
ER
843while [ $# -gt 0 ]; do
844 case $1 in
845 --fstab=*)
846 fstab=${1#--fstab=}
847 ;;
848 --fstab)
849 fstab=$2
850 shift
851 ;;
852 --modules-conf=*)
853 modulefile=${1#--modules-conf=}
854 ;;
855 --modules-conf)
856 modulefile=$2
857 shift
858 ;;
82b2dba2
ER
859 --with-bootsplash)
860 BOOT_SPLASH=yes
861 ;;
862 --without-bootsplash)
863 BOOT_SPLASH=no
864 ;;
865 --with-fbsplash)
866 FB_SPLASH=yes
867 ;;
868 --without-fbsplash)
869 FB_SPLASH=no
870 ;;
6c69a2d4
ER
871 --with-fbcondecor)
872 FB_CON_DECOR=yes
873 ;;
874 --without-fbcondecor)
875 FB_CON_DECOR=no
876 ;;
82b2dba2
ER
877 --with-suspend)
878 USE_SUSPEND=yes
879 ;;
880 --without-suspend)
881 USE_SUSPEND=no
882 ;;
883 --with-suspend2 | --with-tuxonice)
884 USE_TUXONICE=yes
885 ;;
886 --without-suspend2 | --without-tuxonice)
887 USE_TUXONICE=no
888 ;;
80b1ed79 889 --lvmversion=*)
7308edee 890 LVMTOOLSVERSION=${1#--lvmversion=}
82b2dba2 891 ;;
80b1ed79 892 --lvmtoolsversion=*)
893 LVMTOOLSVERSION=${1#--lvmtoolsversion=}
894 ;;
82b2dba2
ER
895 --lvmtoolsversion|--lvmversion)
896 LVMTOOLSVERSION=$2
897 shift
898 ;;
899 --without-udev)
900 USE_UDEV=no
901 ;;
902 --with-udev)
903 USE_UDEV=yes
904 ;;
905 --without-dmraid)
906 USE_DMRAID=no
907 ;;
908 --without-multipath)
ecd7bf46
ER
909 USE_MULTIPATH=no
910 ;;
911 --with-multipath=*)
912 USE_MULTIPATH=${1#--with-multipath=}
82b2dba2 913 ;;
af075488 914 --without-blkid)
915 USE_BLKID=no
289fbc9b 916 ;;
3ef3d717
ER
917 --without-luks)
918 USE_LUKS=no
919 ;;
82b2dba2
ER
920 --with=*)
921 BASICMODULES="$BASICMODULES ${1#--with=}"
922 ;;
923 --with)
924 BASICMODULES="$BASICMODULES $2"
925 shift
926 ;;
927 --version)
928 echo "$PROGRAM: version $VERSION"
929 exit 0
930 ;;
931 -v)
932 verbose=-v
933 ;;
c552503c
ER
934 --compress)
935 COMPRESS=$2
936 ;;
937 --compress=*)
938 COMPRESS="${1#--compress=}"
939 ;;
82b2dba2
ER
940 --nocompress)
941 COMPRESS=no
942 ;;
943 --ifneeded)
944 ifneeded=1
945 ;;
946 -f)
947 force=1
948 ;;
949 --preload=*)
950 PREMODS="$PREMODS ${1#--preload=}"
951 ;;
952 --preload)
953 PREMODS="$PREMODS $2"
954 shift
955 ;;
2965cab9 956 --fs=* | --fs)
bbbc32d0 957 die "--fs option is obsoleted. Use --initrdfs instead"
82b2dba2
ER
958 ;;
959 --initrdfs=*)
960 INITRDFS=${1#--initrdfs=}
961 ;;
962 --initrdfs)
963 INITRDFS=$2
964 shift
965 ;;
966 --image-version)
967 img_vers=yes
968 ;;
969 --ide-only-root)
970 ide_only_root="yes"
971 ;;
972 *)
973 if [ -z "$target" ]; then
974 target="$1"
975 elif [ -z "$kernel" ]; then
976 kernel="$1"
977 else
36523626
ER
978 usage >&2
979 exit 1
82b2dba2
ER
980 fi
981 ;;
982 esac
f5db170b 983
82b2dba2
ER
984 shift
985done
986
987if [ -z "$target" -o -z "$kernel" ]; then
36523626
ER
988 usage >&2
989 exit 1
82b2dba2
ER
990fi
991
93a38d1a
ER
992# main()
993if [ "$(id -u)" != 0 ]; then
994 die "You need to be root to generate initrd"
995fi
996
c124d0cf
ER
997if [ -d /usr/lib64 ]; then
998 _lib=lib64
999else
1000 _lib=lib
130aadc1
ER
1001fi
1002
c124d0cf 1003initrd_dir=/usr/$_lib/initrd
707f5e60
ER
1004kernel_version=$(echo "$kernel" | awk -F. '{print sprintf("%03d%03d",$1,$2)}')
1005kernel_version_long=$(echo "$kernel" | awk -F. '{print sprintf("%03d%03d%03d",$1,$2,$3)}')
82b2dba2 1006
c124d0cf
ER
1007debug "# $RCSID"
1008debug "Using _lib: $_lib"
1009debug "Using initrd_dir: $initrd_dir"
1010
6ec4aea6 1011busybox=$(find_tool $initrd_dir/busybox $initrd_dir/initrd-busybox /bin/initrd-busybox) || die "Couldn't find busybox suitable for initrd"
c124d0cf
ER
1012
1013# we setup mods after parsing command line args
1014geninitrd_setup_mods
1015
1016if [ ! -f /boot/vmlinuz-"$kernel" ]; then
1017 warn "/boot/vmlinuz-$kernel doesn't exist, is your /boot mounted?"
1018fi
1019
82b2dba2 1020if [ -z "$INITRDFS" ]; then
bbbc32d0
ER
1021 if [ -n "$FS" ]; then
1022 # FS= can came only via /etc/sysconfig/geninitrd likely?
1023 die "FS configuration option is obsoleted. Use INITRDFS instead"
f5db170b 1024 fi
f5db170b 1025
bbbc32d0
ER
1026 # default value
1027 if [ "$kernel_version" -ge "002005" ]; then
1028 INITRDFS="initramfs"
1029 else
1030 INITRDFS="rom"
1031 fi
82b2dba2 1032fi
966c32cc 1033
82b2dba2 1034case "$INITRDFS" in
4877276e
ER
1035 ext2)
1036 [ -x /sbin/mke2fs ] || die "/sbin/mke2fs is missing"
1037 ;;
1038 rom|romfs)
1039 [ -x /sbin/genromfs ] || die "/sbin/genromfs is missing"
1040 ;;
1041 cram|cramfs)
1042 [ -x /sbin/mkcramfs ] || die "/sbin/mkcramfs is missing"
1043 ;;
1044 initramfs)
1045 [ -x /bin/cpio ] || die "/bin/cpio is missing"
1046 [ -x /usr/bin/find ] || die "/usr/bin/find is missing"
1047 ;;
1048 *)
1049 die "Filesystem $INITRDFS on initrd is not supported"
1050 ;;
82b2dba2 1051esac
f5db170b 1052
9323ada3 1053if [ -L "$target" ]; then
1054 target=$(readlink -f "$target")
1055fi
1056
82b2dba2
ER
1057if [ -n "$img_vers" ]; then
1058 target="$target-$kernel"
1059fi
8bd582f1 1060
82b2dba2
ER
1061if [ -z "$force" -a -f "$target" ]; then
1062 die "$target already exists."
1063fi
c6c6ce01 1064
82b2dba2
ER
1065if [ ! -d "/lib/modules/$kernel" ]; then
1066 die "/lib/modules/$kernel is not a directory."
1067fi
2ffb1734 1068
bbbc32d0
ER
1069if [ "$kernel_version" -ge "002005" ]; then
1070 modext=".ko"
1071fi
1072
82b2dba2
ER
1073cache_modprobe_conf
1074
1075for n in $PREMODS; do
046c68c9 1076 find_module "$n"
82b2dba2
ER
1077done
1078
ed30e3a8 1079if [ "$FBMODULE" ]; then
046c68c9 1080 find_module "$FBMODULE"
ed30e3a8
ER
1081fi
1082
82b2dba2 1083# allow forcing loading SCSI and/or IDE modules
35043b20 1084# XXX: where ADDSCSI cames from? drop?
82b2dba2
ER
1085if is_yes "$ADDSCSI"; then
1086 find_modules_scsi
1087fi
1088
35043b20 1089# XXX: where ADDIDE cames from? drop?
82b2dba2
ER
1090if is_yes "$ADDIDE"; then
1091 find_modules_ide
1092fi
1093
4c16dac4
ER
1094if is_yes "$USE_SUSPEND"; then
1095 find_modules_suspend
1096fi
1097
82b2dba2
ER
1098find_root "$fstab" || exit
1099debug "Using $rootdev as device for rootfs"
1100
d8056591 1101find_modules_for_devpath "$rootdev"
ac085800 1102
ecd7bf46
ER
1103# if USE_MULTIPATH is path to device, scan that too
1104# this is to bootstrap multipath setup into initrd.
1105if ! is_no "$USE_MULTIPATH" && ! is_yes "$USE_MULTIPATH"; then
1106 find_modules_multipath $USE_MULTIPATH
1107fi
1108
046c68c9 1109find_module "-$rootFs"
ac085800 1110
82b2dba2 1111for n in $BASICMODULES; do
046c68c9 1112 find_module "$n"
82b2dba2 1113done
4e9eb79c 1114
82b2dba2 1115if is_yes "$USE_TUXONICE"; then
046c68c9 1116 find_module "-lzf"
82b2dba2 1117fi
33d24e12 1118
bf6d9c64 1119find_modules_fbsplash
2968c9dd 1120
82b2dba2
ER
1121if [ -n "$ifneeded" -a -z "$MODULES" ]; then
1122 debug "No modules are needed -- not building initrd image."
1123 exit 0
1124fi
c6c6ce01 1125
6fc274fb 1126debug "Building initrd..."
d8056591 1127DESTDIR=$(mktemp -d -t initrd.XXXXXX) || die "mktemp failed"
9b557a09 1128RCFILE="$DESTDIR/linuxrc"
82b2dba2
ER
1129> "$RCFILE"
1130chmod a+rx "$RCFILE"
9b557a09 1131ln -s linuxrc $DESTDIR/init
e8d178ff 1132
82b2dba2
ER
1133# create dirs that we really need
1134inst_d /{lib,bin,etc,dev{,/pts,/shm},loopfs,var,proc,sys}
e8d178ff 1135
82b2dba2 1136modules_install "$MODULES"
b64f015b 1137
82b2dba2
ER
1138# mknod'ing the devices instead of copying them works both with and
1139# without devfs...
9b557a09
ER
1140mknod "$DESTDIR/dev/console" c 5 1
1141mknod "$DESTDIR/dev/null" c 1 3
1142mknod "$DESTDIR/dev/zero" c 1 5
94dce45c 1143mknod "$DESTDIR/dev/urandom" c 1 9
be2f3ecc 1144
6ec4aea6
JR
1145inst_exec $busybox /bin/busybox
1146ln -s busybox $DESTDIR/bin/sh
1147# for older busyboxes who had /bin/initrd-busybox as EXEPATH
1148ln -s busybox $DESTDIR/bin/initrd-busybox
2ffb1734 1149
82b2dba2
ER
1150add_linuxrc <<EOF
1151#!/bin/sh
1152# initrd generated by:
1153# $RCSID
c6c6ce01 1154
82b2dba2
ER
1155EOF
1156mount_proc
1157add_linuxrc <<-'EOF'
3a1d3d88 1158 read CMDLINE < /proc/cmdline; export CMDLINE
c6c6ce01 1159
82b2dba2
ER
1160 for arg in $CMDLINE; do
1161 if [ "${arg}" = "debuginitrd" ]; then
1162 DEBUGINITRD=yes
1163 fi
1164 if [ "${arg##debuginitrd=}" != "${arg}" ]; then
1165 DEBUGINITRD=${arg##debuginitrd=}
1166 fi
fc787d45 1167 if [ "${arg##root=}" != "${arg}" ]; then
1168 ROOT=${arg##root=}
1169 fi
82b2dba2 1170 done
c6c6ce01 1171
82b2dba2
ER
1172 # make debugshell() invoke subshell if $DEBUGINITRD=sh
1173 if [ "$DEBUGINITRD" = "sh" ]; then
1174 debugshell() {
e2405b29
AM
1175EOF
1176if is_yes "$RUN_SULOGIN_ON_ERR"; then
1177add_linuxrc <<-'EOF'
1178 echo "debug shell disabled by /etc/sysconfig/system:RUN_SULOGIN_ON_ERR setting"
1179EOF
1180else
1181add_linuxrc <<-'EOF'
1182 sh
1183EOF
1184fi
1185add_linuxrc <<-'EOF'
82b2dba2
ER
1186 }
1187 else
1188 debugshell() {
1189 :
1190 }
1191 fi
e934d044 1192
82b2dba2
ER
1193 if [ "$DEBUGINITRD" ]; then
1194 set -x
cff3058d 1195 fi
82b2dba2 1196EOF
2df2e995 1197
fe280785 1198modules_add_linuxrc $MODULES
82b2dba2
ER
1199
1200# TODO: rewrite for busybox
1201#if [ -n "$loopDev" ]; then
1202# if [ ! -d /initrd ]; then
1203# mkdir /initrd
1204# fi
1205#
9b557a09
ER
1206# cp -a "$loopDev" "$DESTDIR/dev"
1207# cp -a "$rootdev" "$DESTDIR/dev"
82b2dba2
ER
1208# echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE"
1209# echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE"
1210# echo "echo Setting up loopback device $rootdev" >> $RCFILE
1211# echo "losetup $rootdev /loopfs$loopFile" >> "$RCFILE"
1212#fi
2b1a3707 1213
1606e343
AM
1214if is_yes "$USE_UDEV"; then
1215 initrd_gen_udev
1216fi
1217
1cd2aabd
ER
1218if is_yes "$USE_TUXONICE"; then
1219 initrd_gen_tuxonice
2df2e995
AM
1220fi
1221
3dd50160
ER
1222find_modules_uvesafb
1223initrd_gen_uvesafb
43258faf 1224
3ef3d717
ER
1225if is_yes "$have_luks"; then
1226 initrd_gen_luks
1227fi
1228
cc8e8a99 1229if is_yes "$have_dmraid"; then
882472ae
ER
1230 initrd_gen_dmraid
1231fi
1232
c083ae23 1233if is_yes "$have_multipath"; then
2cc3ae8b
ER
1234 initrd_gen_multipath
1235fi
1236
cc8e8a99 1237if is_yes "$USE_BLKID"; then
289fbc9b 1238 initrd_gen_blkid
1239fi
1240
69b1e935 1241if is_yes "$have_nfs"; then
2df2e995 1242 initrd_gen_nfs
8dadb607 1243elif is_yes "$have_md"; then
df738638 1244 initrd_gen_md
69b1e935 1245 if is_yes "$have_lvm"; then
2df2e995 1246 initrd_gen_lvm
bfea009a 1247 else
4828c787 1248 initrd_gen_setrootdev
2df2e995 1249 fi
69b1e935 1250elif is_yes "$have_lvm"; then
2df2e995 1251 initrd_gen_lvm
2b1a3707 1252else
4828c787 1253 initrd_gen_setrootdev
7c38b114
AF
1254fi
1255
4c16dac4
ER
1256if is_yes "$USE_SUSPEND"; then
1257 initrd_gen_suspend
1258fi
1259
5101a385 1260# additional devs always needed
9b557a09 1261[ ! -e "$DESTDIR/$rootdev_add" ] && inst $rootdev_add /dev
5101a385 1262
82de999f
ER
1263if is_yes "$USE_UDEV"; then
1264 initrd_gen_stop_udevd
1265fi
1266
f8f9e56d 1267if [ "$INITRDFS" = "initramfs" ]; then
4671d086 1268 initrd_gen_initramfs_switchroot
b64f015b 1269else
b64f015b 1270 umount_all
f8f9e56d
AM
1271fi
1272
b7feffb3
ER
1273if is_yes "$FB_SPLASH"; then
1274 initrd_gen_fbsplash
1275fi
1276
6c69a2d4
ER
1277if is_yes "$FB_CON_DECOR"; then
1278 initrd_gen_fbcondecor
1279fi
1280
d8056591 1281IMAGE=$(mktemp -t initrd.img-XXXXXX) || die "mktemp failed"
51dc1fe6
AM
1282
1283debug "Creating $INITRDFS image $IMAGE"
2ad94d8a 1284case "$INITRDFS" in
4877276e 1285 ext2)
4877276e
ER
1286 dd if=/dev/zero of="$IMAGE" bs=1k count="$IMAGESIZE" 2> /dev/null
1287 mke2fs -q -F -b 1024 -m 0 "$IMAGE" 2>/dev/null 1>&2
1288 tune2fs -i 0 "$IMAGE" >/dev/null 2>&1
1289
1290 local tmpmnt=$(mktemp -d -t initrd.mnt-XXXXXX)
1291 debug "Mounting ext2 image $IMAGE to $tmpmnt"
1292 mount -o loop -t ext2 "$IMAGE" "$tmpmnt"
1293 # We don't need this directory, so let's save space
1294 rm -rf "$tmpmnt"/lost+found
1295
1296 debug "Copy recursively $DESTDIR -> $tmpmnt"
1297 cp -a $DESTDIR/* $tmpmnt
1298 umount "$IMAGE"
1299 rmdir "$tmpmnt"
1300
1301 ;;
1302 rom|romfs)
1303 genromfs -f "$IMAGE" -d "$DESTDIR" -V "PLD initrd for kernel $kernel"
4877276e
ER
1304 ;;
1305 cram|cramfs)
1306 mkcramfs "$DESTDIR" "$IMAGE"
1307 ;;
1308 initramfs)
1309 (cd $DESTDIR; find . | cpio --quiet -H newc -o > "$IMAGE")
1310 ;;
1311 *)
93a38d1a 1312 die "Filesystem $INITRDFS not supported by $PROGRAM"
c31050f3 1313esac
bb529f94 1314
e3bc44e2
ER
1315# TODO: figure out this automatically
1316CONFIG_BLK_DEV_RAM_SIZE=4096
1317
1318IMAGESIZE=$(du -ks $DESTDIR | awk '{print int(($1+1023+512)/1024)*1024}')
1319debug "image size: $IMAGESIZE KiB ($DESTDIR)"
1320if [ "$IMAGESIZE" -gt $CONFIG_BLK_DEV_RAM_SIZE ]; then
1321 warn "Your image size is larger than $CONFIG_BLK_DEV_RAM_SIZE, Be sure to boot kernel with ramdisk_size=$IMAGESIZE!"
1322fi
1323
c552503c 1324if ! is_no "$COMPRESS"; then
aecfd33d 1325 tmp=$(mktemp "$target".XXXXXX) || die "mktemp failed"
c552503c
ER
1326 compressor=$(find_compressor "$COMPRESS")
1327 debug "Compressing $target with $compressor"
1328
1329 # TODO: the image name (specified from kernel.spec) already contains
1330 # extension, which is .gz most of the time.
1331 case "$compressor" in
66d146a5 1332 xz)
a9a98c64
AM
1333 # don't use -9 here since kernel won't understand it
1334 xz --format=xz --check=crc32 --lzma2=preset=6e,dict=1MiB < "$IMAGE" > "$tmp"
29f7d622
AM
1335 ;;
1336 lzma)
b738ab0d 1337 xz --format=lzma -9 < "$IMAGE" > "$tmp"
c552503c
ER
1338 ;;
1339 bzip2)
1340 bzip2 -9 < "$IMAGE" > "$tmp"
1341 ;;
1342 gzip)
1343 gzip -9 < "$IMAGE" > "$tmp"
1344 ;;
1345 esac
d8056591 1346 mv -f "$tmp" "$target"
bb529f94 1347else
7d2fc5eb 1348 cp -a "$IMAGE" "$target"
bb529f94 1349fi
5b71959c 1350
7992356a 1351# XXX. check if bootsplash can output data to tmp dir not directly to initramfs image.
5b71959c 1352if is_yes "$BOOT_SPLASH"; then
f5db170b 1353 initrd_gen_bootsplash "$target"
5b71959c
AM
1354fi
1355
d8056591 1356rm -rf "$DESTDIR" "$IMAGE"
ac085800
ER
1357
1358# vim:ts=4:sw=4:noet:fdm=marker
This page took 0.440739 seconds and 4 git commands to generate.