From 13df5da839ea1496d5e47bc125ec71cbfe80b7d2 Mon Sep 17 00:00:00 2001 From: DanyLE Date: Tue, 1 Aug 2023 14:19:39 +0200 Subject: [PATCH] add missing recipe --- recipes-diya/initramfs/files/debug | 82 ++++++++++ recipes-diya/initramfs/files/e2fs | 28 ++++ recipes-diya/initramfs/files/exec | 29 ++++ recipes-diya/initramfs/files/init | 160 ++++++++++++++++++++ recipes-diya/initramfs/files/lvm | 13 ++ recipes-diya/initramfs/files/udev | 50 ++++++ recipes-diya/initramfs/recovery-boot_0.1.bb | 52 +++++++ 7 files changed, 414 insertions(+) create mode 100644 recipes-diya/initramfs/files/debug create mode 100755 recipes-diya/initramfs/files/e2fs create mode 100644 recipes-diya/initramfs/files/exec create mode 100755 recipes-diya/initramfs/files/init create mode 100644 recipes-diya/initramfs/files/lvm create mode 100644 recipes-diya/initramfs/files/udev create mode 100644 recipes-diya/initramfs/recovery-boot_0.1.bb diff --git a/recipes-diya/initramfs/files/debug b/recipes-diya/initramfs/files/debug new file mode 100644 index 0000000..00bfd7d --- /dev/null +++ b/recipes-diya/initramfs/files/debug @@ -0,0 +1,82 @@ +#!/bin/sh +# Copyright (C) 2011 O.S. Systems Software LTDA. +# Licensed on MIT + +# Adds support to dynamic debugging of initramfs using bootparam in +# following format: +# shell : starts a shell before and after each module +# shell=before: : starts a shell before is loaded and run +# shell=after: : starts a shell after is loaded and run +# +# shell-debug : run set -x as soon as possible +# shell-debug=before: : run set -x before is loaded and run +# shell-debug=after: : run set -x after is loaded and run + +DEBUG_SHELL="false" + +debug_hook_handler() { + status=$1 + module=$2 + + if [ -n "$bootparam_shell" ] && [ "$bootparam_shell" != "true" ]; then + shell_wanted_status=`expr $bootparam_shell : '\(.*\):.*'` + shell_wanted_module=`expr $bootparam_shell : '.*:\(.*\)'` + + if [ "$shell_wanted_status" = "before" ]; then + shell_wanted_status=pre + else + shell_wanted_status=post + fi + fi + + if [ "$bootparam_shell" = "true" ] || + ( [ "$status" = "$shell_wanted_status" ] && + [ "$module" = "$shell_wanted_module" ] ); then + if [ "$status" = "pre" ]; then + status_msg="before" + else + status_msg="after" + fi + + msg "Starting shell $status_msg $module..." + sh + fi + + if [ -n "$bootparam_shell_debug" ] && [ "$bootparam_shell_debug" != "true" ]; then + shell_debug_wanted_status=`expr $bootparam_shell_debug : '\(.*\):.*'` + shell_debug_wanted_module=`expr $bootparam_shell_debug : '.*:\(.*\)'` + + if [ "$shell_debug_wanted_status" = "before" ]; then + shell_debug_wanted_status=pre + else + shell_debug_wanted_status=post + fi + fi + + if [ "$bootparam_shell_debug" = "true" ] || + ( [ "$status" = "$shell_debug_wanted_status" ] && + [ "$module" = "$shell_debug_wanted_module" ] ); then + if [ "$DEBUG_SHELL" = "true" ]; then + return 0 + fi + + if [ "$status" = "pre" ]; then + status_msg="before" + else + status_msg="after" + fi + + msg "Starting shell debugging $status_msg $module..." + DEBUG_SHELL="true" + set -x + fi +} + +debug_enabled() { + return 0 +} + +debug_run() { + add_module_pre_hook "debug_hook_handler" + add_module_post_hook "debug_hook_handler" +} diff --git a/recipes-diya/initramfs/files/e2fs b/recipes-diya/initramfs/files/e2fs new file mode 100755 index 0000000..29f801a --- /dev/null +++ b/recipes-diya/initramfs/files/e2fs @@ -0,0 +1,28 @@ +#!/bin/sh +# Copyright (C) 2011 O.S. Systems Software LTDA. +# Licensed on MIT + +e2fs_enabled() { + return 0 +} + +e2fs_run() { + filesystems="ext4 ext3 ext2" + + # load modules + for fs in $filesystems; do + load_kernel_module $fs + done + + for fs in $filesystems; do + eval "fs_options=\$bootparam_${fs}" + if [ -n "$fs_options" ]; then + dev=`expr "$fs_options" : '\([^:]*\).*'` + path=`expr "$fs_options" : '[^:]*:\([^:]*\).*'` + + info "Mounting $dev as $fs on $path as $fs..." + mkdir -p $path + mount -t $fs $dev $path + fi + done +} diff --git a/recipes-diya/initramfs/files/exec b/recipes-diya/initramfs/files/exec new file mode 100644 index 0000000..a8e2432 --- /dev/null +++ b/recipes-diya/initramfs/files/exec @@ -0,0 +1,29 @@ +#!/bin/sh +# Copyright (C) 2017 O.S. Systems Software LTDA. +# Licensed on MIT + +EXEC_DIR=/exec.d # place to look for modules + +exec_enabled() { + return 0 +} + +exec_run() { + if [ ! -d $EXEC_DIR ]; then + msg "No contents to exec in $EXEC_DIR. Starting shell ..." + sh + fi + + # Load and run modules + for m in $EXEC_DIR/*; do + # Skip backup files + if [ "`echo $m | sed -e 's/\~$//'`" != "$m" ]; then + continue + fi + + debug "Starting $m" + + # process module + ./$m + done +} diff --git a/recipes-diya/initramfs/files/init b/recipes-diya/initramfs/files/init new file mode 100755 index 0000000..e1bcf41 --- /dev/null +++ b/recipes-diya/initramfs/files/init @@ -0,0 +1,160 @@ +#!/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: +# +# _enabled : check if the module ought to run (return 1 to skip) +# _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: +# pre +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: +# post +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 +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 + +# 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." diff --git a/recipes-diya/initramfs/files/lvm b/recipes-diya/initramfs/files/lvm new file mode 100644 index 0000000..7deeccb --- /dev/null +++ b/recipes-diya/initramfs/files/lvm @@ -0,0 +1,13 @@ +#!/bin/sh + +lvm_enabled() { + if ! lvscan |grep -i -w "inactive" &>/dev/null;then + return 1 + fi + return 0 +} + +lvm_run() { + lvm pvscan --cache --activate ay + udevadm trigger --action=add +} diff --git a/recipes-diya/initramfs/files/udev b/recipes-diya/initramfs/files/udev new file mode 100644 index 0000000..4898b89 --- /dev/null +++ b/recipes-diya/initramfs/files/udev @@ -0,0 +1,50 @@ +#!/bin/sh +# Copyright (C) 2011, 2012 O.S. Systems Software LTDA. +# Licensed on MIT + +udev_shutdown_hook_handler() { + status=$1 + module=$2 + if [ "$status" = "pre" ] && [ "$module" = "finish" ]; then + udevadm settle + killall `basename $_UDEV_DAEMON` 2>/dev/null + fi +} + +udev_daemon() { + OPTIONS="/sbin/udev/udevd /sbin/udevd /lib/udev/udevd /lib/systemd/systemd-udevd" + + for o in $OPTIONS; do + if [ -x "$o" ]; then + echo $o + return 0 + fi + done + + return 1 +} + +_UDEV_DAEMON=`udev_daemon` + +udev_enabled() { + if [ -z "$_UDEV_DAEMON" ]; then + msg "WARNING: Cannot find the udev daemon; daemon will not be started in initramfs." + return 1 + fi + + return 0 +} + +udev_run() { + add_module_pre_hook "udev_shutdown_hook_handler" + + mkdir -p /run + mkdir -p /var/run + + # Workaround if console=null, systemd-udevd needs valid stdin, stdout and stderr to work + sh -c "exec 4< /dev/console" || { exec 0> /dev/null; exec 1> /dev/null; exec 2> /dev/null; } + + $_UDEV_DAEMON --daemon + udevadm trigger --action=add + udevadm settle +} diff --git a/recipes-diya/initramfs/recovery-boot_0.1.bb b/recipes-diya/initramfs/recovery-boot_0.1.bb new file mode 100644 index 0000000..a6d3965 --- /dev/null +++ b/recipes-diya/initramfs/recovery-boot_0.1.bb @@ -0,0 +1,52 @@ +SUMMARY = "Modular initramfs system" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" +RDEPENDS:${PN} += "${VIRTUAL-RUNTIME_base-utils}" +RRECOMMENDS:${PN} = "${VIRTUAL-RUNTIME_base-utils-syslog}" + +FILESEXTRAPATHS:prepend := "${THISDIR}/files:" + +PR = "r4" + +inherit allarch + +SRC_URI = "file://init \ + file://exec \ + file://udev \ + file://e2fs \ + file://debug \ + file://lvm \ + " + +S = "${WORKDIR}" + +do_install() { + install -d ${D}/init.d + + # base + install -m 0755 ${WORKDIR}/init ${D}/init + + # exec + install -m 0755 ${WORKDIR}/exec ${D}/init.d/89-exec + + # udev + install -m 0755 ${WORKDIR}/udev ${D}/init.d/01-udev + + # e2fs + install -m 0755 ${WORKDIR}/e2fs ${D}/init.d/10-e2fs + + # debug + install -m 0755 ${WORKDIR}/debug ${D}/init.d/00-debug + + # lvm + install -m 0755 ${WORKDIR}/lvm ${D}/init.d/09-lvm + + + # Create device nodes expected by some kernels in initramfs + # before even executing /init. + install -d ${D}/dev + mknod -m 622 ${D}/dev/console c 5 1 +} + + +FILES:${PN} = "/init /init.d /dev" \ No newline at end of file