| 1 | beyerle@PS | 1 | #!/bin/ash
 | 
        
           |  |  | 2 | #
 | 
        
           |  |  | 3 | # Functions library :: for Linux Live scripts 5.x.y
 | 
        
           |  |  | 4 | # Author: Tomas M. <http://www.linux-live.org>
 | 
        
           |  |  | 5 | #
 | 
        
           | 169 | beyerle@PS | 6 | # modified by Urs Beyerle
 | 
        
           | 1 | beyerle@PS | 7 | # - to allow LiveCD mounted over nfs
 | 
        
           |  |  | 8 | # - add scsi_mod, sd_mod for usb-storage module
 | 
        
           |  |  | 9 | # - only with boot option "automount", all devices in fstab are rw automounted
 | 
        
           |  |  | 10 | # - remove detect of CD and Floppy (done by fstab-sync)
 | 
        
           |  |  | 11 | # - add sr_mod (USB CDROM support)
 | 
        
           |  |  | 12 | # - add SATA to modprobe_usb_modules -> modprobe_usb_sata_modules
 | 
        
           |  |  | 13 | # - add fscache (for SL5) 
 | 
        
           |  |  | 14 | # - add ide-cd, sr_mod, cdrom (for SL5 cdrom support)
 | 
        
           | 37 | beyerle@PS | 15 | # - add aufs (unionfs replacement)
 | 
        
           |  |  | 16 | # - to allow LiveCD mounted over NFS (for diskless client)
 | 
        
           | 48 | beyerle@PS | 17 | # - add functions get_dhcp_lease() and load_network_modules()
 | 
        
           | 85 | beyerle@PS | 18 | # - add ata_piix to modprobe_usb_sata_modules
 | 
        
           | 100 | beyerle@PS | 19 | # - works with unionfs 2.x
 | 
        
           |  |  | 20 | # - better detection of network card in case of diskless client
 | 
        
           | 126 | beyerle@PS | 21 | # - add sg, sata_nv module
 | 
        
           | 160 | beyerle@PS | 22 | # - to allow LiveCD mounted over CIFS (for diskless client)
 | 
        
           | 1 | beyerle@PS | 23 | #
 | 
        
           |  |  | 24 |   | 
        
           |  |  | 25 | # ===========================================================
 | 
        
           |  |  | 26 | # user interface functions
 | 
        
           |  |  | 27 | # ===========================================================
 | 
        
           |  |  | 28 |   | 
        
           |  |  | 29 | # echolog
 | 
        
           |  |  | 30 | # $1 = text to show and to write to /var/log/messages
 | 
        
           |  |  | 31 | #
 | 
        
           |  |  | 32 | echolog()
 | 
        
           |  |  | 33 | {
 | 
        
           |  |  | 34 |    echo "LIVECD:" "$@" >>/var/log/livedbg
 | 
        
           |  |  | 35 |    echo "$@"
 | 
        
           |  |  | 36 | }
 | 
        
           |  |  | 37 |   | 
        
           |  |  | 38 | # debug
 | 
        
           |  |  | 39 | # commands executed when debug boot parameter is present
 | 
        
           |  |  | 40 | #
 | 
        
           |  |  | 41 | debug()
 | 
        
           |  |  | 42 | {
 | 
        
           |  |  | 43 |    echo
 | 
        
           |  |  | 44 |    echo "====="
 | 
        
           |  |  | 45 |    echo ": Debugging started. Here is the root shell for you."
 | 
        
           |  |  | 46 |    echo ": Type your desired command or hit Ctrl+D to continue booting."
 | 
        
           |  |  | 47 |    echo
 | 
        
           |  |  | 48 |    ash
 | 
        
           |  |  | 49 | }
 | 
        
           |  |  | 50 |   | 
        
           |  |  | 51 | # header
 | 
        
           |  |  | 52 | # $1 = text to show
 | 
        
           |  |  | 53 | #
 | 
        
           |  |  | 54 | header()
 | 
        
           |  |  | 55 | {
 | 
        
           |  |  | 56 |    echolog "[0;1m$1[0;0m"
 | 
        
           |  |  | 57 | }
 | 
        
           |  |  | 58 |   | 
        
           |  |  | 59 | fatal()
 | 
        
           |  |  | 60 | {
 | 
        
           |  |  | 61 |    header "Fatal error occured - $1"
 | 
        
           |  |  | 62 |    echolog "Something went wrong and we can't continue booting :("
 | 
        
           |  |  | 63 |    echolog "You may explore the system by using simple commands like ls, lsmod, mount, etc."
 | 
        
           |  |  | 64 |    echolog "You may also try to hit Ctrl+D. Booting will continue. Use at your own risk."
 | 
        
           |  |  | 65 |    echolog "To be safe, hit Ctrl+Alt+Delete to reboot."
 | 
        
           |  |  | 66 |    echolog
 | 
        
           |  |  | 67 |    ash
 | 
        
           |  |  | 68 | }
 | 
        
           |  |  | 69 |   | 
        
           |  |  | 70 | # ===========================================================
 | 
        
           |  |  | 71 | # text processing functions
 | 
        
           |  |  | 72 | # ===========================================================
 | 
        
           |  |  | 73 |   | 
        
           |  |  | 74 | # egrep_o is a replacement for "egrep -o". It prints only the last
 | 
        
           |  |  | 75 | # matching text
 | 
        
           |  |  | 76 | # $1 = regular expression
 | 
        
           |  |  | 77 | #
 | 
        
           |  |  | 78 | egrep_o()
 | 
        
           |  |  | 79 | {
 | 
        
           |  |  | 80 |    cat | egrep "$1" | sed -r "s/.*($1).*/\\1/"
 | 
        
           |  |  | 81 | }
 | 
        
           |  |  | 82 |   | 
        
           |  |  | 83 | # look into cmdline and echo $1 back if $1 is set
 | 
        
           |  |  | 84 | # $1 = value name, case sensitive, for example livecd_subdir
 | 
        
           |  |  | 85 | # $2 = file to use instead /proc/cmdline, optional
 | 
        
           |  |  | 86 | #
 | 
        
           |  |  | 87 | cmdline_parameter()
 | 
        
           |  |  | 88 | {
 | 
        
           |  |  | 89 |    CMDLINE=/proc/cmdline
 | 
        
           |  |  | 90 |    if [ "$2" != "" ]; then CMDLINE="$2"; fi
 | 
        
           |  |  | 91 |    cat "$CMDLINE" | egrep_o "(^|[[:space:]]+)$1(\$|=|[[:space:]]+)" | egrep_o "$1"
 | 
        
           |  |  | 92 | }
 | 
        
           |  |  | 93 |   | 
        
           |  |  | 94 | # look into cmdline and echo value of $1 option
 | 
        
           |  |  | 95 | # $1 = value name, case sensitive, for example livecd_subdir
 | 
        
           |  |  | 96 | # $2 = file to use instead /proc/cmdline, optional
 | 
        
           |  |  | 97 | #
 | 
        
           |  |  | 98 | cmdline_value()
 | 
        
           |  |  | 99 | {
 | 
        
           |  |  | 100 |    CMDLINE=/proc/cmdline
 | 
        
           |  |  | 101 |    if [ "$2" != "" ]; then CMDLINE="$2"; fi
 | 
        
           |  |  | 102 |    cat "$CMDLINE" | egrep_o "(^|[[:space:]]+)$1=([^[:space:]]+)" | egrep_o "=.*" | cut -b 2- | tail -n 1
 | 
        
           |  |  | 103 | }
 | 
        
           |  |  | 104 |   | 
        
           |  |  | 105 | # ===========================================================
 | 
        
           |  |  | 106 | # system functions
 | 
        
           |  |  | 107 | # ===========================================================
 | 
        
           |  |  | 108 |   | 
        
           |  |  | 109 | # modprobe module $1, including all dependencies, suppress all messages
 | 
        
           |  |  | 110 | # (own function because modprobe in busybox doesn't work with gzipped modules)
 | 
        
           |  |  | 111 | # $1 = module name, eg. ehci-hcd
 | 
        
           |  |  | 112 | # $2 = optional argument
 | 
        
           |  |  | 113 | #
 | 
        
           |  |  | 114 | modprobe_module()
 | 
        
           |  |  | 115 | {
 | 
        
           |  |  | 116 |   if [ "$1" = "" ]; then return 1; fi
 | 
        
           |  |  | 117 |   PRINTK=`cat /proc/sys/kernel/printk`
 | 
        
           |  |  | 118 |   echo "0" >/proc/sys/kernel/printk
 | 
        
           |  |  | 119 |   | 
        
           |  |  | 120 |   KERNEL="`uname -r`"; LSMOD=/tmp/lsmod
 | 
        
           |  |  | 121 |   MODULEDEPS="`cat /lib/modules/$KERNEL/modules.dep | egrep \"$1\\.ko(\\.gz)?:\"`"
 | 
        
           |  |  | 122 |   | 
        
           |  |  | 123 |   for MODULE in `echo $MODULEDEPS | cut -d ":" -f 2-` `echo $MODULEDEPS | cut -d ":" -f 1`; do
 | 
        
           |  |  | 124 |      MODULE=${MODULE%%:};   # remove : at the end, a bug 
 | 
        
           |  |  | 125 |      TMPMOD="/tmp/`basename $MODULE .gz`";
 | 
        
           |  |  | 126 |      # if the module is not loaded already
 | 
        
           |  |  | 127 |      if [ "`cat $LSMOD 2>/dev/null | egrep \"^$TMPMOD\\\$\"`" = "" ]; then
 | 
        
           |  |  | 128 |         gunzip -c $MODULE 2>/dev/null >$TMPMOD
 | 
        
           | 100 | beyerle@PS | 129 |         if [ $? -ne 0 ]; then cp $MODULE $TMPMOD; fi # can't gunzip? copy
 | 
        
           | 1 | beyerle@PS | 130 |         insmod $TMPMOD $2; err=$?
 | 
        
           |  |  | 131 |         ### insmod $TMPMOD $2 >/dev/null 2>/dev/null; err=$?
 | 
        
           |  |  | 132 |         if [ "$err" -eq 0 ]; then echo $TMPMOD >>$LSMOD; fi # module log
 | 
        
           |  |  | 133 |         rm $TMPMOD
 | 
        
           |  |  | 134 |      fi
 | 
        
           |  |  | 135 |   done
 | 
        
           |  |  | 136 |   | 
        
           |  |  | 137 |   echo "$PRINTK" >/proc/sys/kernel/printk
 | 
        
           |  |  | 138 |   if [ "$err" -ne 0 ]; then echolog "error inserting module $1 ($err)"; fi
 | 
        
           |  |  | 139 |   return $err
 | 
        
           |  |  | 140 | }
 | 
        
           |  |  | 141 |   | 
        
           |  |  | 142 | # Mount device $1 to $2
 | 
        
           |  |  | 143 | # $1 = /dev device to mount, eg. /dev/hda1
 | 
        
           |  |  | 144 | # $2 = mountpoint, eg. /mnt/hda1
 | 
        
           |  |  | 145 | # $3 = mount options, for example "loop", "ro", or "remount,rw"
 | 
        
           |  |  | 146 | #
 | 
        
           |  |  | 147 | mount_device()
 | 
        
           |  |  | 148 | {
 | 
        
           |  |  | 149 |   mkdir -p $2
 | 
        
           |  |  | 150 |   if [ "$3" != "" ]; then OPTIONS="-o $3"; else OPTIONS=""; fi
 | 
        
           |  |  | 151 |   | 
        
           |  |  | 152 |   PRINTK=`cat /proc/sys/kernel/printk`
 | 
        
           |  |  | 153 |   echo "0" >/proc/sys/kernel/printk
 | 
        
           |  |  | 154 |   | 
        
           |  |  | 155 |   mount -t auto $1 $2 $OPTIONS >/dev/null 2>/dev/null
 | 
        
           |  |  | 156 |   err=$?
 | 
        
           |  |  | 157 |   | 
        
           |  |  | 158 |   if [ "$err" -ne 0 ]; then rmdir $2 2>/dev/null; fi
 | 
        
           |  |  | 159 |   echo "$PRINTK" >/proc/sys/kernel/printk
 | 
        
           |  |  | 160 |   return $err
 | 
        
           |  |  | 161 | }
 | 
        
           |  |  | 162 |   | 
        
           |  |  | 163 | # ===========================================================
 | 
        
           |  |  | 164 | # live module functions
 | 
        
           |  |  | 165 | # ===========================================================
 | 
        
           |  |  | 166 |   | 
        
           |  |  | 167 | # Create module
 | 
        
           |  |  | 168 | # call mksquashfs with apropriate arguments
 | 
        
           |  |  | 169 | # $1 = directory which will be compressed to squashfs module
 | 
        
           |  |  | 170 | # $2 = output .mo file
 | 
        
           |  |  | 171 | # $3 = optional -keep-as-directory argument
 | 
        
           |  |  | 172 | #
 | 
        
           |  |  | 173 | create_module()
 | 
        
           |  |  | 174 | {
 | 
        
           |  |  | 175 |    mksquashfs $1 $2 $3 >/dev/null
 | 
        
           |  |  | 176 |    if [ $? -ne 0 ]; then return 1; fi
 | 
        
           |  |  | 177 |    chmod oga-x $2 # remove execute attrib
 | 
        
           |  |  | 178 | }
 | 
        
           |  |  | 179 |   | 
        
           |  |  | 180 | # Mount .mo module to destination directory
 | 
        
           |  |  | 181 | # $1 = path to .mo livecd compressed module
 | 
        
           |  |  | 182 | # $2 = destination folder
 | 
        
           |  |  | 183 | #
 | 
        
           |  |  | 184 | mount_module()
 | 
        
           |  |  | 185 | {
 | 
        
           |  |  | 186 |    mount -t squashfs -o loop,ro $1 $2
 | 
        
           |  |  | 187 | }
 | 
        
           |  |  | 188 |   | 
        
           |  |  | 189 | # Insert a directory tree $2 to an union specified by $1
 | 
        
           |  |  | 190 | # Top-level read-write branch is specified by it's index 0
 | 
        
           |  |  | 191 | # $1 = union absolute path (starting with /)
 | 
        
           |  |  | 192 | # $2 = path to data directory
 | 
        
           |  |  | 193 | #
 | 
        
           |  |  | 194 | union_insert_dir()
 | 
        
           |  |  | 195 | {
 | 
        
           | 100 | beyerle@PS | 196 |    which unionctl >/dev/null 2>&1
 | 
        
           |  |  | 197 |    if [ $? -eq 0 ]; then
 | 
        
           |  |  | 198 |        # unionfs 1.x or aufs
 | 
        
           |  |  | 199 |        unionctl "$1" --add --after 0 --mode ro "$2"
 | 
        
           |  |  | 200 |    else
 | 
        
           |  |  | 201 |        # unionfs 2.x
 | 
        
           |  |  | 202 |        mount -t unionfs -o remount,add=:${2}=ro none "$1"
 | 
        
           |  |  | 203 |    fi
 | 
        
           | 1 | beyerle@PS | 204 | }
 | 
        
           |  |  | 205 |   | 
        
           |  |  | 206 | # List all modules in all directories (base, modules, optional)
 | 
        
           |  |  | 207 | # and filter out unneeded optional modules (not specified by load= kernel parameter)
 | 
        
           |  |  | 208 | # $1 = root directory of mounted DATAdir
 | 
        
           |  |  | 209 | #
 | 
        
           |  |  | 210 | list_modules()
 | 
        
           |  |  | 211 | {
 | 
        
           |  |  | 212 |    LOAD="`cmdline_value load`"
 | 
        
           |  |  | 213 |    ls -A1d $1/*.mo $1/*/*.mo 2>/dev/null | while read LINE; do
 | 
        
           |  |  | 214 |       MODNAME="`basename $LINE .mo`"
 | 
        
           |  |  | 215 |       if [ "$LOAD" != "*" -a "`echo $LINE | grep optional`" != "" -a "`echo $LOAD | egrep \"(^|,)$MODNAME(\\\$|,)\"`" = "" ]; then continue
 | 
        
           |  |  | 216 |         else echo $LINE; fi
 | 
        
           |  |  | 217 |    done
 | 
        
           |  |  | 218 | }
 | 
        
           |  |  | 219 |   | 
        
           |  |  | 220 | # Insert one single .mo module to the union
 | 
        
           |  |  | 221 | # $1 = union absolute path (starting with /)
 | 
        
           |  |  | 222 | # $2 = module.mo full path
 | 
        
           |  |  | 223 | # $3 = destination folder, where images will be mounted to
 | 
        
           |  |  | 224 | #
 | 
        
           |  |  | 225 | union_insert_module()
 | 
        
           |  |  | 226 | {
 | 
        
           |  |  | 227 |    TARGET="$3/`basename $2`"
 | 
        
           |  |  | 228 |    while [ -e $TARGET ]; do TARGET=$TARGET.X; done
 | 
        
           |  |  | 229 |    mkdir -p $TARGET
 | 
        
           |  |  | 230 |    mount_module $2 $TARGET
 | 
        
           |  |  | 231 |    if [ $? -ne 0 ]; then echo "can't read module data"; return 1; fi
 | 
        
           |  |  | 232 |    union_insert_dir $1 $TARGET; 
 | 
        
           |  |  | 233 | }
 | 
        
           |  |  | 234 |   | 
        
           |  |  | 235 | # Insert all .mo modules, in $2 directory and subdirectories, to the union
 | 
        
           |  |  | 236 | # $1 = union absolute path (starting with /)
 | 
        
           |  |  | 237 | # $2 = LiveCD data dir (with directories /base, /modules, etc.)
 | 
        
           |  |  | 238 | # $3 = destination folder, where images will be mounted to
 | 
        
           |  |  | 239 | #
 | 
        
           |  |  | 240 | union_insert_modules()
 | 
        
           |  |  | 241 | {
 | 
        
           | 38 | beyerle@PS | 242 |    PRINTK=`cat /proc/sys/kernel/printk`
 | 
        
           |  |  | 243 |    echo "0" >/proc/sys/kernel/printk
 | 
        
           |  |  | 244 |   | 
        
           | 1 | beyerle@PS | 245 |    list_modules $2 | while read MODULE; do
 | 
        
           |  |  | 246 |       echo " -> `basename $MODULE`"
 | 
        
           |  |  | 247 |       union_insert_module $1 $MODULE $3
 | 
        
           |  |  | 248 |    done
 | 
        
           | 38 | beyerle@PS | 249 |   | 
        
           |  |  | 250 |    echo "$PRINTK" >/proc/sys/kernel/printk
 | 
        
           | 1 | beyerle@PS | 251 | }
 | 
        
           |  |  | 252 |   | 
        
           |  |  | 253 | # Copy modules to RAM directory
 | 
        
           |  |  | 254 | # $1 = data directory
 | 
        
           |  |  | 255 | # $2 = target directory in RAM
 | 
        
           |  |  | 256 | #
 | 
        
           |  |  | 257 | copy_to_ram()
 | 
        
           |  |  | 258 | {
 | 
        
           |  |  | 259 |    cp -R $1/* $2
 | 
        
           | 100 | beyerle@PS | 260 |    if [ $? -ne 0 ]; then fatal "can't copy to RAM, not enough memory?"; fi
 | 
        
           | 1 | beyerle@PS | 261 | }
 | 
        
           |  |  | 262 |   | 
        
           |  |  | 263 | # Copy content of "rootcopy" directory on the CD to $2 (union, usually)
 | 
        
           |  |  | 264 | # $1 = source
 | 
        
           |  |  | 265 | # $2 = destination
 | 
        
           |  |  | 266 | #
 | 
        
           |  |  | 267 | copy_rootchanges()
 | 
        
           |  |  | 268 | {
 | 
        
           |  |  | 269 |    cp -a $1/rootcopy/* $2 2>/dev/null # could be empty
 | 
        
           |  |  | 270 | }
 | 
        
           |  |  | 271 |   | 
        
           |  |  | 272 | # ===========================================================
 | 
        
           |  |  | 273 | # discovery functions
 | 
        
           |  |  | 274 | # ===========================================================
 | 
        
           |  |  | 275 |   | 
        
           |  |  | 276 | # List all CD-ROMs
 | 
        
           |  |  | 277 | # by using /proc entries
 | 
        
           |  |  | 278 | #
 | 
        
           |  |  | 279 | list_cdrom_devices()
 | 
        
           |  |  | 280 | {
 | 
        
           |  |  | 281 |    if [ "`cmdline_parameter nocd`" != "" ]; then return 1; fi
 | 
        
           |  |  | 282 |    for CDDEVICE in `cat /proc/sys/dev/cdrom/info | head -n 3 | tail -n 1 | cut -d ":" -f 2`; do
 | 
        
           |  |  | 283 |       echo "/dev/$CDDEVICE"
 | 
        
           |  |  | 284 |    done
 | 
        
           |  |  | 285 | }
 | 
        
           |  |  | 286 |   | 
        
           |  |  | 287 | # List all partition devices
 | 
        
           |  |  | 288 | # take list of all partitions and output unique disks.
 | 
        
           |  |  | 289 | # Return empty result when nohd parameter was given.
 | 
        
           |  |  | 290 | #
 | 
        
           |  |  | 291 | list_partition_devices()
 | 
        
           |  |  | 292 | {
 | 
        
           |  |  | 293 |    if [ "`cmdline_parameter nohd`" != "" ]; then return 1; fi
 | 
        
           |  |  | 294 |    cat /proc/partitions | grep -v loop | sed -r "s/^[0-9[:space:]]+/\/dev\//" | grep /dev/
 | 
        
           |  |  | 295 | }
 | 
        
           |  |  | 296 |   | 
        
           |  |  | 297 | # List all disk devices
 | 
        
           |  |  | 298 | #
 | 
        
           |  |  | 299 | list_disk_devices()
 | 
        
           |  |  | 300 | {
 | 
        
           |  |  | 301 |    list_partition_devices | egrep -v "[0-9]"
 | 
        
           |  |  | 302 | }
 | 
        
           |  |  | 303 |   | 
        
           |  |  | 304 | # List all block devices
 | 
        
           |  |  | 305 | #
 | 
        
           |  |  | 306 | list_block_devices()
 | 
        
           |  |  | 307 | {
 | 
        
           |  |  | 308 |    list_cdrom_devices
 | 
        
           |  |  | 309 |    list_partition_devices
 | 
        
           |  |  | 310 | }
 | 
        
           |  |  | 311 |   | 
        
           |  |  | 312 | # Try to mount all disks, partitions and cdroms and Find where the LiveCD is.
 | 
        
           |  |  | 313 | # If LiveCD found in the device, echo dirname of it's directory,
 | 
        
           |  |  | 314 | # and leave the device mounted. Mounting is not ro, but without any argument.
 | 
        
           |  |  | 315 | # $1 = directory where devices will be mounted
 | 
        
           |  |  | 316 | # added: mount $NFSROOT to /$1/nfs if NFSROOT is set. and search there for LiveCD
 | 
        
           |  |  | 317 | #
 | 
        
           |  |  | 318 | find_live_data_dir()
 | 
        
           |  |  | 319 | {
 | 
        
           |  |  | 320 |    if [ "$NFSROOT" != "" ]; then 
 | 
        
           |  |  | 321 |       DIR="/$1/nfs"
 | 
        
           |  |  | 322 |       mkdir -p $DIR
 | 
        
           | 108 | beyerle@PS | 323 |   | 
        
           |  |  | 324 |       # disable kernel warnings
 | 
        
           |  |  | 325 |       PRINTK=`cat /proc/sys/kernel/printk`
 | 
        
           |  |  | 326 |       echo "0" >/proc/sys/kernel/printk
 | 
        
           |  |  | 327 |       # try to mount nfs dir
 | 
        
           | 161 | beyerle@PS | 328 |       mount -t nfs -o $NFSOPT $NFSROOT $DIR
 | 
        
           | 108 | beyerle@PS | 329 |       # enable kernel warnings
 | 
        
           |  |  | 330 |       echo "$PRINTK" >/proc/sys/kernel/printk
 | 
        
           | 162 | beyerle@PS | 331 |    fi
 | 
        
           | 108 | beyerle@PS | 332 |   | 
        
           | 162 | beyerle@PS | 333 |    if [ "$CIFSROOT" != "" ]; then
 | 
        
           | 160 | beyerle@PS | 334 |       DIR="/$1/cifs"
 | 
        
           |  |  | 335 |       mkdir -p $DIR
 | 
        
           |  |  | 336 |   | 
        
           |  |  | 337 |       # disable kernel warnings
 | 
        
           |  |  | 338 |       PRINTK=`cat /proc/sys/kernel/printk`
 | 
        
           |  |  | 339 |       echo "0" >/proc/sys/kernel/printk
 | 
        
           |  |  | 340 |       # try to mount cifs dir
 | 
        
           | 161 | beyerle@PS | 341 |       mount -t cifs $CIFSROOT $DIR -o ro,$CIFSOPTS
 | 
        
           | 160 | beyerle@PS | 342 |       # enable kernel warnings
 | 
        
           |  |  | 343 |       echo "$PRINTK" >/proc/sys/kernel/printk
 | 
        
           | 162 | beyerle@PS | 344 |    fi
 | 
        
           | 160 | beyerle@PS | 345 |   | 
        
           | 167 | beyerle@PS | 346 |    PRINTK=`cat /proc/sys/kernel/printk`
 | 
        
           |  |  | 347 |    echo "0" >/proc/sys/kernel/printk
 | 
        
           | 162 | beyerle@PS | 348 |    if [ "$DIR" = "" ]; then
 | 
        
           |  |  | 349 |        list_block_devices | while read DEVICE; do
 | 
        
           |  |  | 350 | 	   DIR="/$1/`basename $DEVICE`"
 | 
        
           |  |  | 351 | 	   mount_device $DEVICE $DIR
 | 
        
           |  |  | 352 | 	   if [ $? -ne 0 ]; then continue; fi
 | 
        
           | 167 | beyerle@PS | 353 | 	   # FOUND=`find $DIR -name livecd.sgn -type f | head -n 1`
 | 
        
           |  |  | 354 | 	   FOUND=`ls -A1d $DIR/livecd.sgn $DIR/*/livecd.sgn 2>/dev/null | head -n 1`
 | 
        
           | 162 | beyerle@PS | 355 | 	   if [ "$FOUND" = "" ]; then umount $DIR 2>/dev/null; rmdir $DIR 2>/dev/null
 | 
        
           |  |  | 356 | 	   else dirname "$FOUND"; return 1; fi
 | 
        
           |  |  | 357 |        done
 | 
        
           | 1 | beyerle@PS | 358 |    else
 | 
        
           | 167 | beyerle@PS | 359 |        # FOUND=`find $DIR -name livecd.sgn -type f | head -n 1`
 | 
        
           |  |  | 360 |        FOUND=`ls -A1d $DIR/livecd.sgn $DIR/*/livecd.sgn 2>/dev/null | head -n 1`
 | 
        
           | 162 | beyerle@PS | 361 |        if [ "$FOUND" != "" ]; then 
 | 
        
           |  |  | 362 | 	   dirname "$FOUND"
 | 
        
           |  |  | 363 |        fi
 | 
        
           | 1 | beyerle@PS | 364 |    fi
 | 
        
           | 167 | beyerle@PS | 365 |    echo "$PRINTK" >/proc/sys/kernel/printk	   
 | 
        
           | 162 | beyerle@PS | 366 |   | 
        
           | 1 | beyerle@PS | 367 | }
 | 
        
           |  |  | 368 |   | 
        
           |  |  | 369 | # ===========================================================
 | 
        
           |  |  | 370 | # hardware preparation functions
 | 
        
           |  |  | 371 | # ===========================================================
 | 
        
           |  |  | 372 |   | 
        
           |  |  | 373 | # Create block devices to /dev described by /sys entries
 | 
        
           |  |  | 374 | #
 | 
        
           |  |  | 375 | create_block_devices()
 | 
        
           |  |  | 376 | {
 | 
        
           |  |  | 377 |    echolog "creating /dev entries for block devices"
 | 
        
           |  |  | 378 |    ls -A1d /sys/block/*/dev /sys/block/*/*/dev 2>/dev/null | grep -v loop | while read BLOCK; do
 | 
        
           |  |  | 379 |       DEVICE="/dev/`basename \`dirname $BLOCK\``"
 | 
        
           |  |  | 380 |       if [ ! -b $DEVICE ]; then
 | 
        
           |  |  | 381 |          MINORMAJOR="`head -n 1 $BLOCK | tr ':' ' '`"
 | 
        
           |  |  | 382 |          mknod $DEVICE b $MINORMAJOR
 | 
        
           |  |  | 383 |       fi
 | 
        
           |  |  | 384 |    done
 | 
        
           |  |  | 385 | }
 | 
        
           |  |  | 386 |   | 
        
           |  |  | 387 | # modprobe kernel modules needed for the LiveCD
 | 
        
           |  |  | 388 | #
 | 
        
           |  |  | 389 | modprobe_essential_modules()
 | 
        
           |  |  | 390 | {
 | 
        
           |  |  | 391 |    echolog "starting loop device support"
 | 
        
           | 109 | beyerle@PS | 392 |    modprobe_module loop max_loop=32
 | 
        
           | 1 | beyerle@PS | 393 |    echolog "starting cdrom support"
 | 
        
           |  |  | 394 |    modprobe_module ide_cd
 | 
        
           |  |  | 395 |    modprobe_module ide-cd
 | 
        
           |  |  | 396 |    modprobe_module sr_mod
 | 
        
           |  |  | 397 |    modprobe_module cdrom
 | 
        
           |  |  | 398 |    echolog "starting cdrom filesystem support"
 | 
        
           |  |  | 399 |    modprobe_module isofs
 | 
        
           |  |  | 400 |    echolog "starting squashfs support"
 | 
        
           |  |  | 401 |    modprobe_module squashfs
 | 
        
           | 37 | beyerle@PS | 402 |    echolog "starting unionfs/aufs support"
 | 
        
           | 1 | beyerle@PS | 403 |    modprobe_module unionfs
 | 
        
           | 37 | beyerle@PS | 404 |    modprobe_module aufs
 | 
        
           | 1 | beyerle@PS | 405 |    echolog "starting vfat support"
 | 
        
           | 120 | beyerle@PS | 406 |    # modprobe_module nls_cp437
 | 
        
           |  |  | 407 |    # modprobe_module nls_iso8859-1
 | 
        
           |  |  | 408 |    # modprobe_module nls_iso8859-2
 | 
        
           | 1 | beyerle@PS | 409 |    modprobe_module vfat
 | 
        
           |  |  | 410 |    echolog "starting ntfs support"
 | 
        
           |  |  | 411 |    modprobe_module ntfs
 | 
        
           | 166 | beyerle@PS | 412 |    modprobe_module nls_utf8
 | 
        
           | 1 | beyerle@PS | 413 |    create_block_devices
 | 
        
           |  |  | 414 | }
 | 
        
           |  |  | 415 |   | 
        
           |  |  | 416 |   | 
        
           |  |  | 417 | # modprobe kernel modules needed for USB masstorage devices
 | 
        
           |  |  | 418 | #
 | 
        
           |  |  | 419 | modprobe_usb_sata_modules()
 | 
        
           |  |  | 420 | {
 | 
        
           |  |  | 421 |    echolog "starting USB and SATA support"
 | 
        
           |  |  | 422 |    modprobe_module ehci-hcd
 | 
        
           |  |  | 423 |    modprobe_module ohci-hcd
 | 
        
           |  |  | 424 |    modprobe_module uhci-hcd
 | 
        
           |  |  | 425 |    modprobe_module scsi_mod
 | 
        
           |  |  | 426 |   | 
        
           |  |  | 427 |    modprobe_module libata
 | 
        
           | 85 | beyerle@PS | 428 |    modprobe_module ata_piix
 | 
        
           | 1 | beyerle@PS | 429 |    modprobe_module ahci
 | 
        
           | 126 | beyerle@PS | 430 |    modprobe_module sata_nv
 | 
        
           | 116 | beyerle@PS | 431 |    modprobe_module sg
 | 
        
           | 1 | beyerle@PS | 432 |   | 
        
           |  |  | 433 |    modprobe_module sd_mod
 | 
        
           |  |  | 434 |    modprobe_module sr_mod
 | 
        
           |  |  | 435 |    modprobe_module usb-storage
 | 
        
           | 163 | beyerle@PS | 436 |    echolog "waiting for USB devices, max 8 seconds"
 | 
        
           |  |  | 437 |    sleep 8
 | 
        
           | 1 | beyerle@PS | 438 |    create_block_devices
 | 
        
           |  |  | 439 | }
 | 
        
           |  |  | 440 |   | 
        
           |  |  | 441 | # modprobe nfs kernel modules
 | 
        
           |  |  | 442 | #
 | 
        
           |  |  | 443 | modprobe_nfs_modules()
 | 
        
           |  |  | 444 | {
 | 
        
           |  |  | 445 |    echolog "starting nfs support"
 | 
        
           |  |  | 446 |    modprobe_module lockd
 | 
        
           |  |  | 447 |    modprobe_module fscache
 | 
        
           |  |  | 448 |    modprobe_module nfs_acl
 | 
        
           |  |  | 449 |    modprobe_module nfs
 | 
        
           |  |  | 450 | }
 | 
        
           |  |  | 451 |   | 
        
           | 160 | beyerle@PS | 452 | # modprobe cifs kernel module
 | 
        
           |  |  | 453 | #
 | 
        
           |  |  | 454 | modprobe_cifs_modules()
 | 
        
           |  |  | 455 | {
 | 
        
           |  |  | 456 |   echolog "starting cifs support"
 | 
        
           |  |  | 457 |   modprobe_module cifs
 | 
        
           |  |  | 458 | }
 | 
        
           |  |  | 459 |   | 
        
           | 1 | beyerle@PS | 460 | # enable/disable CD autoejecting when unmounted
 | 
        
           |  |  | 461 | # $1 = 1|0 ... enable|disable
 | 
        
           |  |  | 462 | #
 | 
        
           |  |  | 463 | cd_autoeject()
 | 
        
           |  |  | 464 | {
 | 
        
           |  |  | 465 |    echo $1 >/proc/sys/dev/cdrom/autoeject
 | 
        
           |  |  | 466 | }
 | 
        
           |  |  | 467 |   | 
        
           |  |  | 468 | # Disable DMA if nodma boot parameter is present
 | 
        
           |  |  | 469 | #
 | 
        
           |  |  | 470 | setup_dma()
 | 
        
           |  |  | 471 | {
 | 
        
           |  |  | 472 |    if [ ! "`cmdline_parameter nodma`" = "" ]; then
 | 
        
           |  |  | 473 |       for DEVICE in `list_cdrom_devices` `list_disk_devices`; do
 | 
        
           |  |  | 474 |          echolog "setting DMA support off for $DEVICE"
 | 
        
           |  |  | 475 |          hdparm -d 0 $DEVICE
 | 
        
           |  |  | 476 |       done
 | 
        
           |  |  | 477 |    fi
 | 
        
           |  |  | 478 | }
 | 
        
           |  |  | 479 |   | 
        
           |  |  | 480 | # create correct fstab file in $1/etc/fstab and create apropriate
 | 
        
           |  |  | 481 | # mount directories in $1
 | 
        
           |  |  | 482 | # $1 = root directory (union)
 | 
        
           |  |  | 483 | #
 | 
        
           |  |  | 484 | activate_fstab()
 | 
        
           |  |  | 485 | {
 | 
        
           |  |  | 486 |    mkdir -p $1/etc
 | 
        
           |  |  | 487 |    FSTAB="$1/etc/fstab"
 | 
        
           |  |  | 488 |    echo "tmpfs            /                tmpfs       defaults         0   0" >$FSTAB
 | 
        
           |  |  | 489 |    echo "devpts           /dev/pts         devpts      gid=5,mode=620   0   0" >>$FSTAB
 | 
        
           |  |  | 490 |    echo "proc             /proc            proc        defaults         0   0" >>$FSTAB
 | 
        
           |  |  | 491 |   | 
        
           | 48 | beyerle@PS | 492 |    # all the rest will be done by runlast or by fstab-sync
 | 
        
           |  |  | 493 |    # search for SWAP done later in /etc/rc.sysinit
 | 
        
           |  |  | 494 | }
 | 
        
           | 1 | beyerle@PS | 495 |   | 
        
           |  |  | 496 |   | 
        
           | 48 | beyerle@PS | 497 | # ===========================================================
 | 
        
           |  |  | 498 | # functions used for LiveCD on NFS 
 | 
        
           |  |  | 499 | # ===========================================================
 | 
        
           | 1 | beyerle@PS | 500 |   | 
        
           | 37 | beyerle@PS | 501 | # load network modules, if NFSROOT is set
 | 
        
           | 169 | beyerle@PS | 502 | # Urs Beyerle
 | 
        
           | 48 | beyerle@PS | 503 | #
 | 
        
           | 100 | beyerle@PS | 504 |   | 
        
           | 147 | beyerle@PS | 505 | # network devices found ?
 | 
        
           |  |  | 506 | #
 | 
        
           |  |  | 507 | found_nic()
 | 
        
           |  |  | 508 | {
 | 
        
           |  |  | 509 |     found="1"
 | 
        
           |  |  | 510 |     for iface in eth0 eth1 eth2 eth3 eth4 eth5; do
 | 
        
           |  |  | 511 | 	# nic already found ?
 | 
        
           |  |  | 512 | 	echo $FOUND_IFACE | grep -q $iface 
 | 
        
           |  |  | 513 | 	if [ $? -ne 0 ]; then
 | 
        
           |  |  | 514 | 	    ifconfig $iface > /dev/null 2>&1
 | 
        
           |  |  | 515 | 	    if [ $? -eq 0 ]; then 
 | 
        
           |  |  | 516 | 		FOUND_IFACE="$FOUND_IFACE $iface"
 | 
        
           |  |  | 517 | 		found="0"
 | 
        
           |  |  | 518 | 	    fi
 | 
        
           |  |  | 519 | 	fi
 | 
        
           |  |  | 520 |     done
 | 
        
           |  |  | 521 |     return $found
 | 
        
           |  |  | 522 | }
 | 
        
           |  |  | 523 |   | 
        
           | 104 | beyerle@PS | 524 | # 1. load network driver defined by kernel parameter nic
 | 
        
           |  |  | 525 | #
 | 
        
           |  |  | 526 | load_network_module_nic()
 | 
        
           | 37 | beyerle@PS | 527 | {
 | 
        
           | 147 | beyerle@PS | 528 |     NIC="`cmdline_value nic`"
 | 
        
           |  |  | 529 |     if [ -n "$NIC" ]; then
 | 
        
           | 100 | beyerle@PS | 530 | 	echolog "load module $NIC"
 | 
        
           | 104 | beyerle@PS | 531 | 	modprobe_module $NIC
 | 
        
           | 100 | beyerle@PS | 532 |     fi
 | 
        
           | 104 | beyerle@PS | 533 | }
 | 
        
           | 100 | beyerle@PS | 534 |   | 
        
           |  |  | 535 |   | 
        
           | 147 | beyerle@PS | 536 | # 2. auto probe for network card drivers
 | 
        
           | 104 | beyerle@PS | 537 | #
 | 
        
           |  |  | 538 | load_network_module_auto()
 | 
        
           |  |  | 539 | {
 | 
        
           |  |  | 540 |     echolog "auto-detection of network driver ..."
 | 
        
           | 147 | beyerle@PS | 541 |     FOUND_NICS=""
 | 
        
           | 104 | beyerle@PS | 542 |     KERNEL="`uname -r`"
 | 
        
           |  |  | 543 |     NETDRIVERS="`find /lib/modules/$KERNEL/kernel/drivers/net | grep -v mii | grep .ko | cut -d"/" -f8 | cut -d"." -f1 | uniq`"
 | 
        
           |  |  | 544 |     for driver in $NETDRIVERS; do
 | 
        
           | 148 | beyerle@PS | 545 |        	modprobe_module $driver > /dev/null 2>&1
 | 
        
           | 147 | beyerle@PS | 546 | 	found_nic
 | 
        
           |  |  | 547 | 	if [ $? -eq 0 ]; then
 | 
        
           |  |  | 548 | 	    echolog "found network card $driver"
 | 
        
           |  |  | 549 | 	    echolog "load module $driver"
 | 
        
           |  |  | 550 | 	    FOUND_NICS="$FOUND_NICS $driver"
 | 
        
           |  |  | 551 | 	else
 | 
        
           |  |  | 552 | 	    rmmod $driver > /dev/null 2>&1
 | 
        
           |  |  | 553 | 	fi
 | 
        
           | 104 | beyerle@PS | 554 |     done
 | 
        
           |  |  | 555 |   | 
        
           |  |  | 556 |     # clean up: remove unused modules until driver "mii"
 | 
        
           | 147 | beyerle@PS | 557 |     LOADED_DRIVERS="`lsmod | grep -v Module | cut -d" " -f1`"
 | 
        
           | 104 | beyerle@PS | 558 |     for driver in $LOADED_DRIVERS; do
 | 
        
           |  |  | 559 | 	[ "$driver" = "mii" ]  && break
 | 
        
           |  |  | 560 | 	[ "$driver" = "ntfs" ] && break
 | 
        
           |  |  | 561 | 	[ "$driver" = "vfat" ] && break
 | 
        
           | 147 | beyerle@PS | 562 | 	do_not_remove=""
 | 
        
           |  |  | 563 | 	for nic in $FOUND_NICS; do
 | 
        
           |  |  | 564 | 	    echo $driver | grep -q $nic 
 | 
        
           |  |  | 565 | 	    [ $? -eq 0 ] && do_not_remove="$driver"
 | 
        
           |  |  | 566 | 	done
 | 
        
           | 148 | beyerle@PS | 567 | 	[ ! $do_not_remove ] && rmmod $driver > /dev/null 2>&1
 | 
        
           | 104 | beyerle@PS | 568 |     done
 | 
        
           | 37 | beyerle@PS | 569 | }
 | 
        
           |  |  | 570 |   | 
        
           | 147 | beyerle@PS | 571 | # 3. detecting network card from pcitable list
 | 
        
           |  |  | 572 | #
 | 
        
           |  |  | 573 | load_network_module_pcitable()
 | 
        
           |  |  | 574 | {
 | 
        
           |  |  | 575 |     PCITABLE=/bin/pcitable
 | 
        
           |  |  | 576 |     NICS=`lspci -n | awk '/Class 0200/ {print $4}' | tr ':' ' ' \
 | 
        
           |  |  | 577 | 	| while read x y ; do grep "0x$x.*0x$y" $PCITABLE \
 | 
        
           |  |  | 578 | 	| awk '$3 !~ /"unknown"/ {print $3}' | tr -d '"' ; done`
 | 
        
           |  |  | 579 |   | 
        
           |  |  | 580 |     if [ -n "$NICS" ]; then
 | 
        
           |  |  | 581 | 	echolog "found network card(s): $NICS"
 | 
        
           |  |  | 582 | 	for driver in $NICS; do
 | 
        
           |  |  | 583 | 	    echolog "load module $driver"
 | 
        
           |  |  | 584 | 	    modprobe_module $driver
 | 
        
           |  |  | 585 | 	done
 | 
        
           |  |  | 586 |     fi
 | 
        
           |  |  | 587 | }
 | 
        
           |  |  | 588 |   | 
        
           | 104 | beyerle@PS | 589 | # 4. ask the user for a network driver
 | 
        
           |  |  | 590 | #
 | 
        
           |  |  | 591 | load_network_module_ask()
 | 
        
           |  |  | 592 | {
 | 
        
           |  |  | 593 |     echo "ERROR: No network card detected!"
 | 
        
           |  |  | 594 |     echo "Type in your network card driver (e.g. tg3, e1000). "
 | 
        
           |  |  | 595 |     echo "Or ask your system administrator for help."
 | 
        
           |  |  | 596 |     echo -n "Network card driver: "
 | 
        
           |  |  | 597 |     read driver
 | 
        
           | 148 | beyerle@PS | 598 |     echo "load module $driver"
 | 
        
           | 104 | beyerle@PS | 599 |     modprobe_module $driver
 | 
        
           |  |  | 600 | }
 | 
        
           |  |  | 601 |   | 
        
           |  |  | 602 | # Try to find a network driver
 | 
        
           |  |  | 603 | #
 | 
        
           |  |  | 604 | load_network_modules()
 | 
        
           |  |  | 605 | {
 | 
        
           | 163 | beyerle@PS | 606 |     echolog "load network modules"
 | 
        
           |  |  | 607 |   | 
        
           | 147 | beyerle@PS | 608 |     # mii maybe need by NIC driver
 | 
        
           | 104 | beyerle@PS | 609 |     modprobe_module mii
 | 
        
           |  |  | 610 |   | 
        
           | 147 | beyerle@PS | 611 |     FOUND_IFACE=""
 | 
        
           | 104 | beyerle@PS | 612 |     load_network_module_nic
 | 
        
           | 149 | beyerle@PS | 613 |     found_nic          || load_network_module_auto
 | 
        
           | 148 | beyerle@PS | 614 |     [ "$FOUND_IFACE" ] || load_network_module_pcitable
 | 
        
           |  |  | 615 |     [ "$FOUND_IFACE" ] || load_network_module_ask
 | 
        
           | 104 | beyerle@PS | 616 |   | 
        
           |  |  | 617 |     # remove mii, if not needed
 | 
        
           |  |  | 618 |     rmmod mii > /dev/null 2>&1
 | 
        
           |  |  | 619 | }
 | 
        
           |  |  | 620 |   | 
        
           | 147 | beyerle@PS | 621 |   | 
        
           | 37 | beyerle@PS | 622 | # get DHCP lease
 | 
        
           | 169 | beyerle@PS | 623 | # Urs Beyerle
 | 
        
           | 48 | beyerle@PS | 624 | #
 | 
        
           | 37 | beyerle@PS | 625 | get_dhcp_lease()
 | 
        
           |  |  | 626 | {
 | 
        
           |  |  | 627 |     # create /dev/urandom (needed by udhcpc)
 | 
        
           |  |  | 628 |     mknod /dev/urandom c 1 9
 | 
        
           | 147 | beyerle@PS | 629 |   | 
        
           |  |  | 630 |     for iface in eth0 eth1 eth2 eth3 eth4 eth5; do
 | 
        
           |  |  | 631 | 	# interface up ?
 | 
        
           |  |  | 632 | 	ifconfig $iface > /dev/null 2>&1
 | 
        
           |  |  | 633 | 	if [ $? -eq 0 ]; then
 | 
        
           | 148 | beyerle@PS | 634 | 	    # get dhcp lease
 | 
        
           |  |  | 635 | 	    echolog "try to get DHCP lease on $iface"
 | 
        
           |  |  | 636 | 	    udhcpc --now --quit --interface=$iface --script=/bin/udhcpc.script
 | 
        
           |  |  | 637 | 	    [ $? -eq 0 ] && return
 | 
        
           |  |  | 638 | 	    echo "ERROR: couldn't get DHCP lease on $iface."
 | 
        
           | 147 | beyerle@PS | 639 | 	fi
 | 
        
           | 102 | beyerle@PS | 640 |     done
 | 
        
           | 37 | beyerle@PS | 641 | }
 |