#!/bin/sh umask 0022 # Defaults keep="n" CONFDIR="/etc/mkinitramfs" verbose="n" errors_to="2>/dev/null" # BUSYBOXDIR="/usr/lib/initramfs-tools/bin/" BUSYBOXDIR="/bin" OPTIONS=`getopt -o d:ko:r: --long supported-host-version:,supported-target-version: -n "$0" -- "$@"` # Check for non-GNU getopt if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi eval set -- "$OPTIONS" while true; do case "$1" in -d) CONFDIR="$2" shift 2 if [ ! d "${CONFDIR}" ]; then echo "${0}: ${CONFDIR}: Not a directory" >&2 exit 1 fi ;; -o) touch $2 outfile="$(readlink -f "$2")" shift 2 ;; -k) keep="y" shift ;; -r) # ignore (FIXME: manpage says differently?!?) shift 2 ;; --supported-host-version) supported_host_version="$2" shift 2 ;; --supported-target-version) supported_target_version="$2" shift 2 ;; --) shift break ;; *) echo "Internal error!" >&2 exit 1 ;; esac done if [ -n "$supported_host_version" ] || [ -n "$supported_target_version" ]; then if [ -n "$supported_host_version" ]; then host_upstream_version="${supported_host_version%%-*}" fi if [ -n "$supported_target_version" ]; then target_upstream_version="${supported_target_version%%-*}" if dpkg --compare-versions "$target_upstream_version" lt "2.6.12"; then exit 2 fi fi exit 0 fi # For dependency ordered mkinitramfs hook scripts. . /usr/share/initramfs-tools/scripts/functions . /usr/share/initramfs-tools/hook-functions . "${CONFDIR}/initramfs.conf" if [ -z "${outfile}" ]; then usage fi # And by "version" we really mean path to kernel modules # This is braindead, and exists to preserve the interface with mkinitrd if [ ${#} -ne 1 ]; then version="$(uname -r)" else version="${1}" fi if dpkg --compare-versions "${version}" lt 2.6.12; then echo "Kernel version too old. initramfs-tools requires at least 2.6.12." exit 1 fi case "${version}" in /lib/modules/*/[!/]*) ;; /lib/modules/[!/]*) version="${version#/lib/modules/}" version="${version%%/*}" ;; esac case "${version}" in */*) echo "$PROG: ${version} is not a valid kernel version" >&2 exit 1 ;; esac if [ -d "${outfile}" ]; then echo "${outfile} is a directory" exit 1 fi MODULESDIR="/lib/modules/${version}" if [ ! -e "${MODULESDIR}" ]; then echo "Cannot find ${MODULESDIR}" exit 1 fi DESTDIR="$(mktemp -t -d mkinitramfs_XXXXXX)" || exit 1 __TMPCPIOGZ="$(mktemp -t mkinitramfs-OL_XXXXXX)" || exit 1 # Export environment for hook scripts. # export MODULESDIR export version export CONFDIR export DESTDIR # Private, used by 'catenate_cpiogz'. export __TMPCPIOGZ for d in bin conf etc lib modules sbin scripts; do mkdir -p "${DESTDIR}/${d}" done # MODULES=list case. Always honour. for x in "${CONFDIR}/modules" /usr/share/initramfs-tools/modules.d/*; do if [ -f "${x}" ]; then add_modules_from_file "${x}" fi done if [ "${MODULES}" = "dep" ]; then dep_add_modules fi if [ "${MODULES}" = "most" ]; then auto_add_modules fi # Have to do each file, because cpio --dereference doesn't recurse down # symlinks. cp /usr/share/initramfs-tools/init "${DESTDIR}/init" cp -a /usr/share/initramfs-tools/scripts/* "${DESTDIR}/scripts" for f in $(cd /etc/mkinitramfs/scripts && \ find . \( -name '*.dpkg*' -prune -o -name '*~' -prune \) \ -o -type f -print); do mkdir --parents "${DESTDIR}/scripts/$(dirname "${f}")" cp -p "/etc/mkinitramfs/scripts/${f}" "${DESTDIR}/scripts/$(dirname "${f}")" done cp "${CONFDIR}/initramfs.conf" "${DESTDIR}/conf" cp -a /etc/udev "${DESTDIR}/etc" # udev cp /sbin/udev "${DESTDIR}/sbin" cp /sbin/udevd "${DESTDIR}/sbin" cp /sbin/udevsynthesize "${DESTDIR}/sbin" cp -a /lib/hotplug "${DESTDIR}/lib" # Busybox cp "${BUSYBOXDIR}/busybox" "${DESTDIR}/bin/busybox" # Modutils cp /sbin/modprobe "${DESTDIR}/sbin" cp /sbin/depmod "${DESTDIR}/sbin" cp /sbin/rmmod "${DESTDIR}/sbin" mkdir -p "${DESTDIR}/etc/modprobe.d" cp /etc/modprobe.d/aliases "${DESTDIR}/etc/modprobe.d" run_scripts /usr/share/initramfs-tools/hooks run_scripts /etc/mkinitramfs/hooks mklibs-copy -d "${DESTDIR}/lib" --root="${DESTDIR}" $(find "${DESTDIR}" -type f -perm +0111 -o -name '*.so') ln -s /usr/lib/klibc/bin/* "${DESTDIR}/bin" ln -s /usr/lib/klibc/lib/* "${DESTDIR}/lib" rm "${DESTDIR}/bin/sh" ln -s busybox "${DESTDIR}/bin/sh" # Apply DSDT to initramfs if [ -e "${CONFDIR}/DSDT.aml" ]; then cp "${CONFDIR}/DSDT.aml" "${DESTDIR}" fi (cd "${DESTDIR}" && find . | cpio --quiet --dereference -o -H newc | gzip -9 >"${outfile}") if [ -s "${__TMPCPIOGZ}" ]; then cat "${__TMPCPIOGZ}" >>"${outfile}" fi if [ "${keep}" = "y" ]; then echo "Working files in ${DESTDIR} and overlay in ${__TMPCPIOGZ}" else rm -rf "${DESTDIR}" rm -rf "${__TMPCPIOGZ}" fi exit 0