]> git.pld-linux.org Git - projects/geninitrd.git/blame - geninitrd
Really take specified compressor.
[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]"
c552503c 50 echo " [--compress=yes|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() {
237 local err=0
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
615 module=${modpath##*/}
616 module=${module%$modext}
617
618 options=$(modprobe_conf | awk -vmodule="$module" '{ if ($1 == "options" && $2 == module) { for(i=3;i<=NF;i++) printf("%s ",$i); }}' | xargs)
ffa1b198 619
fe280785
ER
620 generic_module=$(echo $module | tr - _)
621 sleep_var=$(eval echo \$MODULE_${generic_module}_USLEEP)
622 firmware_var=$(eval echo \$MODULE_${generic_module}_FIRMWARE)
2a5bcca9 623
ac085800 624 if [ -n "$verbose" ]; then
8a47b72c
ER
625 s=""
626 if [ "$options" ]; then
627 s="$s with options [$options]"
628 fi
629 if [ "$sleep_var" ]; then
630 s="$s and $sleep_var usleep"
631 fi
4a60c01f 632 debug "Loading module [$module]$s"
ac085800
ER
633 fi
634
9ed6e1db 635 if [ -n "$firmware_var" ]; then
d814e616 636 firmware_install_module "$module" "$firmware_var"
4a60c01f
AM
637 else
638 firmware_files=$(find_firmware "$module")
639 if [ -n "$firmware_files" ]; then
640 for file in $firmware_files; do
641 firmware_install_module "$module" "$file"
642 done
643 fi
9ed6e1db 644 fi
4a60c01f 645
18ece493 646 echo "insmod /lib/modules/$kernel/$modpath $options" | add_linuxrc
fe280785 647 if [ -n "$sleep_var" ]; then
c6c6ce01 648 echo "usleep $sleep_var" | add_linuxrc
8e598759 649 fi
2a5bcca9
AM
650 done
651}
652
82b2dba2
ER
653# Generates /dev nodes based on /proc/partitions information.
654# Needs /proc mounted.
655# Can be called multiple times.
656initrd_gen_devices() {
657 if is_yes "$proc_partitions"; then
658 return
659 fi
660 proc_partitions=yes
335cd101 661
82b2dba2
ER
662 mount_dev
663 add_linuxrc <<-'EOF'
664 : 'Making device nodes'
665 cat /proc/partitions | (
8d4aba01 666 # ignore first two lines: header, empty line
82b2dba2 667 read b; read b
2cc3ae8b 668
82b2dba2
ER
669 while read major minor blocks dev rest; do
670 node=/dev/$dev
671 mkdir -p ${node%/*}
8d4aba01 672 [ -e $node ] || mknod $node b $major $minor
82b2dba2
ER
673 done
674 )
675 EOF
676}
bb529f94 677
82b2dba2 678
4828c787 679initrd_gen_setrootdev() {
5a761721 680 debug "Adding rootfs finding based on kernel cmdline root= option support."
82b2dba2 681 add_linuxrc <<-'EOF'
dcdf6b49
ER
682 if [ "${ROOT##/dev/}" != "${ROOT}" ]; then
683 rootnr="$(busybox awk -v rootnode="${ROOT##/dev/}" '$4 == rootnode { print 256 * $1 + $2 }' /proc/partitions)"
82b2dba2
ER
684 if [ -n "$rootnr" ]; then
685 echo "$rootnr" > /proc/sys/kernel/real-root-dev
686 fi
687 fi
b64f015b 688 EOF
1606e343
AM
689}
690
4671d086
ER
691initrd_gen_initramfs_switchroot() {
692 inst_d /newroot
693 if [ "$rootdev" = "/dev/nfs" ]; then
694 echo "rootfs on NFS root=/dev/nfs"
695 else
696 [ ! -e "$DESTDIR/$rootdev" ] && inst $rootdev $rootdev
697 fi
5845b321
ER
698
699 # parse 'root=xxx' kernel commandline
4671d086
ER
700 # We support passing root as hda3 /dev/hda3 0303 0x0303 and 303
701 add_linuxrc <<-'EOF'
702 device=/dev/no_partition_found
703 eval "$(busybox awk -v c="$ROOT" '
704 BEGIN {
705 num_pattern_short = "[0-9a-f][0-9a-f][0-9a-f]";
706 num_pattern = "[0-9a-f]" num_pattern_short;
707 dev_pattern = "[hms][a-z][a-z]([0-9])+";
708 partition = "no_partition_found";
709 min = -1; maj = -1;
710
711 sub("^0x", "", c);
712 if (c ~ "^" num_pattern_short "$") sub("^", "0", c);
713 if (c ~ "^" num_pattern "$") {
714 maj = sprintf("%s",substr(c,1,2));
715 min = sprintf("%s",substr(c,3));
716 }
717 if (c ~ "^\/dev\/" dev_pattern "$") sub("^/dev/","", c);
718 if (c ~ "^" dev_pattern "$") partition = c;
719 }
720
721 $4 ~ partition { maj = $1; min = $2; }
722 $1 ~ maj && $2 ~ min { partition = $4; }
723
724 END {
fa3a5452
ER
725 if (maj >= 0 && min >= 0) {
726 printf("device=/dev/%s; maj=%s; min=%s;\n", partition, maj, min);
727 }
4671d086
ER
728 }
729 ' /proc/partitions)"
730 if [ "$device" != '/dev/no_partition_found' -a ! -b $device ]; then
731 mknod $device b $maj $min
732 fi
733 EOF
734
735 add_linuxrc <<-EOF
736 rootdev=$rootdev
737 rootfs=$rootFs
738 EOF
739
740 add_linuxrc <<-'EOF'
741 if [ "$device" = '/dev/no_partition_found' ]; then
742 device=$rootdev
743 fi
744
745 mount -t $rootfs -r $device /newroot
746 init="$(echo "$CMDLINE" | busybox awk '/init=\// { gsub(/.*init=/,NIL,$0); gsub(/ .*/,NIL,$0); print }')"
747 if [ -z "$init" -o ! -x "/newroot$init" ]; then
748 init=/sbin/init
749 fi
750 EOF
751
752 umount_all
753 busybox_applet switch_root
754 add_linuxrc <<-'EOF'
f8ea6a63 755 exec switch_root /newroot $init ${1:+"$@"}
4671d086
ER
756
757 echo "Error! initramfs should not reach this place."
758 echo "It probably means you've got old version of busybox, with broken"
759 echo "initramfs support. Trying to boot anyway, but won't promise anything."
760
f8ea6a63 761 exec chroot /newroot $init ${1:+"$@"}
4671d086
ER
762
763 echo "Failed to chroot!"
764 EOF
765 # we need /init being real file, not symlink, otherwise the initramfs will
766 # not be ran by pid 1 which is required for switch_root
767 mv $DESTDIR/linuxrc $DESTDIR/init
768 ln -s init $DESTDIR/linuxrc
769}
770
c552503c
ER
771# find if $symbol exists in System.map $mapfile
772sym_exists() {
773 local mapfile="$1"
774 local symbol="$2"
775 if [ ! -f $mapfile ]; then
776 # missing mapfile (not a pld kernel?)
777 return 1
778 fi
779
780 awk -vc=1 -vsymbol="$symbol" '$2 == "T" && $3 == symbol {c = 0} END {exit c}' $mapfile
781}
782
783# find best compressor (or forced one) for initrd
784find_compressor() {
785 local mode="$1"
786 # the best compressor list
787 local compressors='lzma bzip2 gzip'
788
789 # a specified one, take it
55aaf2fe
AM
790 if ! is_yes "$mode"; then
791 compressors="$mode"
c552503c
ER
792 fi
793
794 debug "finding compressor: $compressors (via $mode)"
795 # check for compressor validity
796 local c prog map=/boot/System.map-$kernel
797 for c in $compressors; do
798 case $c in
799 lzma)
800 sym=unlzma
c42692d4 801 prog=/usr/bin/lzma
c552503c
ER
802 ;;
803 bzip2)
804 sym=bzip2
c42692d4 805 prog=/usr/bin/bzip2
c552503c
ER
806 ;;
807 gzip)
808 sym=gunzip
c42692d4 809 prog=/bin/gzip
c552503c
ER
810 ;;
811 *)
812 die "Unknown compressor $c"
813 ;;
814 esac
c454c66e 815 if sym_exists $map $sym && [ -x $prog ]; then
c552503c
ER
816 echo $c
817 return
818 fi
819 done
820
821 debug "using gzip for compressor (fallback)"
822 echo gzip
823}
824
82b2dba2
ER
825if [ -r /etc/sysconfig/geninitrd ]; then
826 . /etc/sysconfig/geninitrd
827fi
2cc3ae8b 828
c215292c
AG
829if [ ! -f /proc/mounts ]; then
830 warn "/proc filesystem not mounted, may cause wrong results or failure."
831fi
832
35043b20 833geninitrd_load_mods ide luks multipath dmraid lvm md blkid udev tuxonice suspend fbsplash condecor bootsplash uvesafb nfs scsi
c124d0cf 834
82b2dba2
ER
835while [ $# -gt 0 ]; do
836 case $1 in
837 --fstab=*)
838 fstab=${1#--fstab=}
839 ;;
840 --fstab)
841 fstab=$2
842 shift
843 ;;
844 --modules-conf=*)
845 modulefile=${1#--modules-conf=}
846 ;;
847 --modules-conf)
848 modulefile=$2
849 shift
850 ;;
82b2dba2
ER
851 --with-bootsplash)
852 BOOT_SPLASH=yes
853 ;;
854 --without-bootsplash)
855 BOOT_SPLASH=no
856 ;;
857 --with-fbsplash)
858 FB_SPLASH=yes
859 ;;
860 --without-fbsplash)
861 FB_SPLASH=no
862 ;;
6c69a2d4
ER
863 --with-fbcondecor)
864 FB_CON_DECOR=yes
865 ;;
866 --without-fbcondecor)
867 FB_CON_DECOR=no
868 ;;
82b2dba2
ER
869 --with-suspend)
870 USE_SUSPEND=yes
871 ;;
872 --without-suspend)
873 USE_SUSPEND=no
874 ;;
875 --with-suspend2 | --with-tuxonice)
876 USE_TUXONICE=yes
877 ;;
878 --without-suspend2 | --without-tuxonice)
879 USE_TUXONICE=no
880 ;;
80b1ed79 881 --lvmversion=*)
7308edee 882 LVMTOOLSVERSION=${1#--lvmversion=}
82b2dba2 883 ;;
80b1ed79 884 --lvmtoolsversion=*)
885 LVMTOOLSVERSION=${1#--lvmtoolsversion=}
886 ;;
82b2dba2
ER
887 --lvmtoolsversion|--lvmversion)
888 LVMTOOLSVERSION=$2
889 shift
890 ;;
891 --without-udev)
892 USE_UDEV=no
893 ;;
894 --with-udev)
895 USE_UDEV=yes
896 ;;
897 --without-dmraid)
898 USE_DMRAID=no
899 ;;
900 --without-multipath)
ecd7bf46
ER
901 USE_MULTIPATH=no
902 ;;
903 --with-multipath=*)
904 USE_MULTIPATH=${1#--with-multipath=}
82b2dba2 905 ;;
af075488 906 --without-blkid)
907 USE_BLKID=no
289fbc9b 908 ;;
3ef3d717
ER
909 --without-luks)
910 USE_LUKS=no
911 ;;
82b2dba2
ER
912 --with=*)
913 BASICMODULES="$BASICMODULES ${1#--with=}"
914 ;;
915 --with)
916 BASICMODULES="$BASICMODULES $2"
917 shift
918 ;;
919 --version)
920 echo "$PROGRAM: version $VERSION"
921 exit 0
922 ;;
923 -v)
924 verbose=-v
925 ;;
c552503c
ER
926 --compress)
927 COMPRESS=$2
928 ;;
929 --compress=*)
930 COMPRESS="${1#--compress=}"
931 ;;
82b2dba2
ER
932 --nocompress)
933 COMPRESS=no
934 ;;
935 --ifneeded)
936 ifneeded=1
937 ;;
938 -f)
939 force=1
940 ;;
941 --preload=*)
942 PREMODS="$PREMODS ${1#--preload=}"
943 ;;
944 --preload)
945 PREMODS="$PREMODS $2"
946 shift
947 ;;
2965cab9 948 --fs=* | --fs)
bbbc32d0 949 die "--fs option is obsoleted. Use --initrdfs instead"
82b2dba2
ER
950 ;;
951 --initrdfs=*)
952 INITRDFS=${1#--initrdfs=}
953 ;;
954 --initrdfs)
955 INITRDFS=$2
956 shift
957 ;;
958 --image-version)
959 img_vers=yes
960 ;;
961 --ide-only-root)
962 ide_only_root="yes"
963 ;;
964 *)
965 if [ -z "$target" ]; then
966 target="$1"
967 elif [ -z "$kernel" ]; then
968 kernel="$1"
969 else
36523626
ER
970 usage >&2
971 exit 1
82b2dba2
ER
972 fi
973 ;;
974 esac
f5db170b 975
82b2dba2
ER
976 shift
977done
978
979if [ -z "$target" -o -z "$kernel" ]; then
36523626
ER
980 usage >&2
981 exit 1
82b2dba2
ER
982fi
983
93a38d1a
ER
984# main()
985if [ "$(id -u)" != 0 ]; then
986 die "You need to be root to generate initrd"
987fi
988
c124d0cf
ER
989if [ -d /usr/lib64 ]; then
990 _lib=lib64
991else
992 _lib=lib
130aadc1
ER
993fi
994
c124d0cf 995initrd_dir=/usr/$_lib/initrd
707f5e60
ER
996kernel_version=$(echo "$kernel" | awk -F. '{print sprintf("%03d%03d",$1,$2)}')
997kernel_version_long=$(echo "$kernel" | awk -F. '{print sprintf("%03d%03d%03d",$1,$2,$3)}')
82b2dba2 998
c124d0cf
ER
999debug "# $RCSID"
1000debug "Using _lib: $_lib"
1001debug "Using initrd_dir: $initrd_dir"
1002
1003busybox=$(find_tool $initrd_dir/initrd-busybox /bin/initrd-busybox) || die "Couldn't find busybox suitable for initrd"
1004
1005# we setup mods after parsing command line args
1006geninitrd_setup_mods
1007
1008if [ ! -f /boot/vmlinuz-"$kernel" ]; then
1009 warn "/boot/vmlinuz-$kernel doesn't exist, is your /boot mounted?"
1010fi
1011
82b2dba2 1012if [ -z "$INITRDFS" ]; then
bbbc32d0
ER
1013 if [ -n "$FS" ]; then
1014 # FS= can came only via /etc/sysconfig/geninitrd likely?
1015 die "FS configuration option is obsoleted. Use INITRDFS instead"
f5db170b 1016 fi
f5db170b 1017
bbbc32d0
ER
1018 # default value
1019 if [ "$kernel_version" -ge "002005" ]; then
1020 INITRDFS="initramfs"
1021 else
1022 INITRDFS="rom"
1023 fi
82b2dba2 1024fi
966c32cc 1025
82b2dba2 1026case "$INITRDFS" in
4877276e
ER
1027 ext2)
1028 [ -x /sbin/mke2fs ] || die "/sbin/mke2fs is missing"
1029 ;;
1030 rom|romfs)
1031 [ -x /sbin/genromfs ] || die "/sbin/genromfs is missing"
1032 ;;
1033 cram|cramfs)
1034 [ -x /sbin/mkcramfs ] || die "/sbin/mkcramfs is missing"
1035 ;;
1036 initramfs)
1037 [ -x /bin/cpio ] || die "/bin/cpio is missing"
1038 [ -x /usr/bin/find ] || die "/usr/bin/find is missing"
1039 ;;
1040 *)
1041 die "Filesystem $INITRDFS on initrd is not supported"
1042 ;;
82b2dba2 1043esac
f5db170b 1044
9323ada3 1045if [ -L "$target" ]; then
1046 target=$(readlink -f "$target")
1047fi
1048
82b2dba2
ER
1049if [ -n "$img_vers" ]; then
1050 target="$target-$kernel"
1051fi
8bd582f1 1052
82b2dba2
ER
1053if [ -z "$force" -a -f "$target" ]; then
1054 die "$target already exists."
1055fi
c6c6ce01 1056
82b2dba2
ER
1057if [ ! -d "/lib/modules/$kernel" ]; then
1058 die "/lib/modules/$kernel is not a directory."
1059fi
2ffb1734 1060
bbbc32d0
ER
1061if [ "$kernel_version" -ge "002005" ]; then
1062 modext=".ko"
1063fi
1064
82b2dba2
ER
1065cache_modprobe_conf
1066
1067for n in $PREMODS; do
046c68c9 1068 find_module "$n"
82b2dba2
ER
1069done
1070
ed30e3a8 1071if [ "$FBMODULE" ]; then
046c68c9 1072 find_module "$FBMODULE"
ed30e3a8
ER
1073fi
1074
82b2dba2 1075# allow forcing loading SCSI and/or IDE modules
35043b20 1076# XXX: where ADDSCSI cames from? drop?
82b2dba2
ER
1077if is_yes "$ADDSCSI"; then
1078 find_modules_scsi
1079fi
1080
35043b20 1081# XXX: where ADDIDE cames from? drop?
82b2dba2
ER
1082if is_yes "$ADDIDE"; then
1083 find_modules_ide
1084fi
1085
4c16dac4
ER
1086if is_yes "$USE_SUSPEND"; then
1087 find_modules_suspend
1088fi
1089
82b2dba2
ER
1090find_root "$fstab" || exit
1091debug "Using $rootdev as device for rootfs"
1092
d8056591 1093find_modules_for_devpath "$rootdev"
ac085800 1094
ecd7bf46
ER
1095# if USE_MULTIPATH is path to device, scan that too
1096# this is to bootstrap multipath setup into initrd.
1097if ! is_no "$USE_MULTIPATH" && ! is_yes "$USE_MULTIPATH"; then
1098 find_modules_multipath $USE_MULTIPATH
1099fi
1100
046c68c9 1101find_module "-$rootFs"
ac085800 1102
82b2dba2 1103for n in $BASICMODULES; do
046c68c9 1104 find_module "$n"
82b2dba2 1105done
4e9eb79c 1106
82b2dba2 1107if is_yes "$USE_TUXONICE"; then
046c68c9 1108 find_module "-lzf"
82b2dba2 1109fi
33d24e12 1110
bf6d9c64 1111find_modules_fbsplash
2968c9dd 1112
82b2dba2
ER
1113if [ -n "$ifneeded" -a -z "$MODULES" ]; then
1114 debug "No modules are needed -- not building initrd image."
1115 exit 0
1116fi
c6c6ce01 1117
6fc274fb 1118debug "Building initrd..."
d8056591 1119DESTDIR=$(mktemp -d -t initrd.XXXXXX) || die "mktemp failed"
9b557a09 1120RCFILE="$DESTDIR/linuxrc"
82b2dba2
ER
1121> "$RCFILE"
1122chmod a+rx "$RCFILE"
9b557a09 1123ln -s linuxrc $DESTDIR/init
e8d178ff 1124
82b2dba2
ER
1125# create dirs that we really need
1126inst_d /{lib,bin,etc,dev{,/pts,/shm},loopfs,var,proc,sys}
e8d178ff 1127
82b2dba2 1128modules_install "$MODULES"
b64f015b 1129
82b2dba2
ER
1130# mknod'ing the devices instead of copying them works both with and
1131# without devfs...
9b557a09
ER
1132mknod "$DESTDIR/dev/console" c 5 1
1133mknod "$DESTDIR/dev/null" c 1 3
1134mknod "$DESTDIR/dev/zero" c 1 5
be2f3ecc 1135
684d5d2a 1136inst_exec $busybox /bin/initrd-busybox
9b557a09 1137ln -s initrd-busybox $DESTDIR/bin/sh
684d5d2a
ER
1138# for older busyboxes who had /bin/busybox as EXEPATH
1139ln -s initrd-busybox $DESTDIR/bin/busybox
2ffb1734 1140
82b2dba2
ER
1141add_linuxrc <<EOF
1142#!/bin/sh
1143# initrd generated by:
1144# $RCSID
c6c6ce01 1145
82b2dba2
ER
1146EOF
1147mount_proc
1148add_linuxrc <<-'EOF'
3a1d3d88 1149 read CMDLINE < /proc/cmdline; export CMDLINE
c6c6ce01 1150
82b2dba2
ER
1151 for arg in $CMDLINE; do
1152 if [ "${arg}" = "debuginitrd" ]; then
1153 DEBUGINITRD=yes
1154 fi
1155 if [ "${arg##debuginitrd=}" != "${arg}" ]; then
1156 DEBUGINITRD=${arg##debuginitrd=}
1157 fi
fc787d45 1158 if [ "${arg##root=}" != "${arg}" ]; then
1159 ROOT=${arg##root=}
1160 fi
82b2dba2 1161 done
c6c6ce01 1162
82b2dba2
ER
1163 # make debugshell() invoke subshell if $DEBUGINITRD=sh
1164 if [ "$DEBUGINITRD" = "sh" ]; then
1165 debugshell() {
e2405b29
AM
1166EOF
1167if is_yes "$RUN_SULOGIN_ON_ERR"; then
1168add_linuxrc <<-'EOF'
1169 echo "debug shell disabled by /etc/sysconfig/system:RUN_SULOGIN_ON_ERR setting"
1170EOF
1171else
1172add_linuxrc <<-'EOF'
1173 sh
1174EOF
1175fi
1176add_linuxrc <<-'EOF'
82b2dba2
ER
1177 }
1178 else
1179 debugshell() {
1180 :
1181 }
1182 fi
e934d044 1183
82b2dba2
ER
1184 if [ "$DEBUGINITRD" ]; then
1185 set -x
cff3058d 1186 fi
82b2dba2 1187EOF
2df2e995 1188
fe280785 1189modules_add_linuxrc $MODULES
82b2dba2
ER
1190
1191# TODO: rewrite for busybox
1192#if [ -n "$loopDev" ]; then
1193# if [ ! -d /initrd ]; then
1194# mkdir /initrd
1195# fi
1196#
9b557a09
ER
1197# cp -a "$loopDev" "$DESTDIR/dev"
1198# cp -a "$rootdev" "$DESTDIR/dev"
82b2dba2
ER
1199# echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE"
1200# echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE"
1201# echo "echo Setting up loopback device $rootdev" >> $RCFILE
1202# echo "losetup $rootdev /loopfs$loopFile" >> "$RCFILE"
1203#fi
2b1a3707 1204
1606e343
AM
1205if is_yes "$USE_UDEV"; then
1206 initrd_gen_udev
1207fi
1208
1cd2aabd
ER
1209if is_yes "$USE_TUXONICE"; then
1210 initrd_gen_tuxonice
2df2e995
AM
1211fi
1212
3dd50160
ER
1213find_modules_uvesafb
1214initrd_gen_uvesafb
43258faf 1215
3ef3d717
ER
1216if is_yes "$have_luks"; then
1217 initrd_gen_luks
1218fi
1219
cc8e8a99 1220if is_yes "$have_dmraid"; then
882472ae
ER
1221 initrd_gen_dmraid
1222fi
1223
c083ae23 1224if is_yes "$have_multipath"; then
2cc3ae8b
ER
1225 initrd_gen_multipath
1226fi
1227
cc8e8a99 1228if is_yes "$USE_BLKID"; then
289fbc9b 1229 initrd_gen_blkid
1230fi
1231
69b1e935 1232if is_yes "$have_nfs"; then
2df2e995 1233 initrd_gen_nfs
8dadb607 1234elif is_yes "$have_md"; then
df738638 1235 initrd_gen_md
69b1e935 1236 if is_yes "$have_lvm"; then
2df2e995 1237 initrd_gen_lvm
bfea009a 1238 else
4828c787 1239 initrd_gen_setrootdev
2df2e995 1240 fi
69b1e935 1241elif is_yes "$have_lvm"; then
2df2e995 1242 initrd_gen_lvm
2b1a3707 1243else
4828c787 1244 initrd_gen_setrootdev
7c38b114
AF
1245fi
1246
4c16dac4
ER
1247if is_yes "$USE_SUSPEND"; then
1248 initrd_gen_suspend
1249fi
1250
5101a385 1251# additional devs always needed
9b557a09 1252[ ! -e "$DESTDIR/$rootdev_add" ] && inst $rootdev_add /dev
5101a385 1253
82de999f
ER
1254if is_yes "$USE_UDEV"; then
1255 initrd_gen_stop_udevd
1256fi
1257
f8f9e56d 1258if [ "$INITRDFS" = "initramfs" ]; then
4671d086 1259 initrd_gen_initramfs_switchroot
b64f015b 1260else
b64f015b 1261 umount_all
f8f9e56d
AM
1262fi
1263
b7feffb3
ER
1264if is_yes "$FB_SPLASH"; then
1265 initrd_gen_fbsplash
1266fi
1267
6c69a2d4
ER
1268if is_yes "$FB_CON_DECOR"; then
1269 initrd_gen_fbcondecor
1270fi
1271
d8056591 1272IMAGE=$(mktemp -t initrd.img-XXXXXX) || die "mktemp failed"
51dc1fe6
AM
1273
1274debug "Creating $INITRDFS image $IMAGE"
2ad94d8a 1275case "$INITRDFS" in
4877276e 1276 ext2)
4877276e
ER
1277 dd if=/dev/zero of="$IMAGE" bs=1k count="$IMAGESIZE" 2> /dev/null
1278 mke2fs -q -F -b 1024 -m 0 "$IMAGE" 2>/dev/null 1>&2
1279 tune2fs -i 0 "$IMAGE" >/dev/null 2>&1
1280
1281 local tmpmnt=$(mktemp -d -t initrd.mnt-XXXXXX)
1282 debug "Mounting ext2 image $IMAGE to $tmpmnt"
1283 mount -o loop -t ext2 "$IMAGE" "$tmpmnt"
1284 # We don't need this directory, so let's save space
1285 rm -rf "$tmpmnt"/lost+found
1286
1287 debug "Copy recursively $DESTDIR -> $tmpmnt"
1288 cp -a $DESTDIR/* $tmpmnt
1289 umount "$IMAGE"
1290 rmdir "$tmpmnt"
1291
1292 ;;
1293 rom|romfs)
1294 genromfs -f "$IMAGE" -d "$DESTDIR" -V "PLD initrd for kernel $kernel"
4877276e
ER
1295 ;;
1296 cram|cramfs)
1297 mkcramfs "$DESTDIR" "$IMAGE"
1298 ;;
1299 initramfs)
1300 (cd $DESTDIR; find . | cpio --quiet -H newc -o > "$IMAGE")
1301 ;;
1302 *)
93a38d1a 1303 die "Filesystem $INITRDFS not supported by $PROGRAM"
c31050f3 1304esac
bb529f94 1305
e3bc44e2
ER
1306# TODO: figure out this automatically
1307CONFIG_BLK_DEV_RAM_SIZE=4096
1308
1309IMAGESIZE=$(du -ks $DESTDIR | awk '{print int(($1+1023+512)/1024)*1024}')
1310debug "image size: $IMAGESIZE KiB ($DESTDIR)"
1311if [ "$IMAGESIZE" -gt $CONFIG_BLK_DEV_RAM_SIZE ]; then
1312 warn "Your image size is larger than $CONFIG_BLK_DEV_RAM_SIZE, Be sure to boot kernel with ramdisk_size=$IMAGESIZE!"
1313fi
1314
c552503c 1315if ! is_no "$COMPRESS"; then
aecfd33d 1316 tmp=$(mktemp "$target".XXXXXX) || die "mktemp failed"
c552503c
ER
1317 compressor=$(find_compressor "$COMPRESS")
1318 debug "Compressing $target with $compressor"
1319
1320 # TODO: the image name (specified from kernel.spec) already contains
1321 # extension, which is .gz most of the time.
1322 case "$compressor" in
1323 lzma)
1324 lzma -9 < "$IMAGE" > "$tmp"
1325 ;;
1326 bzip2)
1327 bzip2 -9 < "$IMAGE" > "$tmp"
1328 ;;
1329 gzip)
1330 gzip -9 < "$IMAGE" > "$tmp"
1331 ;;
1332 esac
d8056591 1333 mv -f "$tmp" "$target"
bb529f94 1334else
7d2fc5eb 1335 cp -a "$IMAGE" "$target"
bb529f94 1336fi
5b71959c 1337
7992356a 1338# XXX. check if bootsplash can output data to tmp dir not directly to initramfs image.
5b71959c 1339if is_yes "$BOOT_SPLASH"; then
f5db170b 1340 initrd_gen_bootsplash "$target"
5b71959c
AM
1341fi
1342
d8056591 1343rm -rf "$DESTDIR" "$IMAGE"
ac085800
ER
1344
1345# vim:ts=4:sw=4:noet:fdm=marker
This page took 0.385746 seconds and 4 git commands to generate.