summaryrefslogtreecommitdiffstats
path: root/install/autodetect
blob: ab5118bd3dd3fa6b211e458bd9cde6484220308b (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
78
79
80
# vim: set ft=sh:

install ()
{
    MODULE_FILE="${TMPDIR}/autodetect_modules"
    #blegh, we'll let /tmp clean itself up
    AUTODETECT="$(auto_modules -e '/scsi/' -e '/block' -e '/fusion/' \
                    -e '/usb/' -e '/ide/' -e '/ieee1394/' -e '/cdrom' \
                    -e '/net/' -e '/pcmcia' -e '/ata' \
                  | grep -v -e 'ata_generic.ko' -e 'ide-generic.ko')"


    #Filesystem detection, use sysfs instead of /proc
    findfs ()
    {
        for blkdev in $(find /dev -type b | grep -v -e loop -e ram -e fd); do
            FSTYPE="$(/sbin/blkid -o value -s TYPE "${blkdev}")"
            if [ -n "${FSTYPE}" -a "${FSTYPE}" != "swap" -a "${FSTYPE}" != "unknown" -a "${FSTYPE}" != "luks" -a "${FSTYPE}" != "lvm2" ]; then
                echo ${FSTYPE}
            fi
        done
    }

    if [ ${UID} -eq 0 -o "$(groups | grep disk)" != "" ]; then
        for fs in $(findfs | sort | uniq); do
            for mod in $(find "${MODULEDIR}" -type f -name "${fs}.ko"); do
                if [ -n "${mod}" ]; then
                    AUTODETECT="${AUTODETECT} ${mod}"
                fi
            done
        done

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

    for m in ${AUTODETECT}; do
        modname="$(basename ${m%%\.ko})"
        grep "^${modname}$" "${MODULE_FILE}" >/dev/null 2>&1 && continue
        case "${m}" in 
            #*/ieee1394/*) echo -e "sbp2\nsd_mod\nsr_mod" >> "${MODULE_FILE}";;
            *ext3*) echo "jbd" >> "${MODULE_FILE}" ;;
            *ext4*) echo -e "jbd2\nmbcache\ncrc16" >> "${MODULE_FILE}" ;;
            *afs*) echo "rxrpc" >> "${MODULE_FILE}" ;;
            *cramfs*) echo "zlib_inflate" >> "${MODULE_FILE}" ;;
            *isofs*) echo "zlib_inflate" >> "${MODULE_FILE}" ;;
            *msdos*) echo "fat" >> "${MODULE_FILE}" ;;
            *vfat*) echo -e "fat\nnls_cp437" >> "${MODULE_FILE}" ;;
            *ocfs2*) echo -e "ocfs2_dlm\njbd\nocfs2_nodemanager\nconfigfs" >> "${MODULE_FILE}" ;;
        esac
        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
}