summaryrefslogtreecommitdiffstats
path: root/hooks/fsck
diff options
context:
space:
mode:
Diffstat (limited to 'hooks/fsck')
-rwxr-xr-xhooks/fsck110
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