#!/bin/sh # mkinitcpio - modular tool for building an init ramfs cpio image # # IMPORTANT: We need to keep a common base syntax here # because some of these hooks/scripts need to run under # the klibc shell or even busybox's ash - therefore, the # following constraints should be enforced: # variables should be quoted and bracketed "${SOMEVAR}" # inline execution should be done with $() instead of backticks # use "x${var}" = "x" to test for nulls/empty strings # incase of embedded spaces, quote all path names and string comarpisons # # Settings BASEDIR="" FILELIST="/tmp/.tmpfilelist" KERNELVERSION="$(uname -r)" FUNCTIONS="functions" #/lib/initramfs/functions CONFIG="mkinitcpio.conf" HOOKDIR="hooks" INSTDIR="install" MODULE_FILE="" SAVELIST="" GENIMG="" APPEND="" QUIET="n" APPNAME=$(basename "${0}") usage () { echo "${APPNAME}: usage" echo " -c CONFIG Use CONFIG file. default: /etc/mkinitcpio.conf" echo " -k KERNELVERSION Use KERNELVERSION. default: $(uname -r)" echo " -s NAME Save filelist. default: no" echo " -b BASEDIR Use BASEDIR. default: /" echo " -g IMAGE Generate a cpio image as IMAGE. default: no" echo " -a NAME Append to an existing filelist. default: no" echo " -q Quiet output. Default: no" echo " -H HOOKNAME Output help for hook 'HOOKNAME'." echo " -h This message." exit 1 } while getopts 'c:k:s:b:g:a:qH:h' arg; do case "$arg" in c) CONFIG="$OPTARG" ;; k) KERNELVERSION="$OPTARG" ;; s) SAVELIST="y"; FILELIST="$OPTARG" ;; b) BASEDIR="$OPTARG" ;; g) GENIMG="$OPTARG" ;; a) APPEND="y" FILELIST="$OPTARG" ;; q) QUIET="y" ;; H) source "${INSTDIR}/${OPTARG}"; echo "Help for hook '${OPTARG}':" help exit 0 ;; h|?) usage ;; *) echo "invalid argument '$arg'"; usage ;; esac done shift $(($OPTIND - 1)) # append a trailing / if needed if [ "${BASEDIR:${#BASEDIR}}" == "/" ]; then BASEDIR="${BASEDIR:0:${#BASEDIR}-1}" fi MODULEDIR="${BASEDIR}/lib/modules/${KERNELVERSION}" if [ "x${BASEDIR}" != "x" ]; then if [ "${BASEDIR:0:1}" != "/" ]; then echo "base directory '${BASEDIR}' must be an absolute path" exit 1 elif [ ! -d "${BASEDIR}" ]; then echo "base directory '${BASEDIR}' does not exist or is not a directory" exit 1 fi fi if [ ! -f "${CONFIG}" ]; then echo "config file '${CONFIG}' cannot be found, aborting..." exit 1 fi source "${CONFIG}" if [ -f "${FILELIST}" -a "x${APPEND}" == "x" ]; then if [ "x${SAVELIST}" == "x" ]; then rm ${FILELIST} touch "${FILELIST}" else echo "destination file list '${FILELIST}' exists - remove before running" exit 1 fi elif [ -f "${DESTIMG}" ]; then echo "destination image '${DESTIMG}' exists - remove before running" exit 1 else touch "${FILELIST}" fi source "${FUNCTIONS}" #parse 'global' hook, as defined in ${CONFIG} parse_hook for hook in $HOOKS; do unset MODULES unset BINARIES unset FILES install () { msg "${hook}: no install function..."; } if grep "install" "${INSTDIR}/${hook}" >/dev/null 2>&1; then source "${INSTDIR}/${hook}" install parse_hook fi done if [ "${HAS_MODULES}" == "y" ]; then [ -e /tmp${MODULEDIR}/ ] && rm -r /tmp${MODULEDIR}/ cp --parents $(grep "file /lib/modules" ${FILELIST} | awk '{print $2}') /tmp/ depmod -b /tmp ${KERNELVERSION} add_file /tmp${MODULEDIR}/modules.dep ${MODULEDIR}/modules.dep add_file /tmp${MODULEDIR}/modules.alias ${MODULEDIR}/modules.alias add_file /tmp${MODULEDIR}/modules.symbols ${MODULEDIR}/modules.symbols add_file "${MODULE_FILE}" "/modules" fi if [ "x$GENIMG" != "x" ]; then if ! gen_init_cpio ${FILELIST} | gzip -9 > "${GENIMG}"; then err "Failed to create '${GENIMG}' image" fi if [ "x${SAVELIST}" == "x" ]; then rm ${FILELIST} fi fi [ -e "${MODULE_FILE}" ] && rm "${MODULE_FILE}" #vim:set ft=sh ts=4 sw=4 noet: