diff options
Diffstat (limited to 'hooks/fsck')
-rwxr-xr-x | hooks/fsck | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/hooks/fsck b/hooks/fsck new file mode 100755 index 0000000..15127dd --- /dev/null +++ b/hooks/fsck @@ -0,0 +1,110 @@ +#!/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" ] && [ "$MNT_PASS" != 0 ]; 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}")" + 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 |