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