]> git.pld-linux.org Git - projects/geninitrd.git/blame - geninitrd
blkid installed by mod-blkid
[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
103 debug "find_tool: did not found any of: $@"
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
471#
472# defaults to modprobe -c if not told otherwise, this means include statements
473# work from there.
474cache_modprobe_conf() {
707f5e60 475 if [ "$kernel_version" -lt "002005" ]; then
82474db9
ER
476 modulefile=/etc/modules.conf
477 if [ ! -f "$modulefile" -a -f /etc/conf.modules ]; then
478 modulefile=/etc/conf.modules
479 fi
480 fi
481
482 if [ -n "$modulefile" ]; then
d8056591 483 debug "Using $modulefile for modules config"
99e7251e
ER
484 modprobe_conf_cache=$(cat $modulefile | awk '!/^[\t ]*#/ { print }')
485
82474db9 486 else
d8056591 487 debug "Using modprobe -c to get modules config"
99e7251e 488 modprobe_conf_cache=$(modprobe -c --set-version $kernel | awk '!/^[\t ]*#/ { print }')
82474db9
ER
489 fi
490}
491
bc0d6f2d 492# find modules for $devpath
d8056591 493find_modules_for_devpath() {
bc0d6f2d
ER
494 local devpath="$1"
495 if [ -z "$devpath" ]; then
d8056591 496 die "No argument passed to find_modules_for_devpath() - is your /etc/fstab correct?"
f6536797 497 fi
ac085800 498
c2eb7d4f
ER
499 if [[ "$devpath" = /dev/dm-* ]]; then
500 # /dev/dm-3 -> /dev/mapper/sil_ahbgadcbchfc3
d2cb46cf 501 devpath=$(dm_node "$devpath")
c2eb7d4f
ER
502 fi
503
336018a5 504 if [ -L "$devpath" ] && ! is_lvm "$devpath" && ! is_luks "$devpath"; then
c2eb7d4f
ER
505 # sanitize things like:
506 # /dev/block/104:2 -> /dev/cciss/c0d0p2
507 devpath=$(readlink -f "$devpath")
508 fi
509
d8056591 510 debug "Finding modules for device path $devpath"
bc0d6f2d 511
3ef3d717
ER
512 if is_luks "$devpath"; then
513 find_modules_luks "$devpath"
514 return
515 fi
516
74d45ce1
ER
517 if is_nfs "$devpath"; then
518 find_modules_nfs "$devpath"
d9179777
ER
519 return
520 fi
521
e16414d9 522 if is_md "$devpath"; then
df738638 523 find_modules_md "$devpath"
d9179777
ER
524 return
525 fi
526
c3b54060 527 if is_multipath "$devpath"; then
07137fe3 528 if find_modules_multipath "$devpath"; then
9baf4f3f 529 return
9baf4f3f 530 fi
ecd7bf46 531
9baf4f3f
ER
532 # fallback
533 fi
534
36523626 535 if is_dmraid "$devpath"; then
c083ae23
ER
536 if find_modules_dmraid "$devpath"; then
537 return
538 fi
539 # fallback
540 fi
541
35043b20
ER
542 if is_scsi "$devpath"; then
543 find_modules_scsi "$devpath"
d9179777
ER
544 return
545 fi
546
30ca4815 547 if is_ide "$devpath"; then
bc0d6f2d 548 find_modules_ide "$devpath"
d9179777
ER
549 return
550 fi
551
07b09cf9 552 if [[ "$devpath" == /dev/rd/* ]]; then
046c68c9 553 find_module "DAC960"
c3313cd6 554 rootdev_add=/dev/rd/
d9179777
ER
555 return
556 fi
557
07b09cf9 558 if [[ "$devpath" == /dev/ida/* ]]; then
046c68c9 559 find_module "cpqarray"
c3313cd6 560 rootdev_add=/dev/ida/
d9179777
ER
561 return
562 fi
563
08651ad1 564 if [[ "$devpath" == /dev/cciss/* ]]; then
c3313cd6 565 rootdev_add=/dev/cciss/
df11fbe8
ER
566
567 # load hpsa for future kernels, cciss for backwards compat
568 if [ "$kernel_version_long" -ge "003000000" ]; then
569 find_module "hpsa" "-cciss"
649df3de 570 find_modules_scsi "$devpath"
df11fbe8
ER
571 else
572 find_module "cciss"
573 fi
574
d9179777
ER
575 return
576 fi
577
07b09cf9 578 if [[ "$devpath" == /dev/ataraid/* ]]; then
ac085800 579 find_modules_ide
046c68c9 580 find_module "ataraid"
99e7251e 581 ataraidmodules=$(modprobe_conf | awk '/ataraid_hostadapter/ { print $3 }')
9ae446b9 582 if [ -n "$ataraidmodules" ]; then
7c38b114 583 # FIXME: think about modules compiled in kernel
82474db9 584 die "ataraid_hostadapter alias not defined in modprobe.conf! Please set it and run $PROGRAM again."
7c38b114
AF
585 fi
586 for n in $ataraidmodules; do
046c68c9 587 find_module "$n"
7c38b114 588 done
c3313cd6 589 rootdev_add=/dev/ataraid/
d9179777
ER
590 return
591 fi
592
7c38b114 593 # check to see if we need to set up a loopback filesystem
07b09cf9 594 if [[ "$devpath" == /dev/loop* ]]; then
00eaa938 595 die "Sorry, root on loop device isn't supported."
7c38b114
AF
596 # TODO: rewrite for bsp and make nfs ready
597 if [ ! -x /sbin/losetup ]; then
00eaa938 598 die "losetup is missing"
7c38b114 599 fi
bc0d6f2d 600 key="^# $(echo $devpath | awk -F/ '{print($3);}' | tr '[a-z]' '[A-Z]'):"
82474db9 601 if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`"; then
42820142 602 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
603 fi
604
605 line="`awk '/'$key'/ { print $0; }' $fstab`"
606 loopDev="$(echo $line | awk '{print $3}')"
607 loopFs="$(echo $line | awk '{print $4}')"
608 loopFile="$(echo $line | awk '{print $5}')"
609
610 BASICMODULES="$BASICMODULES -loop"
046c68c9 611 find_module "-$loopFs"
7c38b114 612 BASICMODULES="$BASICMODULES -${loopFs}"
d9179777
ER
613 return
614 fi
615
67aa84bd
ER
616 if is_lvm "$devpath"; then
617 find_modules_lvm "$devpath"
d9179777 618 return
7c38b114
AF
619 fi
620}
621
b64f015b 622firmware_install_module() {
c3667d07 623 local module="$1"
c6c6ce01 624 local firmware_files="$2"
9ed6e1db 625
94769f11 626 debug "Adding Firmwares ($firmware_files) to initrd for module $module"
9ed6e1db 627 # firmware not yet installed
9b557a09 628 if [ ! -f "$DESTDIR/lib/firmware/firmware.sh" ]; then
034fdd5d 629 inst_d /lib/firmware
9b557a09 630cat << 'EOF' >> "$DESTDIR/lib/firmware/firmware.sh"
9ed6e1db 631#!/bin/sh -e
8639f99a
AM
632echo 1 > /sys$DEVPATH/loading
633cat "/lib/firmware/$FIRMWARE" > /sys$DEVPATH/data
634echo 0 > /sys$DEVPATH/loading
635exit 0
9ed6e1db 636EOF
9b557a09 637 chmod 755 "$DESTDIR/lib/firmware/firmware.sh"
63cb815e
ER
638
639 # setup firmware loader agent
640 echo "echo -n "/lib/firmware/firmware.sh" > /proc/sys/kernel/hotplug" | add_linuxrc
9ed6e1db
AM
641 fi
642
643 for firmware in $firmware_files; do
80b23733 644 if [ -f "/lib/firmware/$kernel/$firmware" ]; then
486d26a5 645 FIRMWAREDIR=${firmware%/*}
4a9920e7 646 [ "$FIRMWAREDIR" != "$firmware" ] && inst_d /lib/firmware/$FIRMWAREDIR
80b23733
ER
647 inst /lib/firmware/$kernel/$firmware /lib/firmware/$firmware
648 elif [ -f "/lib/firmware/$firmware" ]; then
c661b23c 649 FIRMWAREDIR=${firmware%/*}
650 [ "$FIRMWAREDIR" != "$firmware" ] && inst_d /lib/firmware/$FIRMWAREDIR
80b23733 651 inst /lib/firmware/$firmware /lib/firmware/$firmware
c661b23c 652 else
6652b089 653 warn "Possible missing firmware file /lib/firmware/$firmware or /lib/firmware/$kernel/$firmware for module $module."
4a60c01f 654 fi
9ed6e1db
AM
655 done
656
b64f015b 657 mount_sys
9ed6e1db
AM
658}
659
2a5bcca9 660modules_install() {
c3667d07
ER
661 local modules="$1"
662 local mod
2a5bcca9
AM
663
664 for mod in $modules; do
fe280785 665 MODULEDIR=${mod%/*}
4a9920e7 666 inst_d "/lib/modules/$kernel/$MODULEDIR"
9b557a09
ER
667 cp -a "/lib/modules/$kernel/$mod" "$DESTDIR/lib/modules/$kernel/$mod"
668 gunzip "$DESTDIR/lib/modules/$kernel/$mod" 2> /dev/null
897d14b7 669 if [ "$STRIP" ] && [ -x "$STRIP" ]; then
a6974a17 670 $STRIP -g --remove-section=.comment "$DESTDIR/lib/modules/$kernel/${mod%.gz}"
ccd1f65f 671 fi
2a5bcca9
AM
672 done
673}
674
675modules_add_linuxrc() {
fe280785 676 local mod modpath
ac085800 677
fe280785
ER
678 for mod in "$@"; do
679 # module path without optional compression
680 modpath=${mod%.gz}
681
682 # name of the module
8011a76c
ER
683 local module=${modpath##*/}; module=${module%$modext}
684 local options=$(modprobe_conf | awk -vmodule="$module" '{ if ($1 == "options" && $2 == module) { for(i=3;i<=NF;i++) printf("%s ",$i); }}' | xargs)
685 local genericname=$(echo $module | tr - _)
686 local usleep=$(eval echo \$MODULE_${genericname}_USLEEP)
687 local firmware=$(eval echo \$MODULE_${genericname}_FIRMWARE)
2a5bcca9 688
3e1d0df9
AM
689 if [ "$module" = "scsi_mod" -a "$kernel_version_long" -ge "002006030" ]; then
690 options="scan=sync $options"
691 fi
692
ac085800 693 if [ -n "$verbose" ]; then
8a47b72c
ER
694 s=""
695 if [ "$options" ]; then
696 s="$s with options [$options]"
697 fi
8011a76c
ER
698 if [ "$usleep" ]; then
699 s="$s and $usleep usleep"
8a47b72c 700 fi
4a60c01f 701 debug "Loading module [$module]$s"
ac085800
ER
702 fi
703
8011a76c
ER
704 if [ -n "$firmware" ]; then
705 firmware_install_module "$module" "$firmware"
4a60c01f 706 else
06e481d7
ER
707 for file in $(find_firmware "$module"); do
708 firmware_install_module "$module" "$file"
709 done
9ed6e1db 710 fi
4a60c01f 711
18ece493 712 echo "insmod /lib/modules/$kernel/$modpath $options" | add_linuxrc
8011a76c
ER
713 if [ -n "$usleep" ]; then
714 echo "usleep $usleep" | add_linuxrc
8e598759 715 fi
e00dcfcb 716 if [ "$module" = "scsi_wait_scan" ]; then
d29583e0
ER
717 if [ "$(busybox_applet rmmod 2>/dev/null; echo $?)" = 0 ]; then
718 echo "rmmod scsi_wait_scan" | add_linuxrc
719 fi
e00dcfcb
AM
720 fi
721
2a5bcca9
AM
722 done
723}
724
82b2dba2
ER
725# Generates /dev nodes based on /proc/partitions information.
726# Needs /proc mounted.
727# Can be called multiple times.
728initrd_gen_devices() {
729 if is_yes "$proc_partitions"; then
730 return
731 fi
732 proc_partitions=yes
335cd101 733
82b2dba2
ER
734 mount_dev
735 add_linuxrc <<-'EOF'
736 : 'Making device nodes'
737 cat /proc/partitions | (
8d4aba01 738 # ignore first two lines: header, empty line
82b2dba2 739 read b; read b
2cc3ae8b 740
82b2dba2
ER
741 while read major minor blocks dev rest; do
742 node=/dev/$dev
743 mkdir -p ${node%/*}
8d4aba01 744 [ -e $node ] || mknod $node b $major $minor
82b2dba2
ER
745 done
746 )
747 EOF
748}
bb529f94 749
82b2dba2 750
4828c787 751initrd_gen_setrootdev() {
5a761721 752 debug "Adding rootfs finding based on kernel cmdline root= option support."
71b2d771 753 busybox_applet ls
82b2dba2 754 add_linuxrc <<-'EOF'
dcdf6b49
ER
755 if [ "${ROOT##/dev/}" != "${ROOT}" ]; then
756 rootnr="$(busybox awk -v rootnode="${ROOT##/dev/}" '$4 == rootnode { print 256 * $1 + $2 }' /proc/partitions)"
71b2d771
AM
757 # fallback to ls
758 if [ -z "$rootnr" ]; then
5efa9a2e 759 rootnr="$(busybox ls -lL ${ROOT} | busybox awk '{if (/^b/) { print 256 * $3 + $4; }}')"
71b2d771 760 fi
82b2dba2
ER
761 if [ -n "$rootnr" ]; then
762 echo "$rootnr" > /proc/sys/kernel/real-root-dev
763 fi
764 fi
b64f015b 765 EOF
1606e343
AM
766}
767
4671d086
ER
768initrd_gen_initramfs_switchroot() {
769 inst_d /newroot
770 if [ "$rootdev" = "/dev/nfs" ]; then
771 echo "rootfs on NFS root=/dev/nfs"
772 else
773 [ ! -e "$DESTDIR/$rootdev" ] && inst $rootdev $rootdev
774 fi
5845b321
ER
775
776 # parse 'root=xxx' kernel commandline
4671d086
ER
777 # We support passing root as hda3 /dev/hda3 0303 0x0303 and 303
778 add_linuxrc <<-'EOF'
779 device=/dev/no_partition_found
780 eval "$(busybox awk -v c="$ROOT" '
781 BEGIN {
782 num_pattern_short = "[0-9a-f][0-9a-f][0-9a-f]";
783 num_pattern = "[0-9a-f]" num_pattern_short;
784 dev_pattern = "[hms][a-z][a-z]([0-9])+";
785 partition = "no_partition_found";
786 min = -1; maj = -1;
787
788 sub("^0x", "", c);
789 if (c ~ "^" num_pattern_short "$") sub("^", "0", c);
790 if (c ~ "^" num_pattern "$") {
791 maj = sprintf("%s",substr(c,1,2));
792 min = sprintf("%s",substr(c,3));
793 }
794 if (c ~ "^\/dev\/" dev_pattern "$") sub("^/dev/","", c);
795 if (c ~ "^" dev_pattern "$") partition = c;
796 }
797
afa32d0e
AM
798 $4 == partition { maj = $1; min = $2; }
799 $1 == maj && $2 == min { partition = $4; }
4671d086
ER
800
801 END {
fa3a5452
ER
802 if (maj >= 0 && min >= 0) {
803 printf("device=/dev/%s; maj=%s; min=%s;\n", partition, maj, min);
804 }
4671d086
ER
805 }
806 ' /proc/partitions)"
807 if [ "$device" != '/dev/no_partition_found' -a ! -b $device ]; then
808 mknod $device b $maj $min
809 fi
810 EOF
811
812 add_linuxrc <<-EOF
813 rootdev=$rootdev
814 rootfs=$rootFs
815 EOF
816
817 add_linuxrc <<-'EOF'
818 if [ "$device" = '/dev/no_partition_found' ]; then
819 device=$rootdev
820 fi
821
aebd3ecb 822 [ -n "$ROOTFSFLAGS" ] && ROOTFSFLAGS="-o $ROOTFSFLAGS"
41d3645c 823
aebd3ecb 824 mount -t $rootfs -r $device $ROOTFSFLAGS /newroot || echo "Mount of rootfs failed."
4671d086
ER
825 init="$(echo "$CMDLINE" | busybox awk '/init=\// { gsub(/.*init=/,NIL,$0); gsub(/ .*/,NIL,$0); print }')"
826 if [ -z "$init" -o ! -x "/newroot$init" ]; then
827 init=/sbin/init
828 fi
829 EOF
830
831 umount_all
832 busybox_applet switch_root
833 add_linuxrc <<-'EOF'
278e5013 834 [ ! -e /newroot/dev/console ] && mknod -m 660 /newroot/dev/console c 5 1
f8ea6a63 835 exec switch_root /newroot $init ${1:+"$@"}
4671d086
ER
836
837 echo "Error! initramfs should not reach this place."
838 echo "It probably means you've got old version of busybox, with broken"
839 echo "initramfs support. Trying to boot anyway, but won't promise anything."
840
f8ea6a63 841 exec chroot /newroot $init ${1:+"$@"}
4671d086
ER
842
843 echo "Failed to chroot!"
b61aa273 844 debugshell
4671d086
ER
845 EOF
846 # we need /init being real file, not symlink, otherwise the initramfs will
847 # not be ran by pid 1 which is required for switch_root
848 mv $DESTDIR/linuxrc $DESTDIR/init
849 ln -s init $DESTDIR/linuxrc
850}
851
c552503c
ER
852# find if $symbol exists in System.map $mapfile
853sym_exists() {
854 local mapfile="$1"
855 local symbol="$2"
856 if [ ! -f $mapfile ]; then
857 # missing mapfile (not a pld kernel?)
858 return 1
859 fi
860
861 awk -vc=1 -vsymbol="$symbol" '$2 == "T" && $3 == symbol {c = 0} END {exit c}' $mapfile
862}
863
864# find best compressor (or forced one) for initrd
865find_compressor() {
866 local mode="$1"
1b89c904
AM
867 # fastest initrd decompression speed is first
868 local compressors='lzo gzip xz lzma bzip2'
c552503c
ER
869
870 # a specified one, take it
55aaf2fe
AM
871 if ! is_yes "$mode"; then
872 compressors="$mode"
c552503c
ER
873 fi
874
875 debug "finding compressor: $compressors (via $mode)"
876 # check for compressor validity
877 local c prog map=/boot/System.map-$kernel
878 for c in $compressors; do
879 case $c in
66d146a5 880 xz)
29f7d622
AM
881 sym=unxz
882 prog=/usr/bin/xz
883 ;;
884 lzma)
c552503c 885 sym=unlzma
66d146a5 886 prog=/usr/bin/xz
c552503c
ER
887 ;;
888 bzip2)
889 sym=bzip2
c42692d4 890 prog=/usr/bin/bzip2
c552503c
ER
891 ;;
892 gzip)
893 sym=gunzip
c42692d4 894 prog=/bin/gzip
c552503c 895 ;;
8a6f083b
AM
896 lzo)
897 sym=unlzo
898 prog=/usr/bin/lzop
899 ;;
5fcc3d04
AM
900 none|no)
901 # any existing sym will work
902 sym=initrd_load
903 prog=/bin/cat
904 ;;
c552503c
ER
905 *)
906 die "Unknown compressor $c"
907 ;;
908 esac
c454c66e 909 if sym_exists $map $sym && [ -x $prog ]; then
c552503c
ER
910 echo $c
911 return
912 fi
913 done
914
915 debug "using gzip for compressor (fallback)"
916 echo gzip
917}
918
97f51b6e
ER
919# compresses kernel image image
920# in function so we could retry with other compressor on failure
921compress_image() {
922 local compressor="$1" IMAGE="$2" target="$3" tmp
923 tmp=$(mktemp "$target".XXXXXX) || die "mktemp failed"
924
925 case "$compressor" in
926 xz)
927 # don't use -9 here since kernel won't understand it
928 xz --format=xz --check=crc32 --lzma2=preset=6e,dict=1MiB < "$IMAGE" > "$tmp" || return $?
929 ;;
930 lzma)
931 xz --format=lzma -9 < "$IMAGE" > "$tmp" || return $?
932 ;;
933 bzip2)
934 bzip2 -9 < "$IMAGE" > "$tmp" || return $?
935 ;;
936 gzip)
937 gzip -9 < "$IMAGE" > "$tmp" || return $?
938 ;;
8a6f083b
AM
939 lzo)
940 lzop -9 < "$IMAGE" > "$tmp" || return $?
941 ;;
5fcc3d04
AM
942 none|no)
943 cat < "$IMAGE" > "$tmp" || return $?
944 ;;
97f51b6e
ER
945 esac
946
947 mv -f "$tmp" "$target"
948}
949
82b2dba2
ER
950if [ -r /etc/sysconfig/geninitrd ]; then
951 . /etc/sysconfig/geninitrd
952fi
2cc3ae8b 953
c215292c
AG
954if [ ! -f /proc/mounts ]; then
955 warn "/proc filesystem not mounted, may cause wrong results or failure."
956fi
957
cefcd7bb 958geninitrd_load_mods ide luks multipath dmraid lvm md blkid udev tuxonice suspend fbsplash condecor bootsplash uvesafb nfs sata scsi usbkbd
c124d0cf 959
82b2dba2
ER
960while [ $# -gt 0 ]; do
961 case $1 in
962 --fstab=*)
963 fstab=${1#--fstab=}
964 ;;
965 --fstab)
966 fstab=$2
967 shift
968 ;;
969 --modules-conf=*)
970 modulefile=${1#--modules-conf=}
971 ;;
972 --modules-conf)
973 modulefile=$2
974 shift
975 ;;
82b2dba2
ER
976 --with-bootsplash)
977 BOOT_SPLASH=yes
978 ;;
979 --without-bootsplash)
980 BOOT_SPLASH=no
981 ;;
982 --with-fbsplash)
983 FB_SPLASH=yes
984 ;;
985 --without-fbsplash)
986 FB_SPLASH=no
987 ;;
6c69a2d4
ER
988 --with-fbcondecor)
989 FB_CON_DECOR=yes
990 ;;
991 --without-fbcondecor)
992 FB_CON_DECOR=no
993 ;;
82b2dba2
ER
994 --with-suspend)
995 USE_SUSPEND=yes
996 ;;
997 --without-suspend)
998 USE_SUSPEND=no
999 ;;
1000 --with-suspend2 | --with-tuxonice)
1001 USE_TUXONICE=yes
1002 ;;
1003 --without-suspend2 | --without-tuxonice)
1004 USE_TUXONICE=no
1005 ;;
80b1ed79 1006 --lvmversion=*)
7308edee 1007 LVMTOOLSVERSION=${1#--lvmversion=}
82b2dba2 1008 ;;
80b1ed79 1009 --lvmtoolsversion=*)
1010 LVMTOOLSVERSION=${1#--lvmtoolsversion=}
1011 ;;
82b2dba2
ER
1012 --lvmtoolsversion|--lvmversion)
1013 LVMTOOLSVERSION=$2
1014 shift
1015 ;;
1016 --without-udev)
1017 USE_UDEV=no
1018 ;;
1019 --with-udev)
1020 USE_UDEV=yes
1021 ;;
1022 --without-dmraid)
1023 USE_DMRAID=no
1024 ;;
1025 --without-multipath)
ecd7bf46
ER
1026 USE_MULTIPATH=no
1027 ;;
1028 --with-multipath=*)
1029 USE_MULTIPATH=${1#--with-multipath=}
82b2dba2 1030 ;;
af075488 1031 --without-blkid)
1032 USE_BLKID=no
289fbc9b 1033 ;;
3ef3d717
ER
1034 --without-luks)
1035 USE_LUKS=no
1036 ;;
82b2dba2
ER
1037 --with=*)
1038 BASICMODULES="$BASICMODULES ${1#--with=}"
1039 ;;
1040 --with)
1041 BASICMODULES="$BASICMODULES $2"
1042 shift
1043 ;;
1044 --version)
1045 echo "$PROGRAM: version $VERSION"
1046 exit 0
1047 ;;
1048 -v)
1049 verbose=-v
1050 ;;
c552503c
ER
1051 --compress)
1052 COMPRESS=$2
1053 ;;
1054 --compress=*)
1055 COMPRESS="${1#--compress=}"
1056 ;;
82b2dba2
ER
1057 --nocompress)
1058 COMPRESS=no
1059 ;;
ccd1f65f 1060 --nostrip)
76a48507
ER
1061 STRIP=
1062 ;;
1063 --strip=*)
1064 STRIP="${1#--strip=}"
1065 ;;
1066 --strip)
1067 STRIP=$2
1068 shift
ccd1f65f 1069 ;;
82b2dba2
ER
1070 --ifneeded)
1071 ifneeded=1
1072 ;;
1073 -f)
1074 force=1
1075 ;;
1076 --preload=*)
1077 PREMODS="$PREMODS ${1#--preload=}"
1078 ;;
1079 --preload)
1080 PREMODS="$PREMODS $2"
1081 shift
1082 ;;
2965cab9 1083 --fs=* | --fs)
bbbc32d0 1084 die "--fs option is obsoleted. Use --initrdfs instead"
82b2dba2
ER
1085 ;;
1086 --initrdfs=*)
1087 INITRDFS=${1#--initrdfs=}
1088 ;;
1089 --initrdfs)
1090 INITRDFS=$2
1091 shift
1092 ;;
1093 --image-version)
1094 img_vers=yes
1095 ;;
1096 --ide-only-root)
1097 ide_only_root="yes"
1098 ;;
1099 *)
1100 if [ -z "$target" ]; then
1101 target="$1"
1102 elif [ -z "$kernel" ]; then
1103 kernel="$1"
1104 else
7f6e5359 1105 usage
36523626 1106 exit 1
82b2dba2
ER
1107 fi
1108 ;;
1109 esac
f5db170b 1110
82b2dba2
ER
1111 shift
1112done
1113
1114if [ -z "$target" -o -z "$kernel" ]; then
7f6e5359 1115 usage
36523626 1116 exit 1
82b2dba2
ER
1117fi
1118
93a38d1a
ER
1119# main()
1120if [ "$(id -u)" != 0 ]; then
1121 die "You need to be root to generate initrd"
1122fi
1123
a48c38c7 1124if [ -d /lib64 -a -d /usr/lib64 ]; then
c124d0cf
ER
1125 _lib=lib64
1126else
1127 _lib=lib
130aadc1
ER
1128fi
1129
c124d0cf 1130initrd_dir=/usr/$_lib/initrd
e4487862
AM
1131kernel_version=$(echo "$kernel" | awk -F. '{gsub(/[_-].*/, "", $0); print sprintf("%03d%03d",$1,$2)}')
1132kernel_version_long=$(echo "$kernel" | awk -F. '{gsub(/[_-].*/, "", $0); print sprintf("%03d%03d%03d",$1,$2,$3)}')
82b2dba2 1133
96fbf9e6 1134debug "# $GENINITRD_RCSID (geninitrd)"
c124d0cf
ER
1135debug "Using _lib: $_lib"
1136debug "Using initrd_dir: $initrd_dir"
1137
6ec4aea6 1138busybox=$(find_tool $initrd_dir/busybox $initrd_dir/initrd-busybox /bin/initrd-busybox) || die "Couldn't find busybox suitable for initrd"
c124d0cf
ER
1139
1140# we setup mods after parsing command line args
1141geninitrd_setup_mods
1142
1143if [ ! -f /boot/vmlinuz-"$kernel" ]; then
1144 warn "/boot/vmlinuz-$kernel doesn't exist, is your /boot mounted?"
1145fi
1146
82b2dba2 1147if [ -z "$INITRDFS" ]; then
bbbc32d0
ER
1148 if [ -n "$FS" ]; then
1149 # FS= can came only via /etc/sysconfig/geninitrd likely?
1150 die "FS configuration option is obsoleted. Use INITRDFS instead"
f5db170b 1151 fi
f5db170b 1152
bbbc32d0
ER
1153 # default value
1154 if [ "$kernel_version" -ge "002005" ]; then
1155 INITRDFS="initramfs"
1156 else
1157 INITRDFS="rom"
1158 fi
82b2dba2 1159fi
966c32cc 1160
82b2dba2 1161case "$INITRDFS" in
4877276e
ER
1162 ext2)
1163 [ -x /sbin/mke2fs ] || die "/sbin/mke2fs is missing"
1164 ;;
1165 rom|romfs)
1166 [ -x /sbin/genromfs ] || die "/sbin/genromfs is missing"
1167 ;;
1168 cram|cramfs)
1169 [ -x /sbin/mkcramfs ] || die "/sbin/mkcramfs is missing"
1170 ;;
1171 initramfs)
1172 [ -x /bin/cpio ] || die "/bin/cpio is missing"
1173 [ -x /usr/bin/find ] || die "/usr/bin/find is missing"
1174 ;;
1175 *)
1176 die "Filesystem $INITRDFS on initrd is not supported"
1177 ;;
82b2dba2 1178esac
f5db170b 1179
9323ada3 1180if [ -L "$target" ]; then
1181 target=$(readlink -f "$target")
1182fi
1183
82b2dba2
ER
1184if [ -n "$img_vers" ]; then
1185 target="$target-$kernel"
1186fi
8bd582f1 1187
82b2dba2
ER
1188if [ -z "$force" -a -f "$target" ]; then
1189 die "$target already exists."
1190fi
c6c6ce01 1191
82b2dba2
ER
1192if [ ! -d "/lib/modules/$kernel" ]; then
1193 die "/lib/modules/$kernel is not a directory."
1194fi
2ffb1734 1195
bbbc32d0
ER
1196if [ "$kernel_version" -ge "002005" ]; then
1197 modext=".ko"
1198fi
1199
82b2dba2
ER
1200cache_modprobe_conf
1201
1202for n in $PREMODS; do
046c68c9 1203 find_module "$n"
82b2dba2
ER
1204done
1205
ed30e3a8 1206if [ "$FBMODULE" ]; then
046c68c9 1207 find_module "$FBMODULE"
ed30e3a8
ER
1208fi
1209
cefcd7bb
AM
1210# autodetect USB keyboards
1211find_modules_usbkbd
1212
82b2dba2 1213# allow forcing loading SCSI and/or IDE modules
35043b20 1214# XXX: where ADDSCSI cames from? drop?
82b2dba2
ER
1215if is_yes "$ADDSCSI"; then
1216 find_modules_scsi
1217fi
1218
3f53322c 1219# autodetect SATA modules
1220find_modules_sata
e2d6ca6c 1221
35043b20 1222# XXX: where ADDIDE cames from? drop?
82b2dba2
ER
1223if is_yes "$ADDIDE"; then
1224 find_modules_ide
1225fi
1226
4c16dac4
ER
1227if is_yes "$USE_SUSPEND"; then
1228 find_modules_suspend
1229fi
1230
82b2dba2
ER
1231find_root "$fstab" || exit
1232debug "Using $rootdev as device for rootfs"
1233
d8056591 1234find_modules_for_devpath "$rootdev"
ac085800 1235
ecd7bf46
ER
1236# if USE_MULTIPATH is path to device, scan that too
1237# this is to bootstrap multipath setup into initrd.
1238if ! is_no "$USE_MULTIPATH" && ! is_yes "$USE_MULTIPATH"; then
1239 find_modules_multipath $USE_MULTIPATH
1240fi
1241
046c68c9 1242find_module "-$rootFs"
ac085800 1243
82b2dba2 1244for n in $BASICMODULES; do
046c68c9 1245 find_module "$n"
82b2dba2 1246done
4e9eb79c 1247
82b2dba2 1248if is_yes "$USE_TUXONICE"; then
046c68c9 1249 find_module "-lzf"
82b2dba2 1250fi
33d24e12 1251
bf6d9c64 1252find_modules_fbsplash
2968c9dd 1253
82b2dba2
ER
1254if [ -n "$ifneeded" -a -z "$MODULES" ]; then
1255 debug "No modules are needed -- not building initrd image."
1256 exit 0
1257fi
c6c6ce01 1258
6fc274fb 1259debug "Building initrd..."
d8056591 1260DESTDIR=$(mktemp -d -t initrd.XXXXXX) || die "mktemp failed"
9b557a09 1261RCFILE="$DESTDIR/linuxrc"
82b2dba2
ER
1262> "$RCFILE"
1263chmod a+rx "$RCFILE"
9b557a09 1264ln -s linuxrc $DESTDIR/init
e8d178ff 1265
82b2dba2 1266# create dirs that we really need
d63131e0 1267inst_d /{lib,bin,etc,dev{,/pts,/shm},loopfs,var,proc,run,sys}
e8d178ff 1268
82b2dba2 1269modules_install "$MODULES"
b64f015b 1270
82b2dba2
ER
1271# mknod'ing the devices instead of copying them works both with and
1272# without devfs...
9b557a09
ER
1273mknod "$DESTDIR/dev/console" c 5 1
1274mknod "$DESTDIR/dev/null" c 1 3
1275mknod "$DESTDIR/dev/zero" c 1 5
8aa2b6bd 1276mknod "$DESTDIR/dev/random" c 1 8
94dce45c 1277mknod "$DESTDIR/dev/urandom" c 1 9
be2f3ecc 1278
6ec4aea6
JR
1279inst_exec $busybox /bin/busybox
1280ln -s busybox $DESTDIR/bin/sh
1281# for older busyboxes who had /bin/initrd-busybox as EXEPATH
1282ln -s busybox $DESTDIR/bin/initrd-busybox
2ffb1734 1283
82b2dba2
ER
1284add_linuxrc <<EOF
1285#!/bin/sh
1286# initrd generated by:
96fbf9e6 1287# $GENINITRD_RCSID
c6c6ce01 1288
82b2dba2
ER
1289EOF
1290mount_proc
1291add_linuxrc <<-'EOF'
48d98595 1292 read CMDLINE < /proc/cmdline
c6c6ce01 1293
82b2dba2
ER
1294 for arg in $CMDLINE; do
1295 if [ "${arg}" = "debuginitrd" ]; then
1296 DEBUGINITRD=yes
1297 fi
1298 if [ "${arg##debuginitrd=}" != "${arg}" ]; then
1299 DEBUGINITRD=${arg##debuginitrd=}
1300 fi
fc787d45 1301 if [ "${arg##root=}" != "${arg}" ]; then
1302 ROOT=${arg##root=}
1303 fi
41d3645c
AM
1304 if [ "${arg##rootfsflags=}" != "${arg}" ]; then
1305 ROOTFSFLAGS=${arg##rootfsflags=}
1306 fi
82b2dba2 1307 done
c6c6ce01 1308
82b2dba2
ER
1309 # make debugshell() invoke subshell if $DEBUGINITRD=sh
1310 if [ "$DEBUGINITRD" = "sh" ]; then
1311 debugshell() {
e2405b29
AM
1312EOF
1313if is_yes "$RUN_SULOGIN_ON_ERR"; then
1314add_linuxrc <<-'EOF'
1315 echo "debug shell disabled by /etc/sysconfig/system:RUN_SULOGIN_ON_ERR setting"
1316EOF
1317else
1318add_linuxrc <<-'EOF'
1319 sh
1320EOF
1321fi
1322add_linuxrc <<-'EOF'
82b2dba2
ER
1323 }
1324 else
1325 debugshell() {
1326 :
1327 }
1328 fi
e934d044 1329
82b2dba2
ER
1330 if [ "$DEBUGINITRD" ]; then
1331 set -x
cff3058d 1332 fi
82b2dba2 1333EOF
2df2e995 1334
fe280785 1335modules_add_linuxrc $MODULES
82b2dba2
ER
1336
1337# TODO: rewrite for busybox
1338#if [ -n "$loopDev" ]; then
1339# if [ ! -d /initrd ]; then
1340# mkdir /initrd
1341# fi
1342#
9b557a09
ER
1343# cp -a "$loopDev" "$DESTDIR/dev"
1344# cp -a "$rootdev" "$DESTDIR/dev"
82b2dba2
ER
1345# echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE"
1346# echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE"
1347# echo "echo Setting up loopback device $rootdev" >> $RCFILE
1348# echo "losetup $rootdev /loopfs$loopFile" >> "$RCFILE"
1349#fi
2b1a3707 1350
1606e343
AM
1351if is_yes "$USE_UDEV"; then
1352 initrd_gen_udev
1353fi
1354
3dd50160
ER
1355find_modules_uvesafb
1356initrd_gen_uvesafb
43258faf 1357
1b481849
ER
1358initrd_gen_luks
1359initrd_gen_dmraid
1360initrd_gen_multipath
1361initrd_gen_blkid
289fbc9b 1362
69b1e935 1363if is_yes "$have_nfs"; then
2df2e995 1364 initrd_gen_nfs
1b481849
ER
1365else
1366 initrd_gen_md
1367 initrd_gen_lvm
1368 initrd_gen_luks
4828c787 1369 initrd_gen_setrootdev
7c38b114
AF
1370fi
1371
1b481849
ER
1372initrd_gen_tuxonice
1373initrd_gen_suspend
4c16dac4 1374
5101a385 1375# additional devs always needed
9b557a09 1376[ ! -e "$DESTDIR/$rootdev_add" ] && inst $rootdev_add /dev
5101a385 1377
1b481849 1378initrd_gen_stop_udevd
6fadace4 1379initrd_gen_stop_uvesafb
82de999f 1380
f8f9e56d 1381if [ "$INITRDFS" = "initramfs" ]; then
4671d086 1382 initrd_gen_initramfs_switchroot
b64f015b 1383else
b64f015b 1384 umount_all
f8f9e56d
AM
1385fi
1386
1b481849
ER
1387initrd_gen_fbsplash
1388initrd_gen_fbcondecor
6c69a2d4 1389
d8056591 1390IMAGE=$(mktemp -t initrd.img-XXXXXX) || die "mktemp failed"
51dc1fe6 1391
5c7359e3
ER
1392IMAGESIZE=$(du -ks $DESTDIR | awk '{print int(($1+1023+512)/1024)*1024}')
1393debug "image size: $IMAGESIZE KiB ($DESTDIR)"
1394
51dc1fe6 1395debug "Creating $INITRDFS image $IMAGE"
2ad94d8a 1396case "$INITRDFS" in
4877276e 1397 ext2)
4877276e 1398 dd if=/dev/zero of="$IMAGE" bs=1k count="$IMAGESIZE" 2> /dev/null
c091a192
ER
1399 # NOTE: ext2 label is max 16 chars
1400 mke2fs -q -F -b 1024 -m 0 -L "PLD/$kernel" "$IMAGE" 2>/dev/null 1>&2
4877276e
ER
1401 tune2fs -i 0 "$IMAGE" >/dev/null 2>&1
1402
1403 local tmpmnt=$(mktemp -d -t initrd.mnt-XXXXXX)
1404 debug "Mounting ext2 image $IMAGE to $tmpmnt"
5c7359e3 1405 mount -o loop -t ext2 "$IMAGE" "$tmpmnt" || die "mount failed, check dmesg(1)"
4877276e
ER
1406 # We don't need this directory, so let's save space
1407 rm -rf "$tmpmnt"/lost+found
1408
1409 debug "Copy recursively $DESTDIR -> $tmpmnt"
1410 cp -a $DESTDIR/* $tmpmnt
1411 umount "$IMAGE"
1412 rmdir "$tmpmnt"
1413
1414 ;;
1415 rom|romfs)
c091a192 1416 genromfs -f "$IMAGE" -d "$DESTDIR" -V "PLD Linux/$kernel (geninitrd/$VERSION)"
4877276e
ER
1417 ;;
1418 cram|cramfs)
1419 mkcramfs "$DESTDIR" "$IMAGE"
1420 ;;
1421 initramfs)
1422 (cd $DESTDIR; find . | cpio --quiet -H newc -o > "$IMAGE")
1423 ;;
1424 *)
93a38d1a 1425 die "Filesystem $INITRDFS not supported by $PROGRAM"
c31050f3 1426esac
bb529f94 1427
755e5cdc 1428CONFIG_BLK_DEV_RAM_SIZE=$(ikconfig | awk -F= '/^CONFIG_BLK_DEV_RAM_SIZE/{print $2}')
25cb53df
ER
1429if [ -z "$CONFIG_BLK_DEV_RAM_SIZE" ]; then
1430 CONFIG_BLK_DEV_RAM_SIZE=4096
3fbd853a 1431 warn "No CONFIG_BLK_DEV_RAM_SIZE detected, fallback to $CONFIG_BLK_DEV_RAM_SIZE"
25cb53df 1432fi
e3bc44e2 1433
e3bc44e2
ER
1434if [ "$IMAGESIZE" -gt $CONFIG_BLK_DEV_RAM_SIZE ]; then
1435 warn "Your image size is larger than $CONFIG_BLK_DEV_RAM_SIZE, Be sure to boot kernel with ramdisk_size=$IMAGESIZE!"
1436fi
1437
c552503c 1438if ! is_no "$COMPRESS"; then
c552503c
ER
1439 compressor=$(find_compressor "$COMPRESS")
1440 debug "Compressing $target with $compressor"
1441
1442 # TODO: the image name (specified from kernel.spec) already contains
1443 # extension, which is .gz most of the time.
97f51b6e
ER
1444 compress_image "$compressor" "$IMAGE" "$target" || {
1445 if [ $compressor != gzip ]; then
1446 warn "Could not compress with $compressor, retrying with gzip"
1447 compress_image gzip "$IMAGE" "$target" || die "compress failed with gzip" $?
1448 else
1449 die "Could not compress image with $compressor"
1450 fi
1451 }
bb529f94 1452else
7d2fc5eb 1453 cp -a "$IMAGE" "$target"
bb529f94 1454fi
5b71959c 1455
7992356a 1456# XXX. check if bootsplash can output data to tmp dir not directly to initramfs image.
1b481849 1457initrd_gen_bootsplash "$target"
5b71959c 1458
d8056591 1459rm -rf "$DESTDIR" "$IMAGE"
ac085800
ER
1460
1461# vim:ts=4:sw=4:noet:fdm=marker
This page took 0.431916 seconds and 4 git commands to generate.