summaryrefslogtreecommitdiffstats
path: root/meta/recipes-core/initrdscripts/initramfs-framework
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-core/initrdscripts/initramfs-framework')
-rw-r--r--meta/recipes-core/initrdscripts/initramfs-framework/debug82
-rwxr-xr-xmeta/recipes-core/initrdscripts/initramfs-framework/e2fs28
-rwxr-xr-xmeta/recipes-core/initrdscripts/initramfs-framework/finish47
-rwxr-xr-xmeta/recipes-core/initrdscripts/initramfs-framework/init140
-rw-r--r--meta/recipes-core/initrdscripts/initramfs-framework/mdev30
-rw-r--r--meta/recipes-core/initrdscripts/initramfs-framework/udev45
6 files changed, 372 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
15DEBUG_SHELL="false"
16
17debug_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
75debug_enabled() {
76 return 0
77}
78
79debug_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
5e2fs_enabled() {
6 return 0
7}
8
9e2fs_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..325f47be40
--- /dev/null
+++ b/meta/recipes-core/initrdscripts/initramfs-framework/finish
@@ -0,0 +1,47 @@
1#!/bin/sh
2# Copyright (C) 2011 O.S. Systems Software LTDA.
3# Licensed on MIT
4
5finish_enabled() {
6 return 0
7}
8
9finish_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 [ "`echo ${bootparam_root} | cut -c1-5`" = "UUID=" ]; then
20 root_uuid=`echo $bootparam_root | cut -c6-`
21 bootparam_root="/dev/disk/by-uuid/$root_uuid"
22 fi
23
24 if [ -e "$bootparam_root" ]; then
25 mount $bootparam_root $ROOTFS_DIR
26 else
27 debug "root '$bootparam_root' doesn't exist."
28 fi
29 fi
30
31 if [ ! -d $ROOTFS_DIR/dev ]; then
32 fatal "ERROR: There's no '/dev' on rootfs."
33 fi
34
35 info "Switching root to '$ROOTFS_DIR'..."
36
37 debug "Moving /dev, /proc and /sys onto rootfs..."
38 mount --move /dev $ROOTFS_DIR/dev
39 mount --move /proc $ROOTFS_DIR/proc
40 mount --move /sys $ROOTFS_DIR/sys
41
42 cd $ROOTFS_DIR
43 exec switch_root -c /dev/console $ROOTFS_DIR /sbin/init
44 else
45 debug "No rootfs has been set"
46 fi
47}
diff --git a/meta/recipes-core/initrdscripts/initramfs-framework/init b/meta/recipes-core/initrdscripts/initramfs-framework/init
new file mode 100755
index 0000000000..95fa9fb1a0
--- /dev/null
+++ b/meta/recipes-core/initrdscripts/initramfs-framework/init
@@ -0,0 +1,140 @@
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>
20add_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>
27add_module_post_hook() {
28 MODULE_POST_HOOKS="$MODULE_POST_HOOKS $1"
29}
30
31# Load kernel module
32load_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
41msg() {
42 echo "$@" >/dev/console
43}
44
45# Prints information if verbose bootparam is used
46info() {
47 [ -n "$bootparam_verbose" ] && echo "$@" >/dev/console
48}
49
50# Prints information if debug bootparam is used
51debug() {
52 [ -n "$bootparam_debug" ] && echo "DEBUG: $@" >/dev/console
53}
54
55# Prints a message and start a endless loop
56fatal() {
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
66ROOTFS_DIR="/rootfs" # where to do the switch root
67MODULE_PRE_HOOKS="" # functions to call before running each module
68MODULE_POST_HOOKS="" # functions to call after running each module
69MODULES_DIR=/init.d # place to look for modules
70
71# make mount stop complaining about missing /etc/fstab
72touch /etc/fstab
73
74# initialize /proc, /sys and /var/lock
75mkdir -p /proc /sys /var/lock
76mount -t proc proc /proc
77mount -t sysfs sysfs /sys
78
79# populate bootparam environment
80for p in `cat /proc/cmdline`; do
81 opt=`echo $p | cut -d'=' -f1`
82 opt=`echo $opt | sed -e 's/-/_/'`
83 if [ "`echo $p | cut -d'=' -f1`" = "$p" ]; then
84 eval "bootparam_${opt}=true"
85 else
86 value="`echo $p | cut -d'=' -f2-`"
87 eval "bootparam_${opt}=\"${value}\""
88 fi
89done
90
91# use /dev with devtmpfs
92if grep -q devtmpfs /proc/filesystems; then
93 mkdir -p /dev
94 mount -t devtmpfs devtmpfs /dev
95else
96 if [ ! -d /dev ]; then
97 fatal "ERROR: /dev doesn't exist and kernel doesn't has devtmpfs enabled."
98 fi
99fi
100
101mkdir $ROOTFS_DIR
102
103# Load and run modules
104for m in $MODULES_DIR/*; do
105 # Skip backup files
106 if [ "`echo $m | sed -e 's/\~$//'`" != "$m" ]; then
107 continue
108 fi
109
110 module=`basename $m | cut -d'-' -f 2`
111 debug "Loading module $module"
112
113 # pre hooks
114 for h in $MODULE_PRE_HOOKS; do
115 debug "Calling module hook (pre): $h"
116 eval "$h pre $module"
117 debug "Finished module hook (pre): $h"
118 done
119
120 # process module
121 . $m
122
123 if ! eval "${module}_enabled"; then
124 debug "Skipping module $module"
125 continue
126 fi
127
128 debug "Running ${module}_run"
129 eval "${module}_run"
130
131 # post hooks
132 for h in $MODULE_POST_HOOKS; do
133 debug "Calling module hook (post): $h"
134 eval "$h post $module"
135 debug "Finished module hook (post): $h"
136 done
137done
138
139# Catch all
140fatal "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
5mdev_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
14mdev_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..bb462dc448
--- /dev/null
+++ b/meta/recipes-core/initrdscripts/initramfs-framework/udev
@@ -0,0 +1,45 @@
1#!/bin/sh
2# Copyright (C) 2011, 2012 O.S. Systems Software LTDA.
3# Licensed on MIT
4
5udev_shutdown_hook_handler() {
6 status=$1
7 module=$2
8 if [ "$status" = "pre" ] && [ "$module" = "finish" ]; then
9 killall `basename $_UDEV_DAEMON` 2>/dev/null
10 fi
11}
12
13udev_daemon() {
14 OPTIONS="/sbin/udev/udevd /sbin/udevd /lib/udev/udevd /lib/systemd/systemd-udevd"
15
16 for o in $OPTIONS; do
17 if [ -x "$o" ]; then
18 echo $o
19 return 0
20 fi
21 done
22
23 return 1
24}
25
26_UDEV_DAEMON=`udev_daemon`
27
28udev_enabled() {
29 if [ -z "$_UDEV_DAEMON" ]; then
30 msg "WARNING: Cannot find the udev daemon; daemon will not be started in initramfs."
31 return 1
32 fi
33
34 return 0
35}
36
37udev_run() {
38 add_module_pre_hook "udev_shutdown_hook_handler"
39
40 mkdir -p /run
41
42 $_UDEV_DAEMON --daemon
43 udevadm trigger --action=add
44 udevadm settle
45}