diff options
Diffstat (limited to 'hooks')
-rwxr-xr-x | hooks/fsck | 111 | ||||
-rwxr-xr-x | hooks/keymap | 40 | ||||
-rwxr-xr-x | hooks/resume | 117 | ||||
-rwxr-xr-x | hooks/thermal | 65 |
4 files changed, 333 insertions, 0 deletions
diff --git a/hooks/fsck b/hooks/fsck new file mode 100755 index 0000000..9e84a5b --- /dev/null +++ b/hooks/fsck @@ -0,0 +1,111 @@ +#!/bin/sh + +PREREQ="" + +prereqs() +{ + echo "$PREREQ" +} + +# Find a specific fstab entry +# $1=mountpoint +# $2=fstype (optional) +_read_fstab_entry () { + # Not found by default. + echo "MNT_FSNAME=" + echo "MNT_DIR=" + echo "MNT_TYPE=" + + for file in /etc/fstab /etc/fstab.d/*.fstab; do + if [ -f "$file" ]; then + # shellcheck disable=SC2034 + while read -r MNT_FSNAME MNT_DIR MNT_TYPE MNT_OPTS MNT_FREQ MNT_PASS MNT_JUNK; do + case "$MNT_FSNAME" in + ""|\#*) + continue; + ;; + esac + if [ "$MNT_DIR" = "$1" ]; then + if [ -n "$2" ]; then + [ "$MNT_TYPE" = "$2" ] || continue; + fi + echo "MNT_FSNAME=$MNT_FSNAME" + echo "MNT_DIR=$MNT_DIR" + echo "MNT_TYPE=$MNT_TYPE" + echo "MNT_PASS=$MNT_PASS" + break 2 + fi + MNT_DIR="" + done < "$file" + fi + done +} + +# Find a specific fstab entry and print its type (if found, and pass != 0) +# $1=mountpoint +get_fsck_type_fstab () { + eval "$(_read_fstab_entry "$1")" + + # Not found by default. + if [ "$1" = "$MNT_DIR" ]; then + # Ignore filesystem type for /, as it is not available and + # therefore never used at boot time + if [ "${MNT_DIR}" = "/" ] || [ "${MNT_TYPE}" = "auto" ]; then + MNT_FSNAME="$(resolve_device "${MNT_FSNAME}")" + # shellcheck disable=SC2317 + fstype() { "/usr/lib/klibc/bin/fstype" "$@"; } + if ! get_fstype "${MNT_FSNAME}"; then + echo "W: Couldn't identify type of $2 file system for fsck hook" >&2 + fi + unset -f fstype + else + echo "${MNT_TYPE}" + fi + fi +} + +get_fsck_types() { + if [ "${FSTYPE:-auto}" = auto ]; then + get_fsck_type_fstab / root + get_fsck_type_fstab /usr usr + else + local IFS=, + local fstype + set -f + for fstype in $FSTYPE; do + echo "$fstype" + done + set +f + fi +} + +case $1 in +prereqs) + prereqs + exit 0 + ;; +esac + +if [ ! -x /sbin/fsck ]; then + exit 0 +fi + +. /usr/share/initramfs-tools/scripts/functions +. /usr/share/initramfs-tools/hook-functions + +fsck_types="$(get_fsck_types | sort | uniq)" + +if [ -z "$fsck_types" ]; then + exit 0 +fi + +copy_exec /sbin/fsck +copy_exec /sbin/logsave + +for type in $fsck_types; do + if prog="$(command -v "fsck.${type}")"; then + copy_exec "$prog" + else + echo "W: /sbin/fsck.${type} doesn't exist, can't install to initramfs" >&2 + fi +done diff --git a/hooks/keymap b/hooks/keymap new file mode 100755 index 0000000..64f8e6d --- /dev/null +++ b/hooks/keymap @@ -0,0 +1,40 @@ +#!/bin/sh + +PREREQ="" + +prereqs() +{ + echo "$PREREQ" +} + +case $1 in +# get pre-requisites +prereqs) + prereqs + exit 0 + ;; +esac + +# Hook to load keymaps into the initramfs if requested by KEYMAP="y" +if [ "$KEYMAP" != "y" ] && [ "$KEYMAP" != "Y" ]; then + exit 0 +fi + +if [ ! -x /bin/setupcon ]; then + echo "setupcon is missing. Please install the 'console-setup' package." + exit 0 +fi + +. /usr/share/initramfs-tools/hook-functions + +# Tell setupcon to copy/create the files it needs. +setupcon --setup-dir "$DESTDIR" + +# Copy additional files that setupcon needs. We assume they are +# executables. +while read -r file; do + copy_exec "$file" +done < "$DESTDIR/morefiles" +rm -f "$DESTDIR/morefiles" + +exit 0 diff --git a/hooks/resume b/hooks/resume new file mode 100755 index 0000000..8ff84dd --- /dev/null +++ b/hooks/resume @@ -0,0 +1,117 @@ +#!/bin/sh + +PREREQ="" + +prereqs() +{ + echo "$PREREQ" +} + +case $1 in +# get pre-requisites +prereqs) + prereqs + exit 0 + ;; +esac + +. /usr/share/initramfs-tools/scripts/functions + +# First check if a location is set and is a valid swap partition. +# If so, the config file will be copied in and there is nothing to do. +if [ -n "$RESUME" ] && [ "$RESUME" != auto ]; then + if [ "$RESUME" = none ]; then + exit 0 + fi + if resume_dev_node="$(resolve_device "$RESUME")" && \ + blkid -p -n swap "$resume_dev_node" >/dev/null 2>&1; then + exit 0 + fi + + echo >&2 "W: initramfs-tools configuration sets RESUME=$RESUME" + echo >&2 "W: but no matching swap device is available." +fi + +# If we were not explicitly requested to select a device, or the -v +# option is used, report that we are doing so +report_auto() +{ + test "${verbose?}" != y && test "$RESUME" = auto || echo "I: $*" +} + +# Report in excruciating detail if the -v option is used +report_verbose() +{ + test "${verbose?}" != y || echo "I: $*" +} + +report_verbose "Configuration sets RESUME=$RESUME" + +# Try to autodetect the RESUME partition, using biggest swap device that +# is not ephemeral. We need to be able to read the listed swap partitions. +resume_auto= +if ! ischroot && [ -r /proc/swaps ]; then + # shellcheck disable=SC2013 + for resume_auto in $(grep ^/dev/ /proc/swaps | sort -rnk3 | cut -d " " -f 1); do + report_verbose "Checking swap device $resume_auto" + ephemeral=false + dm_name="$(dmsetup info -c --noheadings -o name "$resume_auto" 2>/dev/null)" + + # dm-crypt is ephemeral if the key file is /dev/urandom + if [ -n "$dm_name" ] && [ -e /etc/crypttab ]; then + report_verbose "$resume_auto has device-mapper name $dm_name; checking crypttab" + # shellcheck disable=SC2034 + while read -r cryptdev srcdev keyfile junk; do + report_verbose "Found cryptdev=$cryptdev keyfile=$keyfile" + if [ "$cryptdev" = "$dm_name" ] && [ "$keyfile" = /dev/urandom ]; then + report_verbose "Rejecting $resume_auto since it has no permanent key" + ephemeral=true + fi + done < /etc/crypttab + fi + + # zram is ephemeral + case "$resume_auto" in + /dev/zram*) + report_verbose "Rejecting $resume_auto since it is zram" + ephemeral=true + ;; + + /dev/zd[0-9]*) + report_verbose "Rejecting $resume_auto since it is zvol" + ephemeral=true + ;; + esac + + $ephemeral || break + done + + if $ephemeral; then + resume_auto= + fi + if [ -n "$resume_auto" ]; then + if [ -n "$dm_name" ]; then + resume_auto_canon="/dev/mapper/$dm_name" + elif UUID=$(blkid -s UUID -o value "$resume_auto"); then + resume_auto_canon="UUID=$UUID" + else + resume_auto_canon= + fi + report_auto "The initramfs will attempt to resume from $resume_auto" + if [ -n "$resume_auto_canon" ]; then + report_auto "($resume_auto_canon)" + resume_auto="$resume_auto_canon" + fi + report_auto "Set the RESUME variable to override this." + fi +fi + +# Write selected resume device to intramfs conf.d +if [ "$RESUME" = auto ] || [ -n "$resume_auto" ]; then + # If we were explicitly requested to select a device, and we failed, + # report that + if [ -z "$resume_auto" ]; then + echo >&2 "W: initramfs-tools failed to select a resume device" + fi + echo "RESUME=${resume_auto}" > "${DESTDIR}/conf/conf.d/zz-resume-auto" +fi diff --git a/hooks/thermal b/hooks/thermal new file mode 100755 index 0000000..37eae63 --- /dev/null +++ b/hooks/thermal @@ -0,0 +1,65 @@ +#!/bin/sh + +PREREQ="" + +prereqs() +{ + echo "$PREREQ" +} + +case $1 in +# get pre-requisites +prereqs) + prereqs + exit 0 + ;; +esac + +# Hooks for loading thermal bits into the initramfs + +. /usr/share/initramfs-tools/hook-functions + +case "$DPKG_ARCH" in +# copy the right modules +powerpc|ppc64) + + # Only G5 Mac machines need to load + # windfarm_core or one of the windfarm_pm* modules. + + [ -r /proc/cpuinfo ] || exit 0 + + MODEL="$(grep model /proc/cpuinfo)" + MODEL="${MODEL##*: }" + + case "$MODEL" in + RackMac3,1) + force_load windfarm_rm31 + ;; + PowerMac7,2|PowerMac7,3) + force_load windfarm_pm72 + ;; + PowerMac8,1|PowerMac8,2) + force_load windfarm_pm81 + ;; + PowerMac9,1) + force_load windfarm_pm91 + ;; + PowerMac11,2) + force_load windfarm_pm112 + ;; + PowerMac12,1) + force_load windfarm_pm121 + ;; + *) + # No other machine needs windfarm_* modules on initrd. + exit 0 + ;; + esac + manual_add_modules windfarm_core windfarm_cpufreq_clamp \ + windfarm_lm75_sensor windfarm_max6690_sensor windfarm_pid \ + windfarm_smu_controls windfarm_smu_sat windfarm_smu_sensors + ;; +i386|amd64|ia64) + manual_add_modules fan thermal + ;; +esac |