diff options
7 files changed, 401 insertions, 0 deletions
diff --git a/meta/recipes-core/initrdscripts/initramfs-framework/debug b/meta/recipes-core/initrdscripts/initramfs-framework/debug new file mode 100644 index 0000000000..00bfd7d3f5 --- /dev/null +++ b/meta/recipes-core/initrdscripts/initramfs-framework/debug | |||
| @@ -0,0 +1,82 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # Copyright (C) 2011 O.S. Systems Software LTDA. | ||
| 3 | # Licensed on MIT | ||
| 4 | |||
| 5 | # Adds support to dynamic debugging of initramfs using bootparam in | ||
| 6 | # following format: | ||
| 7 | # shell : starts a shell before and after each module | ||
| 8 | # shell=before:<module> : starts a shell before <module> is loaded and run | ||
| 9 | # shell=after:<module> : starts a shell after <module> is loaded and run | ||
| 10 | # | ||
| 11 | # shell-debug : run set -x as soon as possible | ||
| 12 | # shell-debug=before:<module> : run set -x before <module> is loaded and run | ||
| 13 | # shell-debug=after:<module> : run set -x after <module> is loaded and run | ||
| 14 | |||
| 15 | DEBUG_SHELL="false" | ||
| 16 | |||
| 17 | debug_hook_handler() { | ||
| 18 | status=$1 | ||
| 19 | module=$2 | ||
| 20 | |||
| 21 | if [ -n "$bootparam_shell" ] && [ "$bootparam_shell" != "true" ]; then | ||
| 22 | shell_wanted_status=`expr $bootparam_shell : '\(.*\):.*'` | ||
| 23 | shell_wanted_module=`expr $bootparam_shell : '.*:\(.*\)'` | ||
| 24 | |||
| 25 | if [ "$shell_wanted_status" = "before" ]; then | ||
| 26 | shell_wanted_status=pre | ||
| 27 | else | ||
| 28 | shell_wanted_status=post | ||
| 29 | fi | ||
| 30 | fi | ||
| 31 | |||
| 32 | if [ "$bootparam_shell" = "true" ] || | ||
| 33 | ( [ "$status" = "$shell_wanted_status" ] && | ||
| 34 | [ "$module" = "$shell_wanted_module" ] ); then | ||
| 35 | if [ "$status" = "pre" ]; then | ||
| 36 | status_msg="before" | ||
| 37 | else | ||
| 38 | status_msg="after" | ||
| 39 | fi | ||
| 40 | |||
| 41 | msg "Starting shell $status_msg $module..." | ||
| 42 | sh | ||
| 43 | fi | ||
| 44 | |||
| 45 | if [ -n "$bootparam_shell_debug" ] && [ "$bootparam_shell_debug" != "true" ]; then | ||
| 46 | shell_debug_wanted_status=`expr $bootparam_shell_debug : '\(.*\):.*'` | ||
| 47 | shell_debug_wanted_module=`expr $bootparam_shell_debug : '.*:\(.*\)'` | ||
| 48 | |||
| 49 | if [ "$shell_debug_wanted_status" = "before" ]; then | ||
| 50 | shell_debug_wanted_status=pre | ||
| 51 | else | ||
| 52 | shell_debug_wanted_status=post | ||
| 53 | fi | ||
| 54 | fi | ||
| 55 | |||
| 56 | if [ "$bootparam_shell_debug" = "true" ] || | ||
| 57 | ( [ "$status" = "$shell_debug_wanted_status" ] && | ||
| 58 | [ "$module" = "$shell_debug_wanted_module" ] ); then | ||
| 59 | if [ "$DEBUG_SHELL" = "true" ]; then | ||
| 60 | return 0 | ||
| 61 | fi | ||
| 62 | |||
| 63 | if [ "$status" = "pre" ]; then | ||
| 64 | status_msg="before" | ||
| 65 | else | ||
| 66 | status_msg="after" | ||
| 67 | fi | ||
| 68 | |||
| 69 | msg "Starting shell debugging $status_msg $module..." | ||
| 70 | DEBUG_SHELL="true" | ||
| 71 | set -x | ||
| 72 | fi | ||
| 73 | } | ||
| 74 | |||
| 75 | debug_enabled() { | ||
| 76 | return 0 | ||
| 77 | } | ||
| 78 | |||
| 79 | debug_run() { | ||
| 80 | add_module_pre_hook "debug_hook_handler" | ||
| 81 | add_module_post_hook "debug_hook_handler" | ||
| 82 | } | ||
diff --git a/meta/recipes-core/initrdscripts/initramfs-framework/e2fs b/meta/recipes-core/initrdscripts/initramfs-framework/e2fs new file mode 100755 index 0000000000..29f801a7bd --- /dev/null +++ b/meta/recipes-core/initrdscripts/initramfs-framework/e2fs | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # Copyright (C) 2011 O.S. Systems Software LTDA. | ||
| 3 | # Licensed on MIT | ||
| 4 | |||
| 5 | e2fs_enabled() { | ||
| 6 | return 0 | ||
| 7 | } | ||
| 8 | |||
| 9 | e2fs_run() { | ||
| 10 | filesystems="ext4 ext3 ext2" | ||
| 11 | |||
| 12 | # load modules | ||
| 13 | for fs in $filesystems; do | ||
| 14 | load_kernel_module $fs | ||
| 15 | done | ||
| 16 | |||
| 17 | for fs in $filesystems; do | ||
| 18 | eval "fs_options=\$bootparam_${fs}" | ||
| 19 | if [ -n "$fs_options" ]; then | ||
| 20 | dev=`expr "$fs_options" : '\([^:]*\).*'` | ||
| 21 | path=`expr "$fs_options" : '[^:]*:\([^:]*\).*'` | ||
| 22 | |||
| 23 | info "Mounting $dev as $fs on $path as $fs..." | ||
| 24 | mkdir -p $path | ||
| 25 | mount -t $fs $dev $path | ||
| 26 | fi | ||
| 27 | done | ||
| 28 | } | ||
diff --git a/meta/recipes-core/initrdscripts/initramfs-framework/finish b/meta/recipes-core/initrdscripts/initramfs-framework/finish new file mode 100755 index 0000000000..bedd803f10 --- /dev/null +++ b/meta/recipes-core/initrdscripts/initramfs-framework/finish | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # Copyright (C) 2011 O.S. Systems Software LTDA. | ||
| 3 | # Licensed on MIT | ||
| 4 | |||
| 5 | finish_enabled() { | ||
| 6 | return 0 | ||
| 7 | } | ||
| 8 | |||
| 9 | finish_run() { | ||
| 10 | if [ -n "$ROOTFS_DIR" ]; then | ||
| 11 | if [ -n "$bootparam_rootdelay" ]; then | ||
| 12 | debug "Sleeping for $rootdelay second(s) to wait root to settle..." | ||
| 13 | sleep $bootparam_rootdelay | ||
| 14 | fi | ||
| 15 | |||
| 16 | if [ -n "$bootparam_root" ]; then | ||
| 17 | debug "No e2fs compatible filesystem has been mounted, mounting $bootparam_root..." | ||
| 18 | |||
| 19 | if [ "${bootparam_root:0:5}" = "UUID=" ]; then | ||
| 20 | bootparam_root="/dev/disk/by-uuid/${bootparam_root/UUID=/}" | ||
| 21 | fi | ||
| 22 | |||
| 23 | if [ -e "$bootparam_root" ]; then | ||
| 24 | mount $bootparam_root $ROOTFS_DIR | ||
| 25 | else | ||
| 26 | debug "root '$bootparam_root' doesn't exist." | ||
| 27 | fi | ||
| 28 | fi | ||
| 29 | |||
| 30 | if [ ! -d $ROOTFS_DIR/dev ]; then | ||
| 31 | fatal "ERROR: There's no '/dev' on rootfs." | ||
| 32 | fi | ||
| 33 | |||
| 34 | info "Switching root to '$ROOTFS_DIR'..." | ||
| 35 | |||
| 36 | debug "Moving /dev, /proc and /sys onto rootfs..." | ||
| 37 | mount --move /dev $ROOTFS_DIR/dev | ||
| 38 | mount --move /proc $ROOTFS_DIR/proc | ||
| 39 | mount --move /sys $ROOTFS_DIR/sys | ||
| 40 | |||
| 41 | cd $ROOTFS_DIR | ||
| 42 | exec switch_root -c /dev/console $ROOTFS_DIR /sbin/init | ||
| 43 | else | ||
| 44 | debug "No rootfs has been set" | ||
| 45 | fi | ||
| 46 | } | ||
diff --git a/meta/recipes-core/initrdscripts/initramfs-framework/init b/meta/recipes-core/initrdscripts/initramfs-framework/init new file mode 100755 index 0000000000..fc4b0db4b4 --- /dev/null +++ b/meta/recipes-core/initrdscripts/initramfs-framework/init | |||
| @@ -0,0 +1,136 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # Copyright (C) 2011 O.S. Systems Software LTDA. | ||
| 3 | # Licensed on MIT | ||
| 4 | # | ||
| 5 | # Provides the API to be used by the initramfs modules | ||
| 6 | # | ||
| 7 | # Modules need to provide the following functions: | ||
| 8 | # | ||
| 9 | # <module>_enabled : check if the module ought to run (return 1 to skip) | ||
| 10 | # <module>_run : do what is need | ||
| 11 | # | ||
| 12 | # Boot parameters are available on environment in the as: | ||
| 13 | # | ||
| 14 | # 'foo=value' as 'bootparam_foo=value' | ||
| 15 | # 'foo' as 'bootparam_foo=true' | ||
| 16 | |||
| 17 | # Register a function to be called before running a module | ||
| 18 | # The hook is called as: | ||
| 19 | # <function> pre <module> | ||
| 20 | add_module_pre_hook() { | ||
| 21 | MODULE_PRE_HOOKS="$MODULE_PRE_HOOKS $1" | ||
| 22 | } | ||
| 23 | |||
| 24 | # Register a function to be called after running a module | ||
| 25 | # The hook is called as: | ||
| 26 | # <function> post <module> | ||
| 27 | add_module_post_hook() { | ||
| 28 | MODULE_POST_HOOKS="$MODULE_POST_HOOKS $1" | ||
| 29 | } | ||
| 30 | |||
| 31 | # Load kernel module | ||
| 32 | load_kernel_module() { | ||
| 33 | if modprobe $1 >/dev/null 2>&1; then | ||
| 34 | info "Loaded module $1" | ||
| 35 | else | ||
| 36 | debug "Failed to load module $1" | ||
| 37 | fi | ||
| 38 | } | ||
| 39 | |||
| 40 | # Prints information | ||
| 41 | msg() { | ||
| 42 | echo "$@" >/dev/console | ||
| 43 | } | ||
| 44 | |||
| 45 | # Prints information if verbose bootparam is used | ||
| 46 | info() { | ||
| 47 | [ -n "$bootparam_verbose" ] && echo "$@" >/dev/console | ||
| 48 | } | ||
| 49 | |||
| 50 | # Prints information if debug bootparam is used | ||
| 51 | debug() { | ||
| 52 | [ -n "$bootparam_debug" ] && echo "DEBUG: $@" >/dev/console | ||
| 53 | } | ||
| 54 | |||
| 55 | # Prints a message and start a endless loop | ||
| 56 | fatal() { | ||
| 57 | echo $1 >/dev/console | ||
| 58 | echo >/dev/console | ||
| 59 | |||
| 60 | while [ "true" ]; do | ||
| 61 | sleep 3600 | ||
| 62 | done | ||
| 63 | } | ||
| 64 | |||
| 65 | # Variables shared amoung modules | ||
| 66 | ROOTFS_DIR="/rootfs" # where to do the switch root | ||
| 67 | MODULE_PRE_HOOKS="" # functions to call before running each module | ||
| 68 | MODULE_POST_HOOKS="" # functions to call after running each module | ||
| 69 | MODULES_DIR=/init.d # place to look for modules | ||
| 70 | |||
| 71 | # initialize /proc and /sys | ||
| 72 | mkdir -p /proc /sys | ||
| 73 | mount -t proc proc /proc | ||
| 74 | mount -t sysfs sysfs /sys | ||
| 75 | |||
| 76 | # populate bootparam environment | ||
| 77 | for p in `cat /proc/cmdline`; do | ||
| 78 | opt="${p%%=*}" | ||
| 79 | opt=${opt/-/_} | ||
| 80 | if [ "${p/=/}" = "$p" ]; then | ||
| 81 | eval "bootparam_${opt}=true" | ||
| 82 | else | ||
| 83 | eval "bootparam_${opt}=\"${p#*=}\"" | ||
| 84 | fi | ||
| 85 | done | ||
| 86 | |||
| 87 | # use /dev with devtmpfs | ||
| 88 | if grep -q devtmpfs /proc/filesystems; then | ||
| 89 | mkdir -p /dev | ||
| 90 | mount -t devtmpfs devtmpfs /dev | ||
| 91 | else | ||
| 92 | if [ ! -d /dev ]; then | ||
| 93 | fatal "ERROR: /dev doesn't exist and kernel doesn't has devtmpfs enabled." | ||
| 94 | fi | ||
| 95 | fi | ||
| 96 | |||
| 97 | mkdir $ROOTFS_DIR | ||
| 98 | |||
| 99 | # Load and run modules | ||
| 100 | for m in $MODULES_DIR/*; do | ||
| 101 | # Skip backup files | ||
| 102 | if [ "${m/\~/}" != "$m" ]; then | ||
| 103 | continue | ||
| 104 | fi | ||
| 105 | |||
| 106 | module=`basename $m | cut -d'-' -f 2` | ||
| 107 | debug "Loading module $module" | ||
| 108 | |||
| 109 | # pre hooks | ||
| 110 | for h in $MODULE_PRE_HOOKS; do | ||
| 111 | debug "Calling module hook (pre): $h" | ||
| 112 | eval "$h pre $module" | ||
| 113 | debug "Finished module hook (pre): $h" | ||
| 114 | done | ||
| 115 | |||
| 116 | # process module | ||
| 117 | source $m | ||
| 118 | |||
| 119 | if ! eval "${module}_enabled"; then | ||
| 120 | debug "Skipping module $module" | ||
| 121 | continue | ||
| 122 | fi | ||
| 123 | |||
| 124 | debug "Running ${module}_run" | ||
| 125 | eval "${module}_run" | ||
| 126 | |||
| 127 | # post hooks | ||
| 128 | for h in $MODULE_POST_HOOKS; do | ||
| 129 | debug "Calling module hook (post): $h" | ||
| 130 | eval "$h post $module" | ||
| 131 | debug "Finished module hook (post): $h" | ||
| 132 | done | ||
| 133 | done | ||
| 134 | |||
| 135 | # Catch all | ||
| 136 | fatal "ERROR: Initramfs failed to initialize the system." | ||
diff --git a/meta/recipes-core/initrdscripts/initramfs-framework/mdev b/meta/recipes-core/initrdscripts/initramfs-framework/mdev new file mode 100644 index 0000000000..a5df1d717a --- /dev/null +++ b/meta/recipes-core/initrdscripts/initramfs-framework/mdev | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # Copyright (C) 2011 O.S. Systems Software LTDA. | ||
| 3 | # Licensed on MIT | ||
| 4 | |||
| 5 | mdev_enabled() { | ||
| 6 | if [ ! -e /sbin/mdev ]; then | ||
| 7 | debug "/sbin/mdev doesn't exist" | ||
| 8 | return 1 | ||
| 9 | fi | ||
| 10 | |||
| 11 | return 0 | ||
| 12 | } | ||
| 13 | |||
| 14 | mdev_run() { | ||
| 15 | # setup the environment | ||
| 16 | mount -t tmpfs tmpfs /dev | ||
| 17 | |||
| 18 | mkdir -m 1777 /dev/shm | ||
| 19 | |||
| 20 | mkdir -m 0755 /dev/pts | ||
| 21 | mount -t devpts devpts /dev/pts | ||
| 22 | |||
| 23 | echo /sbin/mdev > /proc/sys/kernel/hotplug | ||
| 24 | mdev -s | ||
| 25 | |||
| 26 | # load modules for devices | ||
| 27 | find /sys -name modalias | while read m; do | ||
| 28 | load_kernel_module $(cat $m) | ||
| 29 | done | ||
| 30 | } | ||
diff --git a/meta/recipes-core/initrdscripts/initramfs-framework/udev b/meta/recipes-core/initrdscripts/initramfs-framework/udev new file mode 100644 index 0000000000..9ea8aa3641 --- /dev/null +++ b/meta/recipes-core/initrdscripts/initramfs-framework/udev | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # Copyright (C) 2011 O.S. Systems Software LTDA. | ||
| 3 | # Licensed on MIT | ||
| 4 | |||
| 5 | udev_enabled() { | ||
| 6 | if [ ! -e /sbin/udevd ]; then | ||
| 7 | debug "/sbin/udev doesn't exist" | ||
| 8 | return 1 | ||
| 9 | fi | ||
| 10 | |||
| 11 | return 0 | ||
| 12 | } | ||
| 13 | |||
| 14 | udev_run() { | ||
| 15 | mkdir -p /run | ||
| 16 | |||
| 17 | udevd --daemon > /dev/null | ||
| 18 | udevadm trigger --action=add | ||
| 19 | udevadm settle | ||
| 20 | |||
| 21 | killall udevd 2>/dev/null | ||
| 22 | } | ||
diff --git a/meta/recipes-core/initrdscripts/initramfs-framework_1.0.bb b/meta/recipes-core/initrdscripts/initramfs-framework_1.0.bb new file mode 100644 index 0000000000..58e41d4d4c --- /dev/null +++ b/meta/recipes-core/initrdscripts/initramfs-framework_1.0.bb | |||
| @@ -0,0 +1,57 @@ | |||
| 1 | DESCRIPTION = "initramfs modular system" | ||
| 2 | LICENSE = "MIT" | ||
| 3 | LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" | ||
| 4 | RDEPENDS = "busybox" | ||
| 5 | |||
| 6 | inherit allarch | ||
| 7 | |||
| 8 | SRC_URI = "file://init \ | ||
| 9 | file://finish \ | ||
| 10 | file://mdev \ | ||
| 11 | file://udev \ | ||
| 12 | file://e2fs \ | ||
| 13 | file://debug" | ||
| 14 | |||
| 15 | do_install() { | ||
| 16 | install -d ${D}/init.d | ||
| 17 | |||
| 18 | # base | ||
| 19 | install -m 0755 ${WORKDIR}/init ${D}/init | ||
| 20 | install -m 0755 ${WORKDIR}/finish ${D}/init.d/99-finish | ||
| 21 | |||
| 22 | # mdev | ||
| 23 | install -m 0755 ${WORKDIR}/mdev ${D}/init.d/01-mdev | ||
| 24 | |||
| 25 | # udev | ||
| 26 | install -m 0755 ${WORKDIR}/udev ${D}/init.d/01-udev | ||
| 27 | |||
| 28 | # e2fs | ||
| 29 | install -m 0755 ${WORKDIR}/e2fs ${D}/init.d/10-e2fs | ||
| 30 | |||
| 31 | # debug | ||
| 32 | install -m 0755 ${WORKDIR}/debug ${D}/init.d/00-debug | ||
| 33 | } | ||
| 34 | |||
| 35 | PACKAGES = "${PN}-base \ | ||
| 36 | initramfs-module-mdev \ | ||
| 37 | initramfs-module-udev \ | ||
| 38 | initramfs-module-e2fs \ | ||
| 39 | initramfs-module-debug" | ||
| 40 | |||
| 41 | FILES_${PN}-base = "/init /init.d/99-finish" | ||
| 42 | |||
| 43 | DESCRIPTION_initramfs-module-mdev = "initramfs support for mdev" | ||
| 44 | RDEPENDS_initramfs-module-mdev = "${PN}-base" | ||
| 45 | FILES_initramfs-module-mdev = "/init.d/01-mdev" | ||
| 46 | |||
| 47 | DESCRIPTION_initramfs-module-udev = "initramfs support for udev" | ||
| 48 | RDEPENDS_initramfs-module-udev = "${PN}-base udev udev-utils" | ||
| 49 | FILES_initramfs-module-udev = "/init.d/01-udev" | ||
| 50 | |||
| 51 | DESCRIPTION_initramfs-module-e2fs = "initramfs support for ext4/ext3/ext2 filesystems" | ||
| 52 | RDEPENDS_initramfs-module-e2fs = "${PN}-base" | ||
| 53 | FILES_initramfs-module-e2fs = "/init.d/10-e2fs" | ||
| 54 | |||
| 55 | DESCRIPTION_initramfs-module-debug = "initramfs dynamic debug support" | ||
| 56 | RDEPENDS_initramfs-module-debug = "${PN}-base" | ||
| 57 | FILES_initramfs-module-debug = "/init.d/00-debug" | ||
