summaryrefslogtreecommitdiffstats
path: root/install/autodetect
blob: 5c86eb05a0c7dd23a1ed5cef4febae334102fe94 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# vim: set ft=sh:

install ()
{
    MODULE_FILE="${TMPDIR}/autodetect_modules"
    #blegh, we'll let /tmp clean itself up
    AUTODETECT="$(auto_modules | \
                  sed -e 's/ata_generic//g' -e 's/ide_generic//g')"


    #Filesystem detection, only probe the device for /
    findfs ()
    {
        local rootdev

        if [ -f /proc/self/mountinfo -a -x /bin/findmnt ]; then
            rootdev=$(/bin/findmnt -n -u -o source /)
            /sbin/blkid -u filesystem -o value -s TYPE -p "${rootdev}" 2>/dev/null
        fi
    }

    if [ ${UID} -eq 0 -o "$(groups | grep disk)" != "" ]; then
        fss=$(findfs | sort | uniq)
        if [ -z "${fss}" ]; then
            err "Root file system type detection failed."
            autodetect_fs_detection_failed=1
        fi
        for fs in ${fss}; do
            allfs="${fs} $(modprobe --set-version ${KERNELVERSION} --resolve-alias ${fs})"
            for mod in ${allfs}; do
                for modfile in $(find "${MODULEDIR}" -type f -name "${mod}.ko" -or -name "${mod}.ko.gz"); do
                    if [ -n "${modfile}" ]; then
                        AUTODETECT="${AUTODETECT} ${modfile}"
                    fi
                done
            done
        done

        if [ -e /sbin/mdadm ]; then
            for raidmod in $(/sbin/mdadm -E -s -v /dev/hd* /dev/sd* /dev/rd/* /dev/ida/* /dev/cciss/* /dev/ataraid/* /dev/mapper/* \
                        | awk -Flevel= '{print $2}' | awk '{print $1}'); do
                case "${raidmod}" in
                    raid4|raid5|raid6)
                        AUTODETECT="${AUTODETECT} raid456" ;;
                    *)
                        AUTODETECT="${AUTODETECT} ${raidmod}" ;;
                esac
            done
        fi
    else
        autodetect_fs_detection_failed=1
        autodetect_raid_detection_failed=1
        err "User does not have proper permissions to read superblocks, raid and filesystem modules are not detected"
    fi

    for m in ${AUTODETECT}; do
        modname="${m%.gz}"
        modname="$(basename ${modname%.ko})"
        echo "${modname}" >> "${MODULE_FILE}"
    done

    BINARIES=""
    FILES=""
    SCRIPT=""
}

help ()
{
cat <<HELPEOF
  This hook shrinks your initramdisk to a smaller size 
  by autodetecting your needed modules. Be sure to verify
  included modules are correct and none are missing.
  This hook must be run before other subsystem hooks in
  order to take advantage of auto-detection.  Any hooks
  placed before 'autodetect' will be installed in full.
HELPEOF
}