| #!/bin/sh |
| # Copyright (C) 2011 O.S. Systems Software LTDA. |
| # Licensed on MIT |
| # |
| # Provides the API to be used by the initramfs modules |
| # |
| # Modules need to provide the following functions: |
| # |
| # <module>_enabled : check if the module ought to run (return 1 to skip) |
| # <module>_run : do what is need |
| # |
| # Boot parameters are available on environment in the as: |
| # |
| # 'foo=value' as 'bootparam_foo=value' |
| # 'foo' as 'bootparam_foo=true' |
| # 'foo.bar[=value] as 'foo_bar=[value|true]' |
| |
| # Register a function to be called before running a module |
| # The hook is called as: |
| # <function> pre <module> |
| add_module_pre_hook() { |
| MODULE_PRE_HOOKS="$MODULE_PRE_HOOKS $1" |
| } |
| |
| # Register a function to be called after running a module |
| # The hook is called as: |
| # <function> post <module> |
| add_module_post_hook() { |
| MODULE_POST_HOOKS="$MODULE_POST_HOOKS $1" |
| } |
| |
| # Load kernel module |
| load_kernel_module() { |
| if modprobe $1 >/dev/null 2>&1; then |
| info "Loaded module $1" |
| else |
| debug "Failed to load module $1" |
| fi |
| } |
| |
| # Prints information |
| msg() { |
| echo "$@" >/dev/console |
| } |
| |
| # Prints information if verbose bootparam is used |
| info() { |
| [ -n "$bootparam_verbose" ] && echo "$@" >/dev/console |
| } |
| |
| # Prints information if debug bootparam is used |
| debug() { |
| [ -n "$bootparam_debug" ] && echo "DEBUG: $@" >/dev/console |
| } |
| |
| # Prints a message and start a endless loop |
| fatal() { |
| echo $1 >/dev/console |
| echo >/dev/console |
| |
| if [ -n "$bootparam_init_fatal_sh" ]; then |
| sh |
| else |
| while [ "true" ]; do |
| sleep 3600 |
| done |
| fi |
| } |
| |
| # Variables shared amoung modules |
| ROOTFS_DIR="/rootfs" # where to do the switch root |
| MODULE_PRE_HOOKS="" # functions to call before running each module |
| MODULE_POST_HOOKS="" # functions to call after running each module |
| MODULES_DIR=/init.d # place to look for modules |
| EFI_DIR=/sys/firmware/efi # place to store device firmware information |
| |
| # make mount stop complaining about missing /etc/fstab |
| touch /etc/fstab |
| |
| # initialize /proc, /sys, /run/lock and /var/lock |
| mkdir -p /proc /sys /run/lock /var/lock |
| mount -t proc proc /proc |
| mount -t sysfs sysfs /sys |
| |
| if [ -d $EFI_DIR ];then |
| mount -t efivarfs none /sys/firmware/efi/efivars |
| fi |
| |
| # populate bootparam environment |
| for p in `cat /proc/cmdline`; do |
| if [ -n "$quoted" ]; then |
| value="$value $p" |
| if [ "`echo $p | sed -e 's/\"$//'`" != "$p" ]; then |
| eval "bootparam_${quoted}=${value}" |
| unset quoted |
| fi |
| continue |
| fi |
| |
| opt=`echo $p | cut -d'=' -f1` |
| opt=`echo $opt | sed -e 'y/.-/__/'` |
| if [ "`echo $p | cut -d'=' -f1`" = "$p" ]; then |
| eval "bootparam_${opt}=true" |
| else |
| value="`echo $p | cut -d'=' -f2-`" |
| if [ "`echo $value | sed -e 's/^\"//'`" != "$value" ]; then |
| quoted=${opt} |
| continue |
| fi |
| eval "bootparam_${opt}=\"${value}\"" |
| fi |
| done |
| |
| # use /dev with devtmpfs |
| if grep -q devtmpfs /proc/filesystems; then |
| mkdir -p /dev |
| mount -t devtmpfs devtmpfs /dev |
| else |
| if [ ! -d /dev ]; then |
| fatal "ERROR: /dev doesn't exist and kernel doesn't has devtmpfs enabled." |
| fi |
| fi |
| |
| mkdir $ROOTFS_DIR |
| |
| # Load and run modules |
| for m in $MODULES_DIR/*; do |
| # Skip backup files |
| if [ "`echo $m | sed -e 's/\~$//'`" != "$m" ]; then |
| continue |
| fi |
| |
| module=`basename $m | cut -d'-' -f 2` |
| debug "Loading module $module" |
| |
| # pre hooks |
| for h in $MODULE_PRE_HOOKS; do |
| debug "Calling module hook (pre): $h" |
| eval "$h pre $module" |
| debug "Finished module hook (pre): $h" |
| done |
| |
| # process module |
| . $m |
| |
| if ! eval "${module}_enabled"; then |
| debug "Skipping module $module" |
| continue |
| fi |
| |
| debug "Running ${module}_run" |
| eval "${module}_run" |
| |
| # post hooks |
| for h in $MODULE_POST_HOOKS; do |
| debug "Calling module hook (post): $h" |
| eval "$h post $module" |
| debug "Finished module hook (post): $h" |
| done |
| done |
| |
| # Catch all |
| fatal "ERROR: Initramfs failed to initialize the system." |