diff options
Diffstat (limited to 'hook-functions')
| -rw-r--r-- | hook-functions | 314 |
1 files changed, 197 insertions, 117 deletions
diff --git a/hook-functions b/hook-functions index cfabe50..915d2ef 100644 --- a/hook-functions +++ b/hook-functions @@ -3,7 +3,7 @@ catenate_cpiogz() { # Sanity check if [ ! -e "${1}" ]; then - echo "W:catenate_cpiogz: arg1='${1}' does not exist." >&2 + echo "W: catenate_cpiogz: arg1='${1}' does not exist." >&2 return fi @@ -29,39 +29,36 @@ add_modules_from_file() { # Sanity check if [ ! -e "${1}" ]; then - echo "W:add_modules_from_file: arg1='${1}' does not exist." >&2 + echo "W: add_modules_from_file: arg1='${1}' does not exist." >&2 return fi - sed -e '/^#/d' ${1} | while read module rest; do - force_load "${module}" "${rest}" + grep '^[^#]' ${1} | while read module args; do + [ -n "$module" ] || continue + force_load "${module}" "${args}" done } # Add dependent modules + eventual firmware manual_add_modules() { - local mam_x firmwares firmware + local kmod firmware - for mam_x in $(modprobe --set-version="${version}" --ignore-install \ - --show-depends "${1}" 2>/dev/null | awk '/^insmod/ { print $2 }'); do + for kmod in $(modprobe --set-version="${version}" --ignore-install \ + --quiet --show-depends "${1}" | awk '/^insmod/ { print $2 }'); do # Prune duplicates - if [ -e "${DESTDIR}/${mam_x}" ]; then + if [ -e "${DESTDIR}/${kmod}" ]; then continue fi - mkdir -p "${DESTDIR}/$(dirname "${mam_x}")" - ln -s "${mam_x}" "${DESTDIR}/$(dirname "${mam_x}")" + mkdir -p "${DESTDIR}/$(dirname "${kmod}")" + ln -s "${kmod}" "${DESTDIR}/$(dirname "${kmod}")" if [ "${verbose}" = "y" ]; then - echo "Adding module ${mam_x}" + echo "Adding module ${kmod}" fi - # Add firmware files if necessary - firmwares=$(modinfo -F firmware "${mam_x}") - if [ -z "${firmwares}" ]; then - continue - fi - for firmware in $firmwares; do + # Add required firmware + for firmware in $(modinfo -F firmware "${kmod}"); do if [ -e "${DESTDIR}/lib/firmware/${firmware}" ] \ || [ -e "${DESTDIR}/lib/firmware/${version}/${firmware}" ]; then continue @@ -70,12 +67,18 @@ manual_add_modules() # Only print warning for missing fw of loaded module # or forced loaded module if [ ! -e "/lib/firmware/${firmware}" ] \ - && [ ! -e "/lib/firmware/${version}/${firmware}" ]; then - if grep -q "^$(basename "${mam_x}" .ko)" \ + && [ ! -e "/lib/firmware/${version}/${firmware}" ] ; then + # Only warn about missing firmware if + # /proc/modules exists + if [ ! -e /proc/modules ] ; then + continue + fi + + if grep -q "^$(basename "${kmod}" .ko)[[:space:]]" \ /proc/modules \ - || grep -q "^$(basename "${mam_x}" .ko)" \ + || grep -q "^$(basename "${kmod}" .ko)" \ "${CONFDIR}/modules"; then - echo "W: Possible missing firmware /lib/firmware/${firmware} for module $(basename ${mam_x} .ko)" >&2 + echo "W: Possible missing firmware /lib/firmware/${firmware} for module $(basename ${kmod} .ko)" >&2 fi continue fi @@ -97,63 +100,42 @@ manual_add_modules() done } -# $1 is the source path (e.g. /usr/bin/time) -# $2 is the relative destination (e.g. /usr or /usr/time) -# -# The destination is interpreted in the same way "cp" would, meaning -# (assuming /bin is a directory): -# -# "copy_exec /usr/bin/time /bin" -> /bin/time -# "copy_exec /usr/bin/time /bin/mytime" -> /bin/mytime -# -# If $2 is left out, the same destination path as for the source arg will -# be used and directories will be created as needed, so: -# -# "copy_exec /usr/bin/time" -> /usr/bin/time -# +# $1 = file to copy to ramdisk +# $2 (optional) Name for the file on the ramdisk +# Location of the image dir is assumed to be $DESTDIR +# We never overwrite the target if it exists. copy_exec() { - local source target destination final_destination x nonoptlib + local src target x nonoptlib local libname dirname - source="${1}" - if [ -n "${2}" ]; then - target="${2}" - else - if [ ! -e "${DESTDIR}/$(dirname "${1}")" ]; then - mkdir -p "${DESTDIR}/$(dirname "${1}")" - fi - target="${1}" - fi + src="${1}" + target="${2:-$1}" + + [ -f "${src}" ] || return 1 if [ -d "${DESTDIR}/${target}" ]; then - destination="${target}/$(basename "${source}")" + # check if already copied + [ -e "${DESTDIR}/$target/${src##*/}" ] && return 0 else - destination="${target}" + [ -e "${DESTDIR}/$target" ] && return 0 + #FIXME: inst_dir + mkdir -p "${DESTDIR}/${target%/*}" fi - final_destination="${DESTDIR}/${destination}" - if [ -L "$final_destination" ]; then - if [ $(readlink "${final_destination}") != "${source}" ]; then - echo "W:copy_exec: Not copying ${source} to \$DESTDIR${destination}, which is already a copy of $(readlink ${final_destination})" >&2 - return - fi - else - ln -s ${source} ${DESTDIR}/${destination} - if [ "${verbose}" = "y" ]; then - echo "Adding binary ${source}" - fi - fi + [ "${verbose}" = "y" ] && echo "Adding binary ${src}" + ln -s "${src}" "${DESTDIR}/${target}" # Copy the dependant libraries - for x in $(ldd ${source} 2>/dev/null | sed -e ' - /\//!d; - /linux-gate/d; - /=>/ {s/.*=>[[:blank:]]*\([^[:blank:]]*\).*/\1/}; - s/[[:blank:]]*\([^[:blank:]]*\) (.*)/\1/' 2>/dev/null); do + for x in $(ldd ${src} 2>/dev/null | sed -e ' + /\//!d; + /linux-gate/d; + /=>/ {s/.*=>[[:blank:]]*\([^[:blank:]]*\).*/\1/}; + s/[[:blank:]]*\([^[:blank:]]*\) (.*)/\1/' 2>/dev/null); do # Try to use non-optimised libraries where possible. - # We assume that all HWCAP libraries will be in tls. - nonoptlib=$(echo "${x}" | sed -e 's#/lib/\(tls\|i686\).*/\(lib.*\)#/lib/\2#') + # We assume that all HWCAP libraries will be in tls, + # sse2, vfp or neon. + nonoptlib=$(echo "${x}" | sed -e 's#/lib/\(tls\|i686\|sse2\|neon\|vfp\).*/\(lib.*\)#/lib/\2#') if [ -e "${nonoptlib}" ]; then x="${nonoptlib}" @@ -162,12 +144,11 @@ copy_exec() { libname=$(basename "${x}") dirname=$(dirname "${x}") + # FIXME inst_lib mkdir -p "${DESTDIR}/${dirname}" if [ ! -e "${DESTDIR}/${dirname}/${libname}" ]; then ln -s "${x}" "${DESTDIR}/${dirname}" - if [ "${verbose}" = "y" ]; then - echo "Adding library ${x}" - fi + [ "${verbose}" = "y" ] && echo "Adding library ${x}" || true fi done } @@ -175,16 +156,25 @@ copy_exec() { # Copy entire subtrees to the initramfs copy_modules_dir() { - local x_mod + local kmod exclude + local dir="$1" + shift - if ! [ -d "${MODULESDIR}/${1}" ]; then + if ! [ -d "${MODULESDIR}/${dir}" ]; then return; fi if [ "${verbose}" = "y" ]; then - echo "Copying module directory ${1}" + echo "Copying module directory ${dir}" + if [ $# -ge 1 ]; then + echo "(excluding $*)" + fi fi - for x_mod in $(find "${MODULESDIR}/${1}" -name '*.ko' -print); do - manual_add_modules $(basename ${x_mod} .ko) + while [ $# -ge 1 ]; do + exclude="${exclude:-} -name $1 -prune -o " + shift + done + for kmod in $(find "${MODULESDIR}/${dir}" ${exclude:-} -name '*.ko' -print); do + manual_add_modules $(basename ${kmod} .ko) done } @@ -193,10 +183,10 @@ sys_walk_mod_add() { local driver_path module device_path="$1" - + while [ "${device_path}" != "/sys" ]; do sys_walk_modalias ${device_path} - driver_path="$(readlink -f ${device_path}/driver)" + driver_path="$(readlink -f ${device_path}/driver/module)" if [ -e "$driver_path" ]; then module="$(basename $(readlink -f $driver_path))" if [ -n "${module}" ]; then @@ -228,24 +218,49 @@ dep_add_modules() { local block minor root FSTYPE root_dev_path x + # require mounted sysfs + if [ ! -d /sys/devices/ ]; then + echo "mkinitramfs: MODULES dep requires mounted sysfs on /sys" >&2 + exit 1 + fi + # findout root block device + fstype eval "$(mount | awk '/\/dev\// {if ($3 == "/") {print "root=" $1 "\nFSTYPE=" $5; exit}}')" + if [ -z "$root" ]; then + echo "mkinitramfs: failed to determine root device" >&2 + echo "mkinitramfs: workaround is MODULES=most" >&2 + echo "Error please report bug on initramfs-tools and include the output of 'mount'" >&2 + exit 1 + fi + + # handle ubifs and return since ubifs root is a char device but + # most of the commands below only work with block devices. + if [ "${FSTYPE}" = "ubifs" ]; then + manual_add_modules "${FSTYPE}" + # add some modules required by ubifs on which it doesn's depend + manual_add_modules deflate + manual_add_modules zlib + manual_add_modules lzo + return + fi + if [ "${root}" = "/dev/root" ] ; then - root="/dev/disk/by-uuid/"$(/lib/udev/vol_id --uuid ${root}) 2>/dev/null + root="/dev/disk/by-uuid/"$(blkid -o value -s UUID ${root}) 2>/dev/null fi root="$(readlink -f ${root})" - # find out real rootfs on auto type - if [ "${FSTYPE}" = "auto" ]; then - eval "$(/usr/lib/klibc/bin/fstype ${root})" - fi + # do not trust mount, check superblock + eval "$(/usr/lib/klibc/bin/fstype ${root})" # check that fstype rootfs recognition if [ "${FSTYPE}" = "unknown" ]; then - echo "mkinitramfs: unknown fstype on root ${root}" - echo "mkinitramfs: workaround is MODULES=most" - echo "mkinitramfs: Error please report bug on initramfs-tools" - exit 1 + FSTYPE=$(blkid -o value -s TYPE "${root}") + if [ -z "${FSTYPE}" ]; then + echo "mkinitramfs: unknown fstype on root ${root}" >&2 + echo "mkinitramfs: workaround is MODULES=most" >&2 + echo "Error please report bug on initramfs-tools" >&2 + exit 1 + fi fi # Add rootfs @@ -256,26 +271,33 @@ dep_add_modules() || [ "${root#/dev/dm-}" != "${root}" ]; then minor=$((0x$(stat --format "%T" ${root}) % 256)) block=$(ls -1 /sys/block/dm-${minor}/slaves | head -n 1) - # lvm on luks or luks on lvm - if [ "${block#dm-}" != "${block}" ]; then + # lvm on luks or luks on lvm, possibly lvm snapshots + while [ "${block#dm-}" != "${block}" ]; do block=$(ls -1 /sys/block/${block}/slaves | head -n 1) - fi + done # lvm on md or luks on md if [ "${block#md}" != "${block}" ]; then - block=$(awk "/^${block}/{print substr(\$5, 1, 4); exit}" \ - /proc/mdstat) + block=$(sed -ne 's/multipath/[/' -e 's/linear/[/' -e 's/raid[0-9][0-9]*/[/' -e 's/\([hs]d[a-z][a-z]*\)[0-9][0-9]*/\1/g' -e '/^'${block}' :/s/^[^[]*\[ \([^\[]*\)\[.*$/\1/p' </proc/mdstat) + fi + # luks or lvm on cciss or ida + if [ "${block#cciss}" != "${block}" ] \ + || [ "${block#ida}" != "${block}" ]; then + block="${block%p*}" + else + block=${block%%[0-9]*} fi - block=${block%[0-9]*} # md root new naming scheme /dev/md/X elif [ "${root#/dev/md/}" != "${root}" ]; then root=${root#/dev/md/} - block=$(awk "/^md${root}/{print substr(\$5, 1, 3); exit}" \ - /proc/mdstat) + # drop the partition number only for sdX and hdX devices + # and keep it for other devices like loop#, dm-# devices + block=$(sed -ne 's/multipath/[/' -e 's/linear/[/' -e 's/raid[0-9][0-9]*/[/' -e 's/\([hs]d[a-z][a-z]*\)[0-9][0-9]*/\1/g' -e '/^md'$root' :/s/^[^[]*\[ \([^\[]*\)\[.*$/\1/p' </proc/mdstat) # md root /dev/mdX elif [ "${root#/dev/md}" != "${root}" ]; then - root=${root#/dev/} - block=$(awk "/^${root}/{print substr(\$5, 1, 3); exit}" \ - /proc/mdstat) + root=${root#/dev/md} + # drop the partition number only for sdX and hdX devices + # and keep it for other devices like loop#, dm-# devices + block=$(sed -ne 's/multipath/[/' -e 's/linear/[/' -e 's/raid[0-9][0-9]*/[/' -e 's/\([hs]d[a-z][a-z]*\)[0-9][0-9]*/\1/g' -e '/^md'$root' :/s/^[^[]*\[ \([^\[]*\)\[.*$/\1/p' </proc/mdstat) # cciss device elif [ "${root#/dev/cciss/}" != "${root}" ]; then block=${root#/dev/cciss/*} @@ -289,17 +311,36 @@ dep_add_modules() root=${root#/dev/} block=$(losetup -a \ | awk "/${root}/{print substr(\$3, 7, 3); exit}") + # Xen virtual device /dev/xvdX + elif [ "${root#/dev/xvd}" != "${root}" ]; then + block=${root#/dev/} + # Xen has a mode where only the individual partitions are + # registered with the kernel as well as the usual full disk + # with partition table scheme. + if [ ! -e /sys/block/${block} ] ; then + block=${block%%[0-9]*} + fi + # mmc root /dev/mmcblkXpX + elif [ "${root#/dev/mmcblk}" != "${root}" ]; then + block=${root#/dev/} + block=${block%%p[0-9]*} + + # DAC960 - good old mylex raid - root dev format /dev/rd/cXdXpX + elif [ "${root#/dev/rd/c}" != "${root}" ]; then + block="rd!c${root#/dev/rd/c}" + block=${block%%p[0-9]*} + # classical root device else block=${root#/dev/} - block=${block%[0-9]*} + block=${block%%[0-9]*} fi # Error out if /sys lack block dev if [ -z "${block}" ] || [ ! -e /sys/block/${block} ]; then - echo "mkinitramfs: missing ${block} root ${root} /sys entry" - echo "mkinitramfs: workaround is MODULES=most" - echo "mkinitramfs: Error please report the bug" + echo "mkinitramfs: for root ${root} missing ${block} /sys/block/ entry" >&2 + echo "mkinitramfs: workaround is MODULES=most" >&2 + echo "mkinitramfs: Error please report the bug" >&2 exit 1 fi @@ -310,6 +351,8 @@ dep_add_modules() # catch old-style IDE if [ -e /sys/bus/ide/devices/ ]; then sys_walk_modalias ${root_dev_path} + manual_add_modules ide-gd_mod + # FIXME: remove post Squeeze manual_add_modules ide-disk manual_add_modules ide-cd fi @@ -318,6 +361,14 @@ dep_add_modules() manual_add_modules sd_mod fi + if [ -e /sys/bus/mmc/devices/ ]; then + manual_add_modules mmc_block + fi + + if [ -e /sys/bus/virtio ] ; then + manual_add_modules virtio_pci + fi + if [ -e /sys/bus/i2o/devices/ ]; then force_load i2o_block force_load i2o_config @@ -340,11 +391,12 @@ dep_add_modules() # The modules "most" classes added per default to the initramfs auto_add_modules() { - case "$1" in + case "${1:-}" in base) - for x in ehci-hcd ohci-hcd uhci-hcd usbhid usb-storage ext2 \ - ext3 ext4 ext4dev isofs jfs nfs reiserfs udf xfs af_packet \ - atkbd i8042 virtio_pci; do + for x in ehci-hcd ohci-hcd uhci-hcd usbhid xhci hid-apple \ + hid-cherry hid-logitech hid-microsoft \ + btrfs ext2 ext3 ext4 ext4dev isofs jfs nfs reiserfs udf xfs \ + af_packet atkbd i8042 virtio_pci; do manual_add_modules "${x}" done ;; @@ -362,6 +414,9 @@ auto_add_modules() xircom_cb xircom_tulip_cb yellowfin; do manual_add_modules "${x}" done + copy_modules_dir kernel/drivers/net \ + appletalk arcnet bonding can hamradio irda pcmcia \ + tokenring usb wan wimax wireless ;; ide) copy_modules_dir kernel/drivers/ide @@ -381,7 +436,11 @@ auto_add_modules() block) copy_modules_dir kernel/drivers/block ;; - # FIXME: can be removed after Lenny release + ubi) + for x in deflate zlib lzo ubi ubifs; do + manual_add_modules "${x}" + done + ;; ieee1394) for x in ohci1394 sbp2; do manual_add_modules "${x}" @@ -402,6 +461,9 @@ auto_add_modules() manual_add_modules "${x}" done ;; + usb_storage) + copy_modules_dir kernel/drivers/usb/storage + ;; *) auto_add_modules base auto_add_modules net @@ -414,10 +476,12 @@ auto_add_modules() auto_add_modules ieee1394 auto_add_modules firewire auto_add_modules mmc + auto_add_modules usb_storage ;; esac } +# mkinitramfs help message usage() { cat >&2 << EOF @@ -425,10 +489,11 @@ usage() Usage: ${0} [OPTION]... -o outfile [version] Options: - -d confdir Specify an alternative configuration directory. - -k Keep temporary directory used to make the image. - -o outfile Write to outfile. - -r root Override ROOT setting in mkinitrd.conf. + -c compress Override COMPRESS setting in initramfs.conf. + -d confdir Specify an alternative configuration directory. + -k Keep temporary directory used to make the image. + -o outfile Write to outfile. + -r root Override ROOT setting in initramfs.conf. See mkinitramfs(8) for further details. EOF @@ -436,16 +501,31 @@ EOF } +# cache boot scripts order +cache_run_scripts() +{ + DESTDIR=${1} + scriptdir=${2} + initdir=${DESTDIR}${scriptdir} + [ ! -d ${initdir} ] && return + + runlist=$(get_prereq_pairs | tsort) + for crs_x in ${runlist}; do + [ -f ${initdir}/${crs_x} ] || continue + echo "${scriptdir}/${crs_x}" >> ${initdir}/ORDER + echo "[ -e /conf/param.conf ] && . /conf/param.conf" >> ${initdir}/ORDER + done +} + # minimal supported kernel version check_minkver() { local curversion initdir DPKG_ARCH minversion cm_x tmp - curversion="${1}" - initdir="${2}" + curversion="${1:-}" + initdir="${2:-}" if [ -z "${initdir}" ]; then - DPKG_ARCH=$(dpkg --print-architecture) - case ${DPKG_ARCH} in + case ${DPKG_ARCH:-} in ia64|hppa) minversion="2.6.15" ;; @@ -461,11 +541,11 @@ check_minkver() return 0 fi set_initlist - for cm_x in ${initlist}; do - # sed: keep last line starting with MINKVER=, - # remove MINKVER= and trailing space + for cm_x in ${initlist:-}; do + # sed: keep last line starting with MINKVER=, + # remove MINKVER= and trailing space minver=$(sed '/^MINKVER=/!d;$!d;s/^MINKVER=//;s/[[:space:]]*$//' "${initdir}/${cm_x}") - if [ -z "${tmp}" ]; then + if [ -z "${tmp:-}" ]; then continue elif dpkg --compare-versions "${curversion}" lt "${minver}"; then echo "W: ${cm_x} hook script requires at least kernel version ${minver}" >&2 |
