summaryrefslogblamecommitdiffstats
path: root/src/initramfs/scripts/bin/hwautocfg
blob: 071ffbfa9b8edde4592b6f32f286736539cf8339 (plain) (tree)
1
2
3
         
                                            
                                         



















                                                                             
                                          

                               
                    
                                       
                                                                 

                                               
                                                                             
                                                                              
                                                       
                                       
                                        

                                                    
                                                                 



                                                                       












                                                         
                                           



                                                           
        
                              
  
 
                                                      
                                                      

                                                                     


                                                                                

                                                              
                                                           
  
                     
 

                                                                      
                                                                           

                                                     

                                                                      

                                                                      
                                                   
  
  







                                                                             

                                                            
                              


                                                                             
                    
 





                                                                         

                                                                      


                                                                 


                                                                        


                                         
 














                                                                             
                                           


                                                                               




                                                   


                                                         
                                      
 




                                                                             


                                                                       
                            
                                 









                                                                             
                                                            









                                                                            








                                                                         
                          

                                                                             

                                                                           
                                               
                                                                      
                                                                            
                                                                          
                      

                                                     
                                               
                                                                       

                                                                           

                                                                          


          


                                                                    
    
                                                      

                                                                  




                                                                             
 
                                                         

                                                                   

                                                     

                                                            














                                                                             
                                                 
                     
                      














                                                                     
                                            



                                                    


                                                             

                                                                              
       
                                              
                                                                                   
                                      
                                       
                                                                          
                                                   



                                                                                           

                                    





                                                                                    





                                  
#!/bin/sh
# Copyright (c) 2003..2006 - RZ Uni Freiburg
# Copyright (c) 2006..2014 - OpenSLX GmbH
#
# This program is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your feedback to feedback@openslx.org
#
# General information about OpenSLX can be found under http://openslx.org
#
# Universal (distro independent) hardware autoconfiguration script for 
# OpenSLX linux stateless clients, using SuSE hwinfo for configuration

#############################################################################
# pre part, load USB modules and start hardware detection pci
base () {
# avoid annoying error messages because of missing scripts
for tool in /usr/sbin/acpidump \
            /usr/bin/udevinfo \
            /sbin/dmraid ; do
              testmkd ${tool%/*}
              echo -e "#!/bin/sh" >${tool}
              chmod u+x ${tool}
done
# no kernel messages
echo "0 0 0 0" >/proc/sys/kernel/printk
modprobe -a ${MODPRV} usbhid hid-bright hid-generic 2>/dev/null &
# required to properly trigger firmware loading
echo "/sbin/mdev" >/proc/sys/kernel/hotplug
# check from vga= that the traditional framebuffer is needed e.g. for splashy
# get information on the graphics adaptor if bootsplash or xserver plugins are
# present and the new drm/kms infrastructure is present
if strinfile "vga=" /proc/cmdline; then
  ( modprobe -a vesafb fbcon 2>/dev/null
    hwinfo --gfxcard >/etc/hwinfo.gfxcard ) &
elif [ -e /etc/init-hooks/00-started/xserver.sh -o \
       -e /etc/init-hooks/05-have-kernelvars/bootsplash.sh ] && \
     [ -e /lib/modules/${KERNEL}/kernel/drivers/gpu ]; then
 # check for the standard modules (single gpu, multiple connector only)
  ( hwinfo --gfxcard >/etc/hwinfo.gfxcard
    case $(cat /etc/hwinfo.gfxcard) in
       *i915*)
         modprobe -a ${MODPRV} i915 2>/dev/null
         ;;
       *intel*|*Intel*)
         modprobe -a ${MODPRV} i810 i830 i915 2>/dev/null
         ;;
       *nvidia*|*NVidia*|*nouveau*)
         modprobe ${MODPRV} nouveau 2>/dev/null
         ;;
       *radeon*|*Radeon*)
         modprobe ${MODPRV} radeon 2>/dev/null
         ;;
       *mga*|*matrox*|*Matrox*)
         modprobe ${MODPRV} mga 2>/dev/null
         ;;
       *)
         modprobe -a ${MODPRV} r128 savage sis tdfx ttm via
         ;;
    esac
    modprobe -a drm fbcon ) & 
fi
 
# check and then load appropriate network card modules
nwcardlist=$(echo ${slxconf_listnwmod}|sed "s/\ /|/g")
# save results for later info and for Xen plugin when starting Xen VM
hwinfo --netcard --usb-ctrl >/etc/hwinfo.netcard-usbctrl
grep modprobe /etc/hwinfo.netcard-usbctrl | grep -E "$nwcardlist|hcd" \
  | grep -v ehci | sed 's/.* Cmd: "//;s/"//;s/modprobe/modprobe -b ${MODPRV}/' \
  | sort -u >/etc/modprobe.base
# virtio hack
if [ $(grep -ic "virtio_pci" /etc/modprobe.base) -ge 1 ]; then
  echo 'modprobe ${MODPRV} virtio_net' >>/etc/modprobe.base
fi
sh /etc/modprobe.base

# optimization possible: exclude network and usb base drivers from the
# following list (bios detection for non-hwautocfg component)
( hwinfo --pci >/etc/hwinfo.data; echo "read pci device list at $(sysup)" \
    >/tmp/hwdataready ) &
( usleep 100000 ; hwinfo --bios >/etc/hwinfo.bios ) &
# for mounting partitions/devices with the "auto" option
echo -e "ext3\next2\nreiserfs\nxfs\njfs\next4\nvfat" >/etc/filesystems
# request a local block device for config and root filesystem (lbd://)
if grep -iq '"lbd://' /proc/cmdline /etc/initramfs-setup; then
  modprobe -a ${MODPRV} ehci_hcd usb-storage sd_mod
  
fi
return 0
}

#############################################################################
# main part
hwmain () {
# activate the previously detected devices
[ $DEBUGLEVEL -ge 2 ] || modloadbg=" >/dev/null 2>\&1"
# check for rtc if not compiled directly into the kernel
( [ -e /proc/driver/rtc ] || modprobe ${MODPRV} rtc-cmos ) &
waitfor /tmp/hwdataready 10000
sed '/Driver Info #1/,/Config Status:/d' /etc/hwinfo.data | grep modprobe \
  | sed "s|.* Cmd: \"||;s|\"|$modloadbg|;s|modprobe|modprobe -b ${MODPRV}|" \
  | sort -u >/etc/modprobe.pci
sh /etc/modprobe.pci


# bluetooth setup (start it later if present, depends on firmware availa-
# bility, interpreted by servconfig)
#( hwinfo --bluetooth >/etc/hwinfo.bt ) &

# load harddisk driver and check for harddisk
( grep -q -E "SCSI|SATA" /etc/hwinfo.data && modprobe ${MODPRV} sd_mod
  grep -q -E  "IDE" /etc/hwinfo.data && modprobe ${MODPRV} ide-disk
  hwinfo --disk | sed -n "/Device File: /p" | \
    sed -e "s|.*Device File: /dev/||;s| .*||" >/etc/hwinfo.disk
  echo "disk detection finished at $(sysup)" >/tmp/diskready; ) &
[ $DEBUGLEVEL -eq 21 ] && echo "** finished 2nd hwdetection at $(sysup)"

# load disk/optical high level drivers
modprobe ${MODPRV} ide-cd 2>/dev/null
modprobe ${MODPRV} sr_mod 2>/dev/null
modprobe ${MODPRV} ide-floppy 2>/dev/null


# load kernel module for ps2 mice and map the mousehandler to /dev/input/mice
( [ -f /lib/modules/${KERNEL}/kernel/drivers/input/mouse/psmouse.ko ] && \
    modprobe ${MODPRV} psmouse 
  [ -f /lib/modules/${KERNEL}/kernel/drivers/input/mousedev.ko ] && \
    modprobe ${MODPRV} mousedev
  testmkd /dev/input 
  mknod /dev/input/mice c 13 63 2>/dev/null
  hwinfo --mouse >/etc/hwinfo.mouse ) &

# complete the audio configuration and load the dummy module if no audio
# hardware is present in the machine
grep -q -E "Audio|sound" /etc/hwinfo.data || modprobe snd-dummy
modprobe ${MODPRV} snd-pcm-oss
modprobe ${MODPRV} snd-mixer-oss
#ln -s /proc/sound/oss/sndstat /dev/sndstat

[ $DEBUGLEVEL -eq 21 ] && echo "** finished most of module loading at $(sysup)"

# scanner setup (fixme: to be checked)
hwinfo --scanner >/etc/hwinfo.scanner
[ -f /tmp/scanner-udev ] && cat /tmp/scanner-udev \
  >>/mnt/etc/udev/rules.d/04-scanner.rules

# parallel port setup
modprobe ${MODPRV} parport_pc && modprobe ${MODPRV} ppdev

# if any new device appeared up to now

return 0
}
#############################################################################
# harddisk partition setup part
disk () {
# get idea of availabe harddisk partitions, put swap partitions into
# (/mnt)/etc/fstab and format and mount partitions of type 44 (unknown)
[ $DEBUGLEVEL -eq 21 ] && echo "** starting hdd stuff at $(sysup)"
waitfor /tmp/diskready 20000
if [ -s /etc/hwinfo.disk ] ; then
  for hd in $(cat /etc/hwinfo.disk) ; do
    fdisk -l /dev/$hd|sed -n "/^\/dev\//p" >/etc/disk.partition
    for hdpartnr in $(cat /etc/disk.partition | \
        sed -n -e "/ 82 /p"|sed -e "s/[[:space:]].*//") ; do
      echo -e "$hdpartnr\tswap\t\tswap\t\tdefaults\t 0 0" >>/tmp/fstab
    done
    # we use special non assigned partition type (id44) for harddisk scratch 
    # space, thus no normal filesystem will be incidentally deleted or
    # corrupted
    for hdpartnr in $(cat /etc/disk.partition | \
        sed -n -e "/ 44 /p"|sed -e "s/[[:space:]].*//") ; do
      # check for supported filesystem and formatter
      ( if diskfm $hdpartnr ; then
          echo "$hdpartnr is mounted to /mnt/tmp at $(sysup)" >/tmp/tmpready
          echo -e "$hdpartnr\t/tmp\t\tauto\t\tdefaults\t 0 0" >>/tmp/fstab
        else
          echo "formatting failed for some reason ($(sysup))" >/tmp/tmpready
        fi ) &
      part44=yes
      break
    done
    # put detected linux partitions (83) into /etc/fstab with "noauto", 
    # special partition 45 (persistent scratch) to /var/scratch and 46
    # to /var/openslx
    for partid in 83 45 46 ; do
      for hdpartnr in $(cat /etc/disk.partition | \
          sed -n -e "/ ${partid} /p"|sed -e "s/[[:space:]].*//") ; do
        mkdir -p /mnt/media/${hdpartnr#/dev/*} 2>/dev/null
        if [ ${partid} -eq 83 ] ; then
          echo -e "$hdpartnr\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto,\
noexec\t 0 0" >>/tmp/fstab
        elif [ ${partid} -eq 45 ] ; then
          # if more than one id45 present, the latter ones are simply mounted
          # over the previous (the mounts are postponed a bit via do_mnt to
          # have the filesystem completely prepared) 
          echo -e "waitfor ${hdpartnr} 10000\n\
            mount -t auto ${hdpartnr} /mnt/media/${hdpartnr#/dev/*}\n\
            ln -sf /media/${hdpartnr#/dev/*} /mnt/var/scratch" >>/etc/do_mnt
          echo -e "${hdpartnr}\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto\
\t\t 0 0" >>/tmp/fstab
        elif [ ${partid} -eq 46 ] ; then
          # mount a home directory to (/mnt)/var/home
          echo -e "waitfor ${hdpartnr} 10000\n\
            mount -t auto ${hdpartnr} /mnt/media/${hdpartnr#/dev/*} \n\
            test -d /mnt/media/${hdpartnr#/dev/*}/home && \
              ln -sf /media/${hdpartnr#/dev/*} /mnt/var/home" >>/etc/do_mnt
          echo -e "${hdpartnr}\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto\
\t\t 0 0" >>/tmp/fstab
        fi
      done
    done
  done
  # determine if tmp preparation should wait for format/mount or not
  [ -z "$part44" ] && echo "finished at $(sysup)" >/tmp/tmpready
else
  echo "no harddisk found ( $(sysup) )" >/tmp/tmpready
fi
[ $DEBUGLEVEL -eq 21 ] && echo "** finished hdd stuff at $(sysup)"
}

#############################################################################
# cleanup/finishing part
finish () {

# mount filesystem parts (if any) requested in disk setup
[ -f /etc/do_mnt ] && \
  { sed -e "1i. /etc/functions" -i /etc/do_mnt; sh /etc/do_mnt; } &
# remove unneeded disk and mouse drivers
[ ! -s /etc/hwinfo.disk ] && rmmod sd_mod 2>/dev/null
#grep -q " PS/2 " /etc/hwinfo.mouse || \
#  { rmmod psmouse 2>/dev/null; rm /dev/psaux 2>/dev/null; }
# more sophistication possible :)
return 0
}

#############################################################################
# main script starts here

# functions common for all distros
. /etc/functions
# functions common for all distros, messages contains all error and
# info output
. /etc/messages
# load distro specific configuration variables and functions. distro
# specific functions may overwrite functions defined in /etc/functions
. /etc/distro-functions
# source general slx and initramfs-setup settings
. /etc/slxsystem.conf
. /etc/initramfs-setup

# script run timer
[ $DEBUGLEVEL -eq 8 -o $DEBUGLEVEL -eq 21 ] && \
  echo "** HW $1 setup started at $(sysup)"

# heavy debugging output in level 3 and above and specific for 11
[ $DEBUGLEVEL -gt 3 -a $DEBUGLEVEL -lt 8 -o $DEBUGLEVEL -eq 11 ] && \
  set -x

case $1 in
  # pre initialization: loading USB base and network adaptor modules,
  # detection of other pci bus modules
  base)
    base
  ;;
  # main part of hardware setup of pci stuff
  main)
    hwmain
    # main script run timer or debug information
    [ $DEBUGLEVEL -eq 8 -o $DEBUGLEVEL -eq 21 ] && \
      echo "** HW main setup finished at $(sysup)"
    echo "hwsetup main part finished at $(sysup)" >/tmp/hwcfg
  ;;
  # disk setup part (detecting general id82,83 and slx id44,45,46, formatting 
  # if required and mounting)
  disk)
    # try to enable compressed RAM SWAP / ZRAM
    if modprobe ${MODPRV} ramzswap 2>/dev/null && [ -f /usr/bin/rzscontrol ] ; then
      rzscontrol /dev/ramzswap0 --init
      swapon /dev/ramzswap0 2>/dev/null
      #hdswap="# disk swap disabled because of enabled compressed ramswap"
    elif modprobe ${MODPRV} zram 2>/dev/null ; then
      # assign a quarter of total mem to zram
      echo $(( $(free -k | awk '/^Mem:/ { print $2 }') * 256 )) > /sys/block/zram0/disksize
      mkswap /dev/zram0 2>/dev/null
      swapon /dev/zram0 2>/dev/null
    fi
    # if disk action is not disabled
    if [ "x${hw_local_disk}" != "xno" ] ; then
      disk
    else
      echo "using harddisk switched off by hw_local_disk set to 'no' ( $(sysup) )" \
        >/tmp/tmpready
    fi
  ;;
  # remove unneeded kernel modules
  finish)
    finish
  ;;
esac