#!/bin/bash build() { local -a md_devs local dev insufficient_perms MODULE_FILE=$workdir/autodetect_modules add_if_avail() { local resolved # treat this as an alias, since ext3 might be aliased to ext4. IFS=$'\n' read -rd '' -a resolved < \ <(modprobe -S "$KERNELVERSION" -R "$1" 2>/dev/null) if (( ${#resolved[*]} )); then printf '%s\n' "${resolved[@]}" >>"$MODULE_FILE" fi } if [[ ! -d /sys/devices ]]; then error "/sys does not appear to be mounted. Unable to use autodetection" return 1 fi auto_modules >"$MODULE_FILE" # detect filesystem for root if rootfstype=$(findmnt -uno fstype "${BASEDIR:-/}"); then add_if_avail "$rootfstype" else error "failed to detect root filesystem" fs_autodetect_failed=1 fi # detect filesystem for separate /usr if usrfstype=$(findmnt -snero fstype --tab-file "$BASEDIR/etc/fstab" /usr); then add_if_avail "$usrfstype" fi # look for raid devices shopt -s nullglob for dev in /sys/class/block/*/md/dev-*; do dev=/dev/${dev#*/dev-} [[ -r $dev ]] || insufficient_perms=1 md_devs+=("$dev") done shopt -u nullglob # scan members of raid devices if found if (( ${#md_devs[*]} )); then (( !QUIET )) && plain "found %d raid members to scan" "${#md_devs[*]}" if (( ! insufficient_perms )); then mdadm -Esv "${md_devs[@]}" | sed -n 's/.*level=\([^ ]\+\) .*/\1/p' | sed 's/\/raid456/g' | sort -u >>"$MODULE_FILE" else warning "Insufficient permission to perform autodetection for mdadm devices" raid_autodetect_failed=1 fi fi if (( !QUIET )) && [[ -s $MODULE_FILE ]]; then plain "caching %d modules" $(wc -l < "$MODULE_FILE") fi } help() { cat <