summaryrefslogtreecommitdiff
path: root/hook-functions
diff options
context:
space:
mode:
authorAn-Cheng Huang <ancheng@vyatta.com>2010-09-09 17:12:53 -0700
committerAn-Cheng Huang <ancheng@vyatta.com>2010-09-09 17:12:53 -0700
commit573e21e410934f2293d5ac4c738af5f77083b43b (patch)
tree006a2586447b7f2e9353556f74633db605436777 /hook-functions
parent0de1ad17c333d645774ac3b48d652ccd4ecd6900 (diff)
parent7a6f9e972def00f7f0435d9f2616bcb79dc619b7 (diff)
downloadinitramfs-tools-573e21e410934f2293d5ac4c738af5f77083b43b.tar.gz
initramfs-tools-573e21e410934f2293d5ac4c738af5f77083b43b.zip
Merge branch 'upstream' (0.98.2) into mendocino
Conflicts: debian/changelog debian/compat debian/control debian/rules hook-functions mkinitramfs
Diffstat (limited to 'hook-functions')
-rw-r--r--hook-functions314
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