#!/bin/sh msg () { [ "${quiet}" != "y" ] && echo $@; } err () { echo "ERROR: $@"; } msg ":: Loading Initramfs" echo mounting /bin/mount -t sysfs none /sys /bin/mount -t proc none /proc echo reading cmdline read CMDLINE /proc/sys/kernel/modprobe echo "CMDLINE=${CMDLINE}" for cmd in ${CMDLINE}; do echo "cmd=${cmd}" case "${cmd}" in \#*) break ;; # ignore everything after a # in the commandline [0123456Ss]) export runlevel="${cmd}" ;; single) export runlevel="S" ;; #some people use 'single' #Allow "init=X" to pass-through init=*) kinit_params="${kinit_params} ${cmd}" ;; # only export stuff that does work with dash :) *=*) cmd="$(replace -s= "${cmd}" '.' '_')" cmd="$(replace -s= "${cmd}" '-' '_')" export "${cmd}" ;; *) cmd="$(replace "${cmd}" '.' '_')" cmd="$(replace "${cmd}" '-' '_')" export "${cmd}=y" ;; esac done if [ -n "${disablehooks}" ]; then for d in $(replace "${disablehooks}" ','); do export "hook_${d}=disabled" done fi if [ -n "${disablemodules}" ]; then for d in $(replace "${disablemodules}" ','); do export "mod_${d}=disabled" done fi if [ -n "${earlymodules}" ]; then for m in $(replace "${earlymodules}" ','); do /sbin/modprobe -q ${m} > /dev/null 2>&1 done fi . /config for m in ${MODULES}; do TST="" eval "TST=\$mod_${m}" if [ "${TST}" != "disabled" ]; then /sbin/modprobe -q ${m} > /dev/null 2>&1 fi done if [ -e "/hooks" ]; then for h in ${HOOKS}; do TST="" eval "TST=\$hook_${h}" if [ "${TST}" != "disabled" ]; then run_hook () { msg "${h}: no run function defined"; } if [ -e "/hooks/${h}" ]; then . /hooks/${h} msg ":: Running Hook [${h}]" run_hook fi fi done fi if [ "${rootdelay}" != "0" ]; then msg -n "Waiting for devices to settle..." /bin/sleep "${rootdelay}" export rootdelay=0 export kinit_params="$kinit_params rootdelay=0" msg "done." fi if [ "${break}" = "y" ]; then echo ":: Break requested, type 'exit' to resume operation" echo " NOTE: klibc contains no 'ls' binary, use 'echo *' instead" PS1="ramfs$ " /bin/sh -i fi if [ ! -b "${root}" ]; then # This duplicates code from the filesystem hook # without this, mkinitcpio would fail for users who use # neither the udev hook, nor the filesystem hook msg "\nRoot device '${root}' doesn't exist, attempting to create it" eval $(/bin/parseblock "${root}") if [ "${BLOCKNAME}" = "unknown" ]; then echo "ERROR: Failed to parse block device name for '${root}'" elif [ -z "${BLOCKDEVICE}" ]; then echo "ERROR: Failed to parse block device ids for '${root}'" else export root="${BLOCKNAME}" echo "/bin/mknod \"${BLOCKNAME}\" b ${BLOCKDEVICE}" /bin/mknod "${BLOCKNAME}" b ${BLOCKDEVICE} >/dev/null fi if [ ! -b "${root}" ]; then err "Unable to create/detect root device '${root}'" echo "Dropping to a recovery shell... type 'exit' to reboot" echo "NOTE: klibc contains no 'ls' binary, use 'echo *' instead" echo "" echo "If the device '${root}' gets created while you are here," echo "try adding 'rootdelay=8' or higher to the kernel command-line" PS1="ramfs$ " /bin/sh -i msg "Rebooting..." /bin/reboot fi fi msg ":: Initramfs Completed - control passing to kinit" if [ -f "/message" ]; then msg "$(cat /message)" fi #Special handling if udev is running udevpid=$(/bin/minips -C udevd -o pid=) if [ -n "${udevpid}" ]; then /bin/kill -9 ${udevpid} /bin/sleep 0.01 fi exec /bin/kinit -- "root=${root}" ${kinit_params} "${runlevel}" > /dev/null 2>&1