7 # based on mkinitrd from RedHat Linux
10 RCSID='$Revision$ $Date$'
11 R=${RCSID#* *}; VERSION=${R%% *}
14 . /etc/rc.d/init.d/functions
15 . /lib/geninitrd/functions
16 . /etc/sysconfig/system
18 # list of geninitrd modules which need setup routine after commandline args parsing
30 # device node for rootfs from fstab
40 # is /tmp mounted on tmpfs
43 # are /dev nodes already created from /proc/devices info?
47 echo "Usage: $PROGRAM [--version] [-v] [-f] [--ifneeded] [--preload <module>]"
48 echo " [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]"
49 echo " [--compress=yes|xz|lzma|bzip2|gzip|lzo]"
50 echo " [--initrdfs=rom|initramfs|ext2|cram] [--modules-conf=<modules.conf>]"
51 echo " [--with-bootsplash] [--without-bootsplash]"
52 echo " [--with-fbsplash] [--without-fbsplash]"
53 echo " [--with-fbcondecor] [--without-fbcondecor]"
54 echo " [--lvmtoolsversion=1|2] [--with-udev] [--without-udev]"
55 echo " [--with-suspend] [--without-suspend]"
56 echo " [--with-tuxonice] [--without-tuxonice]"
57 echo " [--without-dmraid]"
58 echo " [--with-multipath=DEVPATH] [--without-multipath]"
59 echo " [--without-blkid] [--without-luks]"
60 echo " <initrd-image> <kernel-version>"
65 for kdir in /lib/modules/*; do
66 [ -d $kdir ] || continue
68 echo " $PROGRAM -f --initrdfs=rom /boot/initrd-$kver.gz $kver"
82 [ -n "$verbose" ] && msg "$*" >&2
85 # aborts program abnormally
92 # find program from specified paths
98 debug "find_tool: found $x"
102 debug "find_tool: did not found any of: $@"
106 # loads geninitrd modules
107 geninitrd_load_mods() {
110 if [ ! -f /lib/geninitrd/mod-$mod.sh ]; then
111 die "$mod geninitrd module can't be loaded"
113 . /lib/geninitrd/mod-$mod.sh
115 if type setup_mod_$mod > /dev/null; then
116 # add to list which need init
117 GENINITRD_MODS="$GENINITRD_MODS $mod"
122 # setup geninitrd modules
123 geninitrd_setup_mods() {
126 for mod in $GENINITRD_MODS; do
131 # append text to /linuxrc
132 # takes STDIN as input
137 # generate code to mount /dev on tmpfs and create initial nodes
138 # can be called multiple times. /dev is cleaned up (umounted) automatically at
141 if [ "$INITRDFS" = "initramfs" ]; then
142 # initramfs is read-write filesystem, no need for tmpfs
146 # we already generated tmpfs code; return
147 if is_yes "$dev_mounted"; then
153 busybox_applet mount mknod mkdir
156 mount -o mode=0755 -t tmpfs none /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/urandom c 1 9
166 # generate code to mount /proc on initrd
167 # can be called multiple times
169 if is_yes "$proc_mounted"; then
174 if [ "$INITRDFS" = "initramfs" ]; then
175 # /proc is mounted with initramfs 2.6.22.14 kernel
176 # XXX: remove when it is clear why proc was already mounted
177 echo "[ -f /proc/cmdline ] || mount -t proc none /proc" | add_linuxrc
179 echo "mount -t proc none /proc" | add_linuxrc
183 # generate code to mount /sys on initrd
184 # can be called multiple times
186 if is_yes "$sys_mounted"; then
191 echo "mount -t sysfs none /sys" | add_linuxrc
194 # generate code to mount /tmp on initrd
195 # can be called multiple times
197 if [ "$INITRDFS" = "initramfs" ]; then
198 # initramfs is read-write filesystem, no need for tmpfs
202 if is_yes "$tmp_mounted"; then
207 echo "mount -t tmpfs none /tmp" | add_linuxrc
210 # unmount all mountpoints mounted by geninitrd
214 : Last shell before umounting all and giving control over to real init.
218 if is_yes "$dev_mounted"; then
219 echo 'umount /dev' | add_linuxrc
222 if is_yes "$sys_mounted"; then
223 echo 'umount /sys' | add_linuxrc
226 if is_yes "$tmp_mounted"; then
227 echo 'umount /tmp' | add_linuxrc
230 if is_yes "$proc_mounted"; then
231 echo 'umount /proc' | add_linuxrc
237 # Checks if busybox has support for APPLET(s)
238 # Exits from geninitrd if the support is not present.
240 # NB! XXX do not output to STDOUT, it will appear in initrd images in some cases!
244 if [ -z "$busybox_functions" ]; then
245 local tmp=$($busybox 2>&1)
247 # BusyBox v1.1.3 says applet not found if it's not called 'busybox'.
248 if [[ "$tmp" = *applet\ not\ found* ]]; then
250 ln -s $busybox $t/busybox
251 local tmp=$($t/busybox 2>&1)
255 busybox_functions=$(echo "$tmp" | \
256 sed -ne '/Currently defined functions:/,$p' | \
257 xargs | sed -e 's,.*Currently defined functions: ,,'
263 eval have='$'busybox_have_$applet
264 if [ -z "$have" ]; then
265 have=$(echo "$busybox_functions" | egrep -c "( |^)$applet(,|$)")
266 if [ "$have" = 0 ]; then
267 warn "This setup requires busybox-initrd compiled with applet '$applet' support"
270 eval busybox_have_$applet=$have
273 if [ $err = 1 ]; then
278 # Extract the .config file from a kernel image
279 # uses extract-ikconfig from kernel sources (scripts/extract-ikconfig)
281 local kofile=$(modinfo -k $kernel -n configs 2> /dev/null)
282 if [ -n "$kofile" ]; then
283 /lib/geninitrd/extract-ikconfig $kofile
286 /lib/geninitrd/extract-ikconfig /boot/vmlinuz-$kernel
290 # Finds module dependencies
294 # Outputs full path to module and it's dependencies
299 # if module is prefixed with dash, we should ignore errors if the module
301 if [ ${module#-} != $module ]; then
306 # This works when user has module-init-tools installed even on 2.4 kernels
308 modprobe=$(modprobe --set-version $kernel --show-depends $module --ignore-install 2>&1)
311 if [ $skiperrors = 1 ]; then
316 if ! is_no "$EXIT_IF_MISSING"; then
317 die "$module: module not found for $kernel kernel"
320 warn "$module: module not found for $kernel kernel"
321 warn "If $module isn't compiled in kernel then this initrd may not start your system."
325 while read insmod modpath options; do
326 [ "$insmod" = "insmod" ] && echo $modpath
333 # no firmware support in 2.4 kernels
334 if [ "$kernel_version_long" -lt "002005048" ]; then
337 echo -n $(NEW_MODINFO=1 modinfo -k $kernel -F firmware $module 2>/dev/null | xargs)
342 local mod depmod module=$1
344 depmod=$(find_depmod $module) || exit 1
345 for mod in $depmod; do
346 mod=${mod#/lib/modules/$kernel/}
348 # add each module only once
350 for m in $MODULES; do
351 [ $m = $mod ] && have=1
353 if [ $have = 0 ]; then
354 MODULES="$MODULES $mod"
359 # install a file to temporary mount image.
360 # it will operate recursively (copying directories)
361 # and will symlink destinations if source is symlink.
363 if [ $# -lt 2 ]; then
364 die 'Usage: inst <file> [<file>] <destination>'
367 local src i=0 c=$(($# - 1))
368 while [ $i -lt $c ]; do
375 local parentDir=$(dirname $DESTDIR$dest)
376 [ ! -d "$parentDir" ] && (debug "+ mkdir -p $parentDir"; mkdir -p $parentDir)
377 debug "+ cp $* $DESTDIR$dest"
378 cp -HR "$@" "$DESTDIR$dest"
383 die 'Usage: inst_d <destination> <destination>'
386 install -d "$DESTDIR$dir"
390 # install executable and it's shared libraries
392 if [ $# -lt 2 ]; then
393 die "Invalid params ($@), Usage: inst_exec <file>[, <file>] <destination>"
395 local src i=0 c=$(($# - 1))
396 while [ $i -lt $c ]; do
406 local lib libs=$(ldd "$@" | awk '/statically|linux-(gate|vdso)\.so/{next} NF == 2 {print $1} /=/{print $3}' | sort -u)
408 if [ ! -f "$DESTDIR/$_lib/${lib##*/}" ]; then
410 inst_exec $lib /$_lib
414 # hack for uclibc linked binaries requiring this fixed path
415 # XXX: shouldn't rpath be used here instead so th
416 if [ -f $DESTDIR/$_lib/libc.so.0 ]; then
417 local lib=$DESTDIR/$_lib/libc.so.0
418 lib=$(ldd "$lib" | awk '/statically|linux-(gate|vdso)\.so/{next} NF == 2 {print $1} /=/{print $3}' | sort -u)
419 local libdir=$(cd $(dirname "$lib"); pwd)
420 if [ ! -e $DESTDIR$libdir ]; then
421 libdir=$(dirname "$libdir")
423 debug "+ ln -s /$_lib $DESTDIR$libdir"
424 ln -s /$_lib $DESTDIR$libdir
429 # output modules.conf / modprobe.conf
431 echo "$modprobe_conf_cache"
435 # defaults to modprobe -c if not told otherwise, this means include statements
437 cache_modprobe_conf() {
438 if [ "$kernel_version" -lt "002005" ]; then
439 modulefile=/etc/modules.conf
440 if [ ! -f "$modulefile" -a -f /etc/conf.modules ]; then
441 modulefile=/etc/conf.modules
445 if [ -n "$modulefile" ]; then
446 debug "Using $modulefile for modules config"
447 modprobe_conf_cache=$(cat $modulefile)
449 debug "Using modprobe -c to get modules config"
450 modprobe_conf_cache=$(modprobe -c --set-version $kernel)
454 # find modules for $devpath
455 find_modules_for_devpath() {
457 if [ -z "$devpath" ]; then
458 die "No argument passed to find_modules_for_devpath() - is your /etc/fstab correct?"
461 if [[ "$devpath" = /dev/dm-* ]]; then
462 # /dev/dm-3 -> /dev/mapper/sil_ahbgadcbchfc3
463 devpath=$(dm_longname "$devpath")
466 if [ -L "$devpath" ] && ! is_lvm "$devpath"; then
467 # sanitize things like:
468 # /dev/block/104:2 -> /dev/cciss/c0d0p2
469 devpath=$(readlink -f "$devpath")
472 debug "Finding modules for device path $devpath"
474 if is_luks "$devpath"; then
475 find_modules_luks "$devpath"
479 if is_nfs "$devpath"; then
480 find_modules_nfs "$devpath"
484 if is_md "$devpath"; then
485 find_modules_md "$devpath"
489 if is_multipath "$devpath"; then
490 if find_modules_multipath "$devpath"; then
497 if is_dmraid "$devpath"; then
498 if find_modules_dmraid "$devpath"; then
504 if is_scsi "$devpath"; then
505 find_modules_scsi "$devpath"
509 if is_ide "$devpath"; then
510 find_modules_ide "$devpath"
514 if [[ "$devpath" == /dev/rd/* ]]; then
520 if [[ "$devpath" == /dev/ida/* ]]; then
521 find_module "cpqarray"
522 rootdev_add=/dev/ida/
526 if [[ "$devpath" == /dev/cciss/* ]]; then
528 rootdev_add=/dev/cciss/
532 if [[ "$devpath" == /dev/ataraid/* ]]; then
534 find_module "ataraid"
535 ataraidmodules=$(modprobe_conf | awk '/ataraid_hostadapter/ && ! /^[\t ]*#/ { print $3; }')
536 if [ -n "$ataraidmodules" ]; then
537 # FIXME: think about modules compiled in kernel
538 die "ataraid_hostadapter alias not defined in modprobe.conf! Please set it and run $PROGRAM again."
540 for n in $ataraidmodules; do
543 rootdev_add=/dev/ataraid/
547 # check to see if we need to set up a loopback filesystem
548 if [[ "$devpath" == /dev/loop* ]]; then
549 die "Sorry, root on loop device isn't supported."
550 # TODO: rewrite for bsp and make nfs ready
551 if [ ! -x /sbin/losetup ]; then
552 die "losetup is missing"
554 key="^# $(echo $devpath | awk -F/ '{print($3);}' | tr '[a-z]' '[A-Z]'):"
555 if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`"; then
556 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"
559 line="`awk '/'$key'/ { print $0; }' $fstab`"
560 loopDev="$(echo $line | awk '{print $3}')"
561 loopFs="$(echo $line | awk '{print $4}')"
562 loopFile="$(echo $line | awk '{print $5}')"
564 BASICMODULES="$BASICMODULES -loop"
565 find_module "-$loopFs"
566 BASICMODULES="$BASICMODULES -${loopFs}"
570 if is_lvm "$devpath"; then
571 find_modules_lvm "$devpath"
576 firmware_install_module() {
578 local firmware_files="$2"
580 debug "Adding Firmwares ($firmware_files) to initrd for module $module"
581 # firmware not yet installed
582 if [ ! -f "$DESTDIR/lib/firmware/firmware.sh" ]; then
584 cat << 'EOF' >> "$DESTDIR/lib/firmware/firmware.sh"
586 echo 1 > /sys$DEVPATH/loading
587 cat "/lib/firmware/$FIRMWARE" > /sys$DEVPATH/data
588 echo 0 > /sys$DEVPATH/loading
591 chmod 755 "$DESTDIR/lib/firmware/firmware.sh"
594 for firmware in $firmware_files; do
595 if [ -f "/lib/firmware/$kernel/$firmware" ]; then
596 FIRMWAREDIR=${firmware%/*}
597 [ "$FIRMWAREDIR" != "$firmware" ] && inst_d /lib/firmware/$FIRMWAREDIR
598 inst /lib/firmware/$kernel/$firmware /lib/firmware/$firmware
599 elif [ -f "/lib/firmware/$firmware" ]; then
600 FIRMWAREDIR=${firmware%/*}
601 [ "$FIRMWAREDIR" != "$firmware" ] && inst_d /lib/firmware/$FIRMWAREDIR
602 inst /lib/firmware/$firmware /lib/firmware/$firmware
604 die "firmware file /lib/firmware/$firmware nor /lib/firmware/$kernel/$firmware found."
609 echo "echo -n "/lib/firmware/firmware.sh" > /proc/sys/kernel/hotplug" | add_linuxrc
616 for mod in $modules; do
618 inst_d "/lib/modules/$kernel/$MODULEDIR"
619 cp -a "/lib/modules/$kernel/$mod" "$DESTDIR/lib/modules/$kernel/$mod"
620 gunzip "$DESTDIR/lib/modules/$kernel/$mod" 2> /dev/null
624 modules_add_linuxrc() {
628 # module path without optional compression
632 local module=${modpath##*/}; module=${module%$modext}
633 local options=$(modprobe_conf | awk -vmodule="$module" '{ if ($1 == "options" && $2 == module) { for(i=3;i<=NF;i++) printf("%s ",$i); }}' | xargs)
634 local genericname=$(echo $module | tr - _)
635 local usleep=$(eval echo \$MODULE_${genericname}_USLEEP)
636 local firmware=$(eval echo \$MODULE_${genericname}_FIRMWARE)
638 if [ "$module" = "scsi_mod" -a "$kernel_version_long" -ge "002006030" ]; then
639 options="scan=sync $options"
642 if [ -n "$verbose" ]; then
644 if [ "$options" ]; then
645 s="$s with options [$options]"
647 if [ "$usleep" ]; then
648 s="$s and $usleep usleep"
650 debug "Loading module [$module]$s"
653 if [ -n "$firmware" ]; then
654 firmware_install_module "$module" "$firmware"
656 for file in $(find_firmware "$module"); do
657 firmware_install_module "$module" "$file"
661 echo "insmod /lib/modules/$kernel/$modpath $options" | add_linuxrc
662 if [ -n "$usleep" ]; then
663 echo "usleep $usleep" | add_linuxrc
665 if [ "$module" = "scsi_wait_scan" ]; then
666 if [ "$(busybox_applet rmmod 2>/dev/null; echo $?)" = 0 ]; then
667 echo "rmmod scsi_wait_scan" | add_linuxrc
674 # Generates /dev nodes based on /proc/partitions information.
675 # Needs /proc mounted.
676 # Can be called multiple times.
677 initrd_gen_devices() {
678 if is_yes "$proc_partitions"; then
685 : 'Making device nodes'
686 cat /proc/partitions | (
687 # ignore first two lines: header, empty line
690 while read major minor blocks dev rest; do
693 [ -e $node ] || mknod $node b $major $minor
700 initrd_gen_setrootdev() {
701 debug "Adding rootfs finding based on kernel cmdline root= option support."
703 if [ "${ROOT##/dev/}" != "${ROOT}" ]; then
704 rootnr="$(busybox awk -v rootnode="${ROOT##/dev/}" '$4 == rootnode { print 256 * $1 + $2 }' /proc/partitions)"
705 if [ -n "$rootnr" ]; then
706 echo "$rootnr" > /proc/sys/kernel/real-root-dev
712 initrd_gen_initramfs_switchroot() {
714 if [ "$rootdev" = "/dev/nfs" ]; then
715 echo "rootfs on NFS root=/dev/nfs"
717 [ ! -e "$DESTDIR/$rootdev" ] && inst $rootdev $rootdev
720 # parse 'root=xxx' kernel commandline
721 # We support passing root as hda3 /dev/hda3 0303 0x0303 and 303
723 device=/dev/no_partition_found
724 eval "$(busybox awk -v c="$ROOT" '
726 num_pattern_short = "[0-9a-f][0-9a-f][0-9a-f]";
727 num_pattern = "[0-9a-f]" num_pattern_short;
728 dev_pattern = "[hms][a-z][a-z]([0-9])+";
729 partition = "no_partition_found";
733 if (c ~ "^" num_pattern_short "$") sub("^", "0", c);
734 if (c ~ "^" num_pattern "$") {
735 maj = sprintf("%s",substr(c,1,2));
736 min = sprintf("%s",substr(c,3));
738 if (c ~ "^\/dev\/" dev_pattern "$") sub("^/dev/","", c);
739 if (c ~ "^" dev_pattern "$") partition = c;
742 $4 ~ partition { maj = $1; min = $2; }
743 $1 ~ maj && $2 ~ min { partition = $4; }
746 if (maj >= 0 && min >= 0) {
747 printf("device=/dev/%s; maj=%s; min=%s;\n", partition, maj, min);
751 if [ "$device" != '/dev/no_partition_found' -a ! -b $device ]; then
752 mknod $device b $maj $min
762 if [ "$device" = '/dev/no_partition_found' ]; then
766 mount -t $rootfs -r $device /newroot
767 init="$(echo "$CMDLINE" | busybox awk '/init=\// { gsub(/.*init=/,NIL,$0); gsub(/ .*/,NIL,$0); print }')"
768 if [ -z "$init" -o ! -x "/newroot$init" ]; then
774 busybox_applet switch_root
776 exec switch_root /newroot $init ${1:+"$@"}
778 echo "Error! initramfs should not reach this place."
779 echo "It probably means you've got old version of busybox, with broken"
780 echo "initramfs support. Trying to boot anyway, but won't promise anything."
782 exec chroot /newroot $init ${1:+"$@"}
784 echo "Failed to chroot!"
786 # we need /init being real file, not symlink, otherwise the initramfs will
787 # not be ran by pid 1 which is required for switch_root
788 mv $DESTDIR/linuxrc $DESTDIR/init
789 ln -s init $DESTDIR/linuxrc
792 # find if $symbol exists in System.map $mapfile
796 if [ ! -f $mapfile ]; then
797 # missing mapfile (not a pld kernel?)
801 awk -vc=1 -vsymbol="$symbol" '$2 == "T" && $3 == symbol {c = 0} END {exit c}' $mapfile
804 # find best compressor (or forced one) for initrd
807 # fastest initrd decompression speed is first
808 local compressors='lzo gzip xz lzma bzip2'
810 # a specified one, take it
811 if ! is_yes "$mode"; then
815 debug "finding compressor: $compressors (via $mode)"
816 # check for compressor validity
817 local c prog map=/boot/System.map-$kernel
818 for c in $compressors; do
841 # any existing sym will work
846 die "Unknown compressor $c"
849 if sym_exists $map $sym && [ -x $prog ]; then
855 debug "using gzip for compressor (fallback)"
859 # compresses kernel image image
860 # in function so we could retry with other compressor on failure
862 local compressor="$1" IMAGE="$2" target="$3" tmp
863 tmp=$(mktemp "$target".XXXXXX) || die "mktemp failed"
865 case "$compressor" in
867 # don't use -9 here since kernel won't understand it
868 xz --format=xz --check=crc32 --lzma2=preset=6e,dict=1MiB < "$IMAGE" > "$tmp" || return $?
871 xz --format=lzma -9 < "$IMAGE" > "$tmp" || return $?
874 bzip2 -9 < "$IMAGE" > "$tmp" || return $?
877 gzip -9 < "$IMAGE" > "$tmp" || return $?
880 lzop -9 < "$IMAGE" > "$tmp" || return $?
883 cat < "$IMAGE" > "$tmp" || return $?
887 mv -f "$tmp" "$target"
890 if [ -r /etc/sysconfig/geninitrd ]; then
891 . /etc/sysconfig/geninitrd
894 if [ ! -f /proc/mounts ]; then
895 warn "/proc filesystem not mounted, may cause wrong results or failure."
898 geninitrd_load_mods ide luks multipath dmraid lvm md blkid udev tuxonice suspend fbsplash condecor bootsplash uvesafb nfs sata scsi
900 while [ $# -gt 0 ]; do
910 modulefile=${1#--modules-conf=}
919 --without-bootsplash)
931 --without-fbcondecor)
940 --with-suspend2 | --with-tuxonice)
943 --without-suspend2 | --without-tuxonice)
947 LVMTOOLSVERSION=${1#--lvmversion=}
950 LVMTOOLSVERSION=${1#--lvmtoolsversion=}
952 --lvmtoolsversion|--lvmversion)
969 USE_MULTIPATH=${1#--with-multipath=}
978 BASICMODULES="$BASICMODULES ${1#--with=}"
981 BASICMODULES="$BASICMODULES $2"
985 echo "$PROGRAM: version $VERSION"
995 COMPRESS="${1#--compress=}"
1007 PREMODS="$PREMODS ${1#--preload=}"
1010 PREMODS="$PREMODS $2"
1014 die "--fs option is obsoleted. Use --initrdfs instead"
1017 INITRDFS=${1#--initrdfs=}
1030 if [ -z "$target" ]; then
1032 elif [ -z "$kernel" ]; then
1044 if [ -z "$target" -o -z "$kernel" ]; then
1050 if [ "$(id -u)" != 0 ]; then
1051 die "You need to be root to generate initrd"
1054 if [ -d /lib64 -a -d /usr/lib64 ]; then
1060 initrd_dir=/usr/$_lib/initrd
1061 kernel_version=$(echo "$kernel" | awk -F. '{print sprintf("%03d%03d",$1,$2)}')
1062 kernel_version_long=$(echo "$kernel" | awk -F. '{print sprintf("%03d%03d%03d",$1,$2,$3)}')
1065 debug "Using _lib: $_lib"
1066 debug "Using initrd_dir: $initrd_dir"
1068 busybox=$(find_tool $initrd_dir/busybox $initrd_dir/initrd-busybox /bin/initrd-busybox) || die "Couldn't find busybox suitable for initrd"
1070 # we setup mods after parsing command line args
1071 geninitrd_setup_mods
1073 if [ ! -f /boot/vmlinuz-"$kernel" ]; then
1074 warn "/boot/vmlinuz-$kernel doesn't exist, is your /boot mounted?"
1077 if [ -z "$INITRDFS" ]; then
1078 if [ -n "$FS" ]; then
1079 # FS= can came only via /etc/sysconfig/geninitrd likely?
1080 die "FS configuration option is obsoleted. Use INITRDFS instead"
1084 if [ "$kernel_version" -ge "002005" ]; then
1085 INITRDFS="initramfs"
1093 [ -x /sbin/mke2fs ] || die "/sbin/mke2fs is missing"
1096 [ -x /sbin/genromfs ] || die "/sbin/genromfs is missing"
1099 [ -x /sbin/mkcramfs ] || die "/sbin/mkcramfs is missing"
1102 [ -x /bin/cpio ] || die "/bin/cpio is missing"
1103 [ -x /usr/bin/find ] || die "/usr/bin/find is missing"
1106 die "Filesystem $INITRDFS on initrd is not supported"
1110 if [ -L "$target" ]; then
1111 target=$(readlink -f "$target")
1114 if [ -n "$img_vers" ]; then
1115 target="$target-$kernel"
1118 if [ -z "$force" -a -f "$target" ]; then
1119 die "$target already exists."
1122 if [ ! -d "/lib/modules/$kernel" ]; then
1123 die "/lib/modules/$kernel is not a directory."
1126 if [ "$kernel_version" -ge "002005" ]; then
1132 for n in $PREMODS; do
1136 if [ "$FBMODULE" ]; then
1137 find_module "$FBMODULE"
1140 # allow forcing loading SCSI and/or IDE modules
1141 # XXX: where ADDSCSI cames from? drop?
1142 if is_yes "$ADDSCSI"; then
1146 # autodetect SATA modules
1149 # XXX: where ADDIDE cames from? drop?
1150 if is_yes "$ADDIDE"; then
1154 if is_yes "$USE_SUSPEND"; then
1155 find_modules_suspend
1158 find_root "$fstab" || exit
1159 debug "Using $rootdev as device for rootfs"
1161 find_modules_for_devpath "$rootdev"
1163 # if USE_MULTIPATH is path to device, scan that too
1164 # this is to bootstrap multipath setup into initrd.
1165 if ! is_no "$USE_MULTIPATH" && ! is_yes "$USE_MULTIPATH"; then
1166 find_modules_multipath $USE_MULTIPATH
1169 find_module "-$rootFs"
1171 for n in $BASICMODULES; do
1175 if is_yes "$USE_TUXONICE"; then
1179 find_modules_fbsplash
1181 if [ -n "$ifneeded" -a -z "$MODULES" ]; then
1182 debug "No modules are needed -- not building initrd image."
1186 debug "Building initrd..."
1187 DESTDIR=$(mktemp -d -t initrd.XXXXXX) || die "mktemp failed"
1188 RCFILE="$DESTDIR/linuxrc"
1190 chmod a+rx "$RCFILE"
1191 ln -s linuxrc $DESTDIR/init
1193 # create dirs that we really need
1194 inst_d /{lib,bin,etc,dev{,/pts,/shm},loopfs,var,proc,sys}
1196 modules_install "$MODULES"
1198 # mknod'ing the devices instead of copying them works both with and
1200 mknod "$DESTDIR/dev/console" c 5 1
1201 mknod "$DESTDIR/dev/null" c 1 3
1202 mknod "$DESTDIR/dev/zero" c 1 5
1203 mknod "$DESTDIR/dev/urandom" c 1 9
1205 inst_exec $busybox /bin/busybox
1206 ln -s busybox $DESTDIR/bin/sh
1207 # for older busyboxes who had /bin/initrd-busybox as EXEPATH
1208 ln -s busybox $DESTDIR/bin/initrd-busybox
1212 # initrd generated by:
1217 add_linuxrc <<-'EOF'
1218 read CMDLINE < /proc/cmdline; export CMDLINE
1220 for arg in $CMDLINE; do
1221 if [ "${arg}" = "debuginitrd" ]; then
1224 if [ "${arg##debuginitrd=}" != "${arg}" ]; then
1225 DEBUGINITRD=${arg##debuginitrd=}
1227 if [ "${arg##root=}" != "${arg}" ]; then
1232 # make debugshell() invoke subshell if $DEBUGINITRD=sh
1233 if [ "$DEBUGINITRD" = "sh" ]; then
1236 if is_yes "$RUN_SULOGIN_ON_ERR"; then
1237 add_linuxrc <<-'EOF'
1238 echo "debug shell disabled by /etc/sysconfig/system:RUN_SULOGIN_ON_ERR setting"
1241 add_linuxrc <<-'EOF'
1245 add_linuxrc <<-'EOF'
1253 if [ "$DEBUGINITRD" ]; then
1258 modules_add_linuxrc $MODULES
1260 # TODO: rewrite for busybox
1261 #if [ -n "$loopDev" ]; then
1262 # if [ ! -d /initrd ]; then
1266 # cp -a "$loopDev" "$DESTDIR/dev"
1267 # cp -a "$rootdev" "$DESTDIR/dev"
1268 # echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE"
1269 # echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE"
1270 # echo "echo Setting up loopback device $rootdev" >> $RCFILE
1271 # echo "losetup $rootdev /loopfs$loopFile" >> "$RCFILE"
1274 if is_yes "$USE_UDEV"; then
1278 find_modules_uvesafb
1281 if is_yes "$have_luks"; then
1285 if is_yes "$have_dmraid"; then
1289 if is_yes "$have_multipath"; then
1290 initrd_gen_multipath
1293 if is_yes "$USE_BLKID"; then
1297 if is_yes "$have_nfs"; then
1299 elif is_yes "$have_md"; then
1301 if is_yes "$have_lvm"; then
1304 initrd_gen_setrootdev
1306 elif is_yes "$have_lvm"; then
1309 initrd_gen_setrootdev
1312 if is_yes "$USE_TUXONICE"; then
1316 if is_yes "$USE_SUSPEND"; then
1320 # additional devs always needed
1321 [ ! -e "$DESTDIR/$rootdev_add" ] && inst $rootdev_add /dev
1323 if is_yes "$USE_UDEV"; then
1324 initrd_gen_stop_udevd
1327 if [ "$INITRDFS" = "initramfs" ]; then
1328 initrd_gen_initramfs_switchroot
1333 if is_yes "$FB_SPLASH"; then
1337 if is_yes "$FB_CON_DECOR"; then
1338 initrd_gen_fbcondecor
1341 IMAGE=$(mktemp -t initrd.img-XXXXXX) || die "mktemp failed"
1343 debug "Creating $INITRDFS image $IMAGE"
1346 dd if=/dev/zero of="$IMAGE" bs=1k count="$IMAGESIZE" 2> /dev/null
1347 mke2fs -q -F -b 1024 -m 0 "$IMAGE" 2>/dev/null 1>&2
1348 tune2fs -i 0 "$IMAGE" >/dev/null 2>&1
1350 local tmpmnt=$(mktemp -d -t initrd.mnt-XXXXXX)
1351 debug "Mounting ext2 image $IMAGE to $tmpmnt"
1352 mount -o loop -t ext2 "$IMAGE" "$tmpmnt"
1353 # We don't need this directory, so let's save space
1354 rm -rf "$tmpmnt"/lost+found
1356 debug "Copy recursively $DESTDIR -> $tmpmnt"
1357 cp -a $DESTDIR/* $tmpmnt
1363 genromfs -f "$IMAGE" -d "$DESTDIR" -V "PLD Linux/$kernel initrd"
1366 mkcramfs "$DESTDIR" "$IMAGE"
1369 (cd $DESTDIR; find . | cpio --quiet -H newc -o > "$IMAGE")
1372 die "Filesystem $INITRDFS not supported by $PROGRAM"
1375 CONFIG_BLK_DEV_RAM_SIZE=$(ikconfig | awk -F= '/^CONFIG_BLK_DEV_RAM_SIZE/{print $2}')
1376 if [ -z "$CONFIG_BLK_DEV_RAM_SIZE" ]; then
1377 CONFIG_BLK_DEV_RAM_SIZE=4096
1380 IMAGESIZE=$(du -ks $DESTDIR | awk '{print int(($1+1023+512)/1024)*1024}')
1381 debug "image size: $IMAGESIZE KiB ($DESTDIR)"
1382 if [ "$IMAGESIZE" -gt $CONFIG_BLK_DEV_RAM_SIZE ]; then
1383 warn "Your image size is larger than $CONFIG_BLK_DEV_RAM_SIZE, Be sure to boot kernel with ramdisk_size=$IMAGESIZE!"
1386 if ! is_no "$COMPRESS"; then
1387 compressor=$(find_compressor "$COMPRESS")
1388 debug "Compressing $target with $compressor"
1390 # TODO: the image name (specified from kernel.spec) already contains
1391 # extension, which is .gz most of the time.
1392 compress_image "$compressor" "$IMAGE" "$target" || {
1393 if [ $compressor != gzip ]; then
1394 warn "Could not compress with $compressor, retrying with gzip"
1395 compress_image gzip "$IMAGE" "$target" || die "compress failed with gzip" $?
1397 die "Could not compress image with $compressor"
1401 cp -a "$IMAGE" "$target"
1404 # XXX. check if bootsplash can output data to tmp dir not directly to initramfs image.
1405 if is_yes "$BOOT_SPLASH"; then
1406 initrd_gen_bootsplash "$target"
1409 rm -rf "$DESTDIR" "$IMAGE"
1411 # vim:ts=4:sw=4:noet:fdm=marker