type fixes
[grml-terminalserver.git] / linuxrc
1 #!/static/sh
2 # Filename: /linuxrc
3 # Purpose:  minirt for kernel 2.6
4 # Authors:  (c) Klaus Knopper <knoppix@knopper.net>, (c) Michael Prokop <mika@grml.org>
5 # Latest change: Die Apr 19 11:44:14 CEST 2005 [mika]
6 #######################################################################################
7
8 # hardcoded configurable options
9 # Default maximum size of dynamic ramdisk in kilobytes
10 RAMSIZE=1000000
11 # End of options
12
13 # Don't allow interrupt signals
14 trap "" 1 2 3 15
15
16 # Misc functions
17 INSMOD="insmod"
18 [ -x /modules/insmod ] && INSMOD="/modules/insmod"
19
20 RMMOD="rmmod"
21 [ -x /modules/rmmod ] && RMMOD="/modules/rmmod"
22
23 # Builin filesystems
24 #BUILTIN_FS="iso9660 ext2 ext3 reiserfs vfat reiser4"
25 BUILTIN_FS="iso9660 ext2 vfat"
26
27 mountit(){
28 # Usage: mountit src dst "options"
29 # Uses builtin mount of ash.grml
30   for fs in $BUILTIN_FS; do
31   test -b $1 && mount -t $fs $3 $1 $2 >/dev/null 2>&1 && return 0
32   done
33   return 1
34 }
35
36 FOUND_SCSI=""
37 FOUND_GRML=""
38 INTERACTIVE=""
39
40 # Clean input/output
41 exec >/dev/console </dev/console 2>&1
42
43 # Mount /proc and /dev/pts
44 mount -t proc /proc /proc
45
46 # Disable kernel messages while probing modules in autodetect mode
47 echo "0" > /proc/sys/kernel/printk
48
49 mount -t devpts /dev/pts /dev/pts
50 # Kernel 2.6
51 mount -t sysfs /sys /sys >/dev/null 2>&1
52
53 # Read boot command line with builtin cat command (shell read function fails in Kernel 2.4.19-rc1)
54 CMDLINE="$(cat /proc/cmdline)"
55
56 # Simple shell grep
57 stringinfile(){
58   case "$(cat $2)" in *$1*) return 0;; esac
59   return 1
60 }
61
62 # same for strings
63 stringinstring(){
64   case "$2" in *$1*) return 0;; esac
65   return 1
66 }
67
68 # Reread boot command line; echo last parameter's argument or return false.
69 getbootparam(){
70   stringinstring " $1=" "$CMDLINE" || return 1
71   result="${CMDLINE##*$1=}"
72   result="${result%%[   ]*}"
73   echo "$result"
74   return 0
75 }
76
77 # Check boot commandline for specified option
78 checkbootparam(){
79   stringinstring " $1" "$CMDLINE"
80   return "$?"
81 }
82
83 if checkbootparam "nocolor" ; then
84   echo "Disabling colors in bootsequence as requested on commandline."
85   # Reset fb color mode
86   RESET="\e]R"
87   # ANSI COLORS
88   # Erase to end of line
89   CRE="\r\e[K"
90   # Clear and reset Screen
91   CLEAR="\ec"
92 else
93   # Reset fb color mode
94   RESET="\e]R"
95   # ANSI COLORS
96   # Erase to end of line
97   CRE="\r\e[K"
98   # Clear and reset Screen
99   CLEAR="\ec"
100   # Normal color
101   NORMAL="\e[0;39m"
102   # RED: Failure or error message
103   RED="\e[1;31m"
104   # GREEN: Success message
105   GREEN="\e[1;32m"
106   # YELLOW: Descriptions
107   YELLOW="\e[1;33m"
108   # BLUE: System mesages
109   BLUE="\e[1;34m"
110   # MAGENTA: Found devices or drivers
111   MAGENTA="\e[1;35m"
112   # CYAN: Questions
113   CYAN="\e[1;36m"
114   # BOLD WHITE: Hint
115   WHITE="\e[1;37m"
116 fi
117
118 # helper functions {{{
119 #log_success_msg () {
120 #  echo " * $@"
121 #}
122
123 log_failure_msg () {
124   echo " ${RED}*${NORMAL} $@"
125 }
126
127 #log_warning_msg () {
128 # echo " ${BLUE}*${NORMAL} $@"
129 #}
130
131 # int log_begin_message (char *message)
132 log_begin_msg () {
133   echo -n " ${GREEN}*${NORMAL} $@"
134 }
135
136 # int log_end_message (int exitstatus)
137 SUCCESS=" ${BLUE}[ ${GREEN}ok ${BLUE}]${NORMAL}"
138 FAILED=" ${NORMAL}[${RED}fail${NORMAL}]"
139 # }}}
140
141 # Clear screen with colormode reset
142 # echo "$CLEAR$RESET"
143 # echo "$CLEAR"
144 # Just go to the top of the screen
145 # echo -n "\e[H\e[J"
146 echo ""
147 # Be verbose
148 #echo "${WHITE}Welcome to ${CYAN}G${YELLOW}R${WHITE}M${RED}L${WHITE}!${NORMAL}"
149 #echo ""
150 #echo ""
151
152 echo "${WHITE}Welcome to"
153 echo ""
154 echo "${RED}   ____ ____  __  __ _     "
155 echo "${RED}  / ___|  _ \|  \/  | |    "
156 echo "${RED} | |  _| |_) | |\/| | |    "
157 echo "${RED} | |_| |  _ <| |  | | |___ "
158 echo "${RED}  \____|_| \_\_|  |_|_____|"
159 echo ""
160 echo "${WHITE}grml.org - Linux for users of texttools and sysadmins."
161 echo "${NORMAL}"
162
163 # We only need the builtin commands and /static at this point
164 PATH=/static
165 export PATH
166
167 umask 022
168
169 # Check if we are in interactive startup mode
170 case "$CMDLINE" in *BOOT_IMAGE=expert\ *) INTERACTIVE="yes"; :>/interactive; ;; esac
171 case "$CMDLINE" in *modules-disk*) INTERACTIVE="yes"; ;; esac
172 #case "$CMDLINE" in *BOOT_IMAGE=debug\ *|*\ debug\ *) DEBUG="yes"; ;; esac
173 case "$CMDLINE" in *debug*) DEBUG="yes"; ;; esac
174 # Does the user want to skip scsi detection?
175 NOSCSI=""
176 case "$CMDLINE" in *noscsi*|*nobootscsi*) NOSCSI="yes"; ;; esac
177 case "$CMDLINE" in *nousb*|*nobootusb*) NOUSB="yes"; ;; esac
178 case "$CMDLINE" in *nofirewire*|*nobootfirewire*) NOFIREWIRE="yes"; ;; esac
179 NOCD=""
180 case "$CMDLINE" in *fromhd*) NOCD="yes"; ;; esac
181 case "$CMDLINE" in *fromdvd*) FROMDVD="yes"; ;; esac
182 case "$CMDLINE" in *idecd*|*atapicd*) IDECD="yes"; ;; esac
183 case "$CMDLINE" in *noideraid*) NOIDERAID="yes"; ;; esac
184 USB2="ehci-hcd.ko"
185 case "$CMDLINE" in *nousb2*) USB2=""; ;; esac
186
187 GRML_DIR="GRML"
188 GRML_NAME="GRML"
189 case "$CMDLINE" in *grml_dir=*) GRML_DIR="$grml_dir"; ;; esac
190 case "$CMDLINE" in *grml_name=*) GRML_NAME="$grml_name"; ;; esac
191
192 # WARNING: In Kernel 2.4.27, CD-Roms cease to work if both, ide-scsi and ide-cd, are loaded. :-(
193 #if test -n "$IDECD"; then
194 # Use ide-cd for ATAPI-only CD-Rom(s)
195 #$INSMOD /modules/scsi/ide-cd.ko >/dev/null 2>&1
196 #$INSMOD /modules/scsi/ide-cd.ko
197 #else
198 # Check for IDE-SCSI capable CD-Rom(s) first
199 #$INSMOD /modules/scsi/ide-scsi.ko >/dev/null 2>&1 
200 #$INSMOD /modules/scsi/ide-scsi.ko
201 #fi
202
203 # Run a shell if in debug mode
204 # echo "${BLUE}Dropping you to a busybox shell for debugging.${NORMAL}"
205 stage=1
206 rundebugshell(){
207   if [ -n "$DEBUG" ]; then
208   echo "${CRE}${BLUE}Starting intermediate shell stage $stage as requested by \"debug\" option.${NORMAL}"
209   echo "${CRE}${BLUE}Just exit the shell to continue boot process...${NORMAL}"
210   [ -x /static/sh ] && /static/sh || /bin/bash
211 fi
212 }
213
214 # Mount module disk
215 mountmodules(){
216 TYPE="$1"; shift
217 echo -n "${CRE}Please insert ${TYPE} modules disk and hit Return."
218 read a
219 echo -n "${CRE}Mounting ${TYPE} modules disk... "
220 # We always mount over /modules/scsi (because it's there ;-)
221 if mountit /dev/fd0 /modules/scsi "-o ro"; then
222 echo "${GREEN}OK.${NORMAL}"
223 return 0
224 fi
225 echo "${RED}NOT FOUND.${NORMAL}"
226 return 1
227 }
228
229 # Unmount module disk
230 umountmodules(){
231 TYPE="$1"; shift
232 echo -n "${CRE}Unmounting ${TYPE} modules disk... "
233 umount /modules/scsi 2>/dev/null
234 echo "${GREEN}DONE.${NORMAL}"
235 }
236
237 # Ask user for modules
238 askmodules(){
239 TYPE="$1"; shift
240 echo "${TYPE} modules available:${WHITE}"
241 c=""; for m in "$@"; do
242 if test -f "/modules/scsi/$m"; then
243 test -z "$c"  && { echo -n "    $m"; c="1"; } || { echo "               $m"; c=""; }
244 fi
245 done
246 [ -n "$c" ] && echo ""
247 echo "Load ${TYPE} Modules?"
248 echo "[Enter full filename(s) (space-separated), Return for autoprobe, n for none] "
249 echo -n "insmod module(s)> "
250 read MODULES
251 case "$MODULES" in n|N) MODULES=""; ;; y|"")  MODULES="$*"; ;; esac
252 }
253
254 # Try to load the given modules (full path or current directory)
255 loadmodules(){
256 TYPE="$1"; shift
257 test -n "$INTERACTIVE" && echo "6" > /proc/sys/kernel/printk
258 for i in "$@"; do
259 echo -n "${CRE}Probing ${TYPE}... ${WHITE}$i${NORMAL}"
260 if test -f /modules/scsi/$i && $INSMOD -f /modules/scsi/$i >/dev/null 2>&1
261 then
262 # case "$i" in *ataraid*) ;; *) echo "${CRE} ${GREEN}Found ${TYPE} device(s) handled by ${MAGENTA}$i${GREEN}.${NORMAL}" ;; esac
263 case "$TYPE" in scsi|SCSI) FOUND_SCSI="yes"; ;; esac
264 fi
265 done
266 test -n "$INTERACTIVE" && echo "0" > /proc/sys/kernel/printk
267 echo -n "${CRE}"
268 }
269
270 # Check for SCSI, use modules on bootfloppy first
271 # Trying to do kind of /proc/pci hardware detection
272 PROCPCI="`cat /proc/pci 2>/dev/null`"
273 #ISA_SCSI="aha1740.ko aha1542.ko aha152x.ko pas16.ko psi240i.ko qlogicfas.ko qlogicfc.ko seagate.ko t128.ko u14-34f.ko wd7000.ko"
274 ISA_SCSI="aha1740.o aha1542.o aha152x.o pas16.o psi240i.o qlogicfas.o qlogicfc.o seagate.o t128.o u14-34f.o wd7000.o"
275 SCSI_PROBE="$ISA_SCSI"
276 case "$PROCPCI" in *[Aa][Ii][Cc]-*|*[Aa][Hh][Aa]-*) SCSI_PROBE="$SCSI_PROBE aic7xxx.o" ;; esac
277 case "$PROCPCI" in *[Bb][Uu][Ss][Ll][Oo][Gg][Ii][Cc]*) SCSI_PROBE="$SCSI_PROBE BusLogic.ko" ;; esac
278 case "$PROCPCI" in *53[Cc]8*) SCSI_PROBE="$SCSI_PROBE ncr53c8xx.o" ;; esac
279 #case "$PROCPCI" in *53[Cc]9*) SCSI_PROBE="$SCSI_PROBE NCR53C9x.ko" ;; esac
280 case "$PROCPCI" in *53[Cc]406*) SCSI_PROBE="$SCSI_PROBE NCR53c406a.ko" ;; esac
281 case "$PROCPCI" in *[Ii][Nn][Ii][Tt][Ii][Oo]\ *|*[Ii][Nn][Ii]-[Aa]100[Uu]2[Ww]*) SCSI_PROBE="$SCSI_PROBE initio.ko" ;; esac
282 case "$PROCPCI" in *[Mm][Pp][Tt]*[Ss][Cc][Ss][Ii]*) SCSI_PROBE="$SCSI_PROBE mptscsih.ko" ;; esac
283 case "$PROCPCI" in *[Aa][Dd][Vv][Aa][Nn][Cc][Ee][Dd]\ [Ss][Yy][Ss]*) SCSI_PROBE="$SCSI_PROBE advansys.ko" ;; esac
284 case "$PROCPCI" in *[Aa][Tt][Pp]8|*[Aa][Ee][Cc]6*) SCSI_PROBE="$SCSI_PROBE atp870u.ko" ;; esac
285 case "$PROCPCI" in *[Dd][Tt][Cc]*) SCSI_PROBE="$SCSI_PROBE dtc.ko" ;; esac
286 case "$PROCPCI" in *[Ee][Aa][Tt][Aa]*) SCSI_PROBE="$SCSI_PROBE eata.ko" ;; esac
287 case "$PROCPCI" in *[Ff]*[Dd][Oo][Mm][Aa][Ii][Nn]*) SCSI_PROBE="$SCSI_PROBE fdomain.ko" ;; esac
288 case "$PROCPCI" in *[Gg][Dd][Tt]\ *) SCSI_PROBE="$SCSI_PROBE gdth.ko" ;; esac
289 case "$PROCPCI" in *[Mm][Ee][Gg][Aa][Rr][Aa][Ii][Dd]*) SCSI_PROBE="$SCSI_PROBE megaraid.ko" ;; esac
290 #case "$PROCPCI" in *[Pp][Cc][Ii]-22*) SCSI_PROBE="$SCSI_PROBE pci2220i.ko" ;; esac
291 #case "$PROCPCI" in *[Pp][Cc][Ii]-2000*) SCSI_PROBE="$SCSI_PROBE pci2000.ko" ;; esac
292 case "$PROCPCI" in *[Qq][Ll][Oo][Gg][Ii][Cc]*) SCSI_PROBE="$SCSI_PROBE qlogicisp.ko" ;; esac
293 case "$PROCPCI" in *53[Cc]974*) SCSI_PROBE="$SCSI_PROBE tmscsim.ko" ;; esac
294 case "$PROCPCI" in *[Uu][Ll][Tt][Rr][Aa][Ss][Tt][Oo][Rr]*) SCSI_PROBE="$SCSI_PROBE ultrastor.ko" ;; esac
295 case "$PROCPCI" in *3[Ww][Aa][Rr][Ee]*) SCSI_PROBE="$SCSI_PROBE 3w-xxxx.ko" ;; esac
296 # modules/scsi/3w-9xxx.ko
297 # modules/scsi/a100u2w.ko
298 # modules/scsi/aic7xxx_old_CAUTION.ko
299
300 if test -n "$INTERACTIVE"; then
301 # Let the user select interactively
302 askmodules SCSI $(cd /modules/scsi; echo *.ko)
303 else
304 # these are the autoprobe-safe modules
305 MODULES="$SCSI_PROBE"
306 fi
307
308 test -z "$NOSCSI" && test -n "$MODULES" && loadmodules SCSI $MODULES
309 # End of SCSI check
310
311 ## test -z "$NOSCSI" && \
312 if checkbootparam scsi ; then
313   MODULE="$(getbootparam 'scsi' 2>/dev/null)"
314   if test "$MODULE" = "probe" ; then
315     echo "Bootoption scsi=probe found. Trying to autoprobe SCSI modules:" && \
316     loadmodules SCSI $MODULES
317   else
318     [ -n "$MODULE" ] || echo "${RED}Neither a specific module nor option probe for SCSI module given. Skipping.${NORMAL}"
319     [ -n "$MODULE" ] && echo "Trying to load module ${WHITE}${MODULE}${NORMAL}." && \
320     /modules/insmod "/modules/scsi/${MODULE}.ko"
321   fi
322 fi
323 #
324 #if checkbootparam module ; then
325 #  MODULE="$(getbootparam 'module' 2>/dev/null)"
326 #  # ehci-hcd ieee1394 ohci1394 ohci-hcd sbp2 uhci-hcd usbcore usb-storage
327 #  [ -n "$MODULE" ] && echo "${BLUE}Trying to load module ${MAGENTA}${MODULE}${BLUE}.${NORMAL}" && \
328 #  /modules/insmod "/modules/div/${MODULE}.ko"
329 #fi
330
331 #test -z "$NOSCSI" &&  \
332 #/static/discover --disable-bus all --enable-bus scsi --type bridge --normalize-whitespace --data-path=linux/module/name --data-version=`uname -r` | grep -v '^ $' | uniq
333 #echo "pci:"
334 #/static/discover --disable-bus all --enable-bus pci --type bridge --normalize-whitespace --data-path=linux/module/name --data-version=`uname -r` | grep -v '^ $' | uniq
335 #echo "End of Debugging SCSI"
336 #
337 #echo "Commands are:"
338 #echo "
339 #/static/discover --disable-bus all --enable-bus scsi --type bridge --normalize-whitespace --data-path=linux/module/name --data-version=\`uname -r\` | grep -v '^ $' | uniq
340 #/static/discover --disable-bus all --enable-bus pci --type bridge --normalize-whitespace --data-path=linux/module/name --data-version=\`uname -r\` | grep -v '^ $' | uniq
341 #"
342 #echo "Starting ash:"
343 #/static/ash
344 #echo "End of starting ash"
345
346 # Check for IDE-Raid devices
347 if test -z "$NOIDERAID"; then
348 ( cd /modules/scsi; { $INSMOD ataraid.ko >/dev/null 2>&1 && $INSMOD silraid.ko >/dev/null 2>&1 ; } || $INSMOD medley.ko >/dev/null 2>&1 || $INSMOD pdcraid.ko >/dev/null 2>&1 )
349 fi
350 # End of IDE-Raid check
351
352 # Check for USB, use modules on bootfloppy first
353 if test -z "$NOUSB"; then
354 echo -n "${CRE}Checking for for USB..."
355 if test -f /modules/div/usbcore.ko; then
356 $INSMOD /modules/div/usbcore.ko >/dev/null 2>&1
357 FOUNDUSB=""
358
359 for i in $USB2 usb-uhci.ko usb-ohci.ko; do
360 test -f /modules/div/$i && $INSMOD /modules/div/$i >/dev/null 2>&1 && FOUNDUSB="yes"
361 done
362 if test -n "$FOUNDUSB"; then
363 test -f /modules/div/usb-storage.ko && $INSMOD /modules/div/usb-storage.ko >/dev/null 2>&1
364 else
365 # For an unknown reason, unloading usbcore hangs smetimes
366 # rmmod usbcore >/dev/null 2>&1
367 true
368 fi
369 fi
370 echo -n "${CRE}"
371 fi
372 # End of USB check
373
374 # Check for Firewire, use modules on bootfloppy first
375 if test -z "$NOFIREWIRE"; then
376 echo -n "${CRE}Checking for Firewire..."
377 if test -f /modules/div/ieee1394.ko; then
378 echo -n "${CRE}Loading ieee1394..."
379 $INSMOD /modules/div/ieee1394.ko >/dev/null 2>&1
380 FOUNDFIREWIRE=""
381 for i in ohci1394.ko; do
382 echo -n "${CRE}Loading $i..."
383 test -f /modules/div/$i && $INSMOD /modules/div/$i >/dev/null 2>&1 && FOUNDFIREWIRE="yes"
384 done
385 if test -n "$FOUNDFIREWIRE"; then
386 echo -n "${CRE}Loading sbp2.ko..."
387 test -f /modules/scsi/sbp2.ko && $INSMOD /modules/scsi/sbp2.ko sbp2_serialize_io=1 >/dev/null 2>&1
388 else
389 # For an unknown reason, unloading ieee1394 hangs smetimes
390 # echo -n "${CRE}${BLUE}Unloading ieee1394...${NORMAL}"
391 # rmmod ieee1394 >/dev/null 2>&1
392 true
393 fi
394 fi
395 echo -n "${CRE}"
396 fi
397 # End of FIREWIRE check
398
399 # Unfortunately, hotpluggable devices tend to need some time in order to register
400 if test -n "$FOUNDUSB" -o -n "$FOUNDFIREWIRE"; then
401 log_begin_msg "Scanning for USB/Firewire devices."
402 if test -n "$FOUNDFIREWIRE"; then
403 # Wait for driver to register
404 sleep 2
405 # Kernel 2.6 does this automatically
406 #case "$(cat /proc/version 2>/dev/null)" in *version\ 2.6.*) ;; *) for host in 0 1 2 3 4 5 6 7; do for channel in 0 1; do for id in 0 1 2 3 4 5 6 7; do echo "scsi add-single-device $host $channel $id 0" >/proc/scsi/scsi 2>/dev/null; done; done; done ;; esac
407 fi
408 # sleep 6
409 echo "  $SUCCESS"
410 fi
411
412 # Check for misc modules in expert mode
413 if test -n "$INTERACTIVE"; then
414 another=""; answer=""
415 while test "$answer" != "n" -a "$answer" != "N"; do
416 echo -n "${CYAN}Do you want to load additional modules from$another floppy disk? [${WHITE}Y${CYAN}/n] ${NORMAL}"
417 another=" another"
418 read answer
419 case "$answer" in n*|N*) break; ;; esac
420 if mountmodules new; then
421 askmodules new $(cd /modules/scsi; echo *.ko)
422 test -n "$MODULES" && loadmodules new $MODULES
423 umountmodules current
424 fi
425 done
426 fi
427 # All interactively requested modules should be loaded now.
428
429 # Check for ide-scsi supported CD-Roms et al.
430 test -f /proc/scsi/scsi && FOUND_SCSI="yes"
431
432 # Disable kernel messages again
433 echo "0" > /proc/sys/kernel/printk
434
435 # We now enable DMA right here, for faster reading/writing from/to IDE devices
436 # in FROMHD or TORAM mode
437 case "$CMDLINE" in *\ nodma*) ;; *)
438 for d in $(cd /proc/ide 2>/dev/null && echo hd[a-z]); do
439 if test -d /proc/ide/$d; then
440 MODEL="$(cat /proc/ide/$d/model 2>/dev/null)"
441 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
442 log_begin_msg "Enabling DMA acceleration for: ${MAGENTA}$d      ${YELLOW}[${MODEL}]${NORMAL}"
443 echo "using_dma:1" >/proc/ide/$d/settings && echo ""
444 fi
445 done
446 ;;
447 esac
448
449 stage=2
450 rundebugshell
451 echo "before NFS"
452 for i in $cmdline; do case "$i" in nfsdir=*|NFSDIR=*) eval $i;; esac; done
453 [ -n "$nfsdir" ] && NFS="$nfsdir"
454 echo "nfsdir=$NFS"
455 # NFS
456 if [ -n "$NFS" ]; then
457   tmp_="$(getbootparam nfsdir)"
458   echo -n "checkbootparam nfsdir   "
459   checkbootparam "nfsdir" && echo "OK" || echo "FAILED"
460   echo "getbootparam nfsdir=\"$tmp_\""
461
462   # put the mylibs into /lib for discover and udhcpc
463   cdir
464
465   # starting hw-detection for network card
466   echo "Starting hw-detection"
467   kernel_version_=`uname -r`
468   modules_to_load=$(/static/discover --disable-bus all --enable-bus pci --type network --normalize-whitespace --data-path=linux/module/name --data-version=$kernel_version_ | grep -v '^ $' | uniq)
469   echo "trying to load the following network modules:  \"$modules_to_load\""
470   
471   # FIXME modprobe is buggy from busybox
472   modules_to_load=`echo $modules_to_load | xargs`
473   modLoad()
474   {
475     for mod in $@ ; do
476       tmp_="`modprobe -vn $mod`"
477       if [ $? -ne 0 ]; then
478         continue
479       fi
480       eval "$tmp_"
481     done
482   }
483   modLoad "$modules_to_load"
484
485   # loading additional modules
486   modLoad sunrpc lockd af_packet nfs
487
488   /static/udhcpc --foreground --quit --script=/static/udhcp-config.sh
489   #echo "press <enter> to start a system shell and configure your system"
490   #sh
491
492   # recreate the old dir structures
493   rdir
494   #rm -rf /myusr /mylib
495
496   log_begin_msg "${RED}Debug: NFS = ${NFS}${NORMAL}"
497   log_begin_msg -n "${CRE}${BLUE}Looking for GRML in: ${MAGENTA}$NFS${NORMAL}   "
498   if mount -t nfs "$NFS" -o "async,ro,nolock" /cdrom #>/dev/null 2>&1
499     then
500     if test -f /cdrom/$GRML_DIR/$GRML_NAME
501       then
502       log_begin_msg -n "${CRE} ${GREEN}Accessing grml CDROM at ${MAGENTA}$NFS${GREEN}...${NORMAL}"
503       FOUND_GRML="$NFS"
504       break
505     fi
506   fi
507 fi
508 echo "after NFS"
509
510
511 # Now that the right SCSI driver is (hopefully) loaded, try to find CD-ROM
512 if test -z $NFS ; then
513   DEVICES="/dev/hd?"
514   test -n "$FOUND_SCSI" -a -z "$NOCD" && DEVICES="/dev/scd? /dev/scd?? $DEVICES"
515   # New: Also try parallel port CD-Roms [for Mike].
516   DEVICES="$DEVICES /dev/pcd?"
517   # New: also check HD partitions for a GRML/GRML image
518   test -n "$FOUND_SCSI" -a -z "$NOSCSI" && DEVICES="$DEVICES /dev/sd?[1-9] /dev/sd?[1-9][0-9]"
519   DEVICES="$DEVICES /dev/hd?[1-9] /dev/hd?[1-9][0-9]"
520   case "$CMDLINE" in *fromhd=/dev/*) DEVICES="$fromhd"; ;; esac
521   for i in $DEVICES
522   do
523   log_begin_msg "${CRE} ${GREEN}*${NORMAL} Looking for CD-ROM in:    ${MAGENTA}$i${NORMAL}"
524   if mountit $i /cdrom "-o ro" >/dev/null 2>&1
525     then
526     echo "  $SUCCESS"
527     if test -f /cdrom/$GRML_DIR/$GRML_NAME
528       then
529       log_begin_msg "Accessing grml CD-ROM at: ${MAGENTA}$i${NORMAL}" ; echo "  $SUCCESS"
530       FOUND_GRML="$i"
531       break
532     fi
533     umount /cdrom
534   fi
535   done
536 fi
537
538 # Harddisk-installed script part version has been removed
539 # (GRML can be booted directly from HD now).
540
541 mount_grml()
542 {
543   if test -n "$FOUND_GRML" -a -f $1/$GRML_DIR/$GRML_NAME; then
544     # DEBUG
545     # echo "6" > /proc/sys/kernel/printk
546     # cloop:
547     #$INSMOD -f /modules/cloop.ko file=$1/$GRML_DIR/$GRML_NAME
548     #mountit /dev/cloop /GRML "-o ro" || FOUND_GRML=""
549     # squashfs:
550     #losetup /dev/loop0 $1/$GRML_DIR/$GRML_NAME
551     mount -t squashfs $1/$GRML_DIR/$GRML_NAME /GRML -o loop,ro || FOUND_GRML=""
552   fi
553
554 #    COMP=""
555 #    case $(dd if=$1/$KNOPPIX_DIR/$KNOPPIX_NAME bs=4 count=1 2>/dev/null) in
556 #      "#!/b") COMP=cloop
557 #              $INSMOD /modules/cloop.o file=$1/$KNOPPIX_DIR/$KNOPPIX_NAME
558 #              mountit /dev/cloop /KNOPPIX "-o ro" || FOUND_KNOPPIX=""
559 #              ;;
560 #      "hsqs") COMP=squashfs
561 #              mount -t squashfs $1/$KNOPPIX_DIR/$KNOPPIX_NAME /KNOPPIX -o loop,ro || FOUND_KNOPPIX=""
562 #              #losetup /dev/loop0 $1/$KNOPPIX_DIR/$KNOPPIX_NAME
563 #              #mount -t squashfs /dev/loop0 /KNOPPIX -o loop,ro || FOUND_KNOPPIX=""
564 #              ;;
565 #    esac
566 }
567
568 remount_grml()
569 {
570   if test -f $TARGET/$GRML_DIR/$GRML_NAME; then
571     umount /GRML # unmount it
572     # echo "$RMMOD cloop" | /static/sh # release CD - ash crashes with parts of libc in memory -- FF
573     umount $SOURCE  # unmount CD
574     [ -n "$SOURCE2" ] && umount $SOURCE2  # umount possible loop-device
575     mount_grml $TARGET
576   else
577     echo "${CRE} ${RED}Warning: Changing to $TARGET failed.${NORMAL}"
578     return 1
579   fi
580   
581   return 0
582 }
583
584 boot_from()
585 {
586   # preparations
587   /bin/mkdir $TARGET
588
589   SOURCE_DEV=$(echo $CMDLINE | /usr/bin/tr ' ' '\n' | /bin/sed -n '/bootfrom=/s/.*=//p' | /usr/bin/tail -1)
590   
591   LOOP_DEV=$(echo $SOURCE_DEV | /usr/bin/gawk -F/ '{ print $1 "/" $2 "/" $3 }')
592   ISO_PATH=$(echo $SOURCE_DEV | /bin/sed "s|$LOOP_DEV||g" )
593   case "$ISO_PATH" in /*.[iI][sS][oO]) ;; *) ISO_PATH="" ;; esac
594   LOOP_SOURCE=""
595   
596   # load filesystems
597   # /GRML/sbin/modprobe reiserfs
598   /GRML/sbin/modprobe reiser4
599   /GRML/sbin/modprobe ntfs    # BE CAREFUL! - Only mount it read only! - FF
600  
601   if [ -n "$ISO_PATH" ]
602   then
603      LOOP_SOURCE="$TARGET.loop"
604      LOOP_SOURCE2="$LOOP_SOURCE"
605      TARGET_DEV="$LOOP_SOURCE$ISO_PATH"
606      /bin/mkdir $LOOP_SOURCE
607      /GRML/sbin/modprobe loop
608
609      /bin/mount -o ro $LOOP_DEV $LOOP_SOURCE || LOOP_SOURCE=""
610      /bin/mount -n -o loop $LOOP_SOURCE2$ISO_PATH $TARGET
611   else
612      TARGET_DEV="$SOURCE_DEV"
613     /bin/mount -n -o ro $SOURCE_DEV $TARGET
614   fi
615   if [ $? -ne 0 ]
616   then
617      [ -n "$LOOP_SOURCE" ] && /bin/umount $LOOP_SOURCE
618      echo -n "${CRE} ${RED}Accessing grml CD-ROM failed. ${MAGENTA}$TARGET_DEV${RED} is not mountable.${NORMAL}"
619      sleep 2
620      return 1
621   fi
622   
623   if [ -f $TARGET/$GRML_DIR/$GRML_NAME ]
624   then
625     log_begin_msg "Accessing grml CD-ROM at ${MAGENTA}$TARGET_DEV${NORMAL}." ; echo $SUCCESS
626   else
627     echo -n "${CRE} ${RED}Accessing grml CD-ROM failed. Could not find $GRML_DIR/$GRML_NAME on ${MAGENTA}$TARGET_DEV${RED}.${NORMAL}"
628     [ -n "$LOOP_SOURCE" ] && /bin/umount $LOOP_SOURCE
629     umount $TARGET
630     sleep 2
631     return 1
632   fi
633   # remount the CD 
634   remount_grml
635 }
636
637 copy_to()
638 {
639   # preparations
640   /bin/mkdir $TARGET
641   COPY="$SOURCE/$GRML_DIR"
642
643   # look if we copy to hd or to ram
644   SIZE="$(/usr/bin/du -s $COPY | /usr/bin/gawk '{print int($1*1.1)}')"
645   test -n "$SIZE" || SIZE="800000"
646   
647   case "$1" in 
648     ram)
649       TARGET_DEV="/dev/shm"
650       TARGET_DEV_DESC="ramdisk"
651       FOUNDSPACE="$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)"
652       /bin/mount -n -t tmpfs -o size=${SIZE}k $TARGET_DEV $TARGET
653     ;;
654     hd)
655       TARGET_DEV=$(echo $CMDLINE | /usr/bin/tr ' ' '\n' | /bin/sed -n '/tohd=/s/.*=//p' | /usr/bin/tail -1)
656       TARGET_DEV_DESC="$TARGET_DEV"
657       # load filesystems
658       # /GRML/sbin/modprobe reiserfs
659       # /GRML/sbin/modprobe jbd
660       # /GRML/sbin/modprobe ext3
661       /GRML/sbin/modprobe reiser4
662       BUILTIN_FS="iso9660 ext3 ext2 reiserfs reiser4 vfat"
663       # we need to use mountit to prevent NTFS to be mounted!
664       if mountit $TARGET_DEV $TARGET "-o rw"
665       then
666         :
667       else
668         echo -n "${CRE} ${RED}Copying grml CD-ROM failed. ${MAGENTA}$TARGET_DEV_DESC${RED} is not mountable.${NORMAL}"
669         sleep 2
670         return 1
671       fi
672       # check for enough free space
673       USED_SPACE=0
674       [ -f $TARGET/$GRML_DIR/$GRML_NAME ] && USED_SPACE=$(/usr/bin/du -s $TARGET/$GRML_DIR/$GRML_NAME | /usr/bin/gawk '{ print $1 }')
675       FOUNDSPACE="$(/bin/df -k $TARGET | /usr/bin/tail -1 | /usr/bin/gawk '{ print $4+int('$USED_SPACE') }')"
676    ;;
677    *)
678      return 1
679    ;;
680   esac
681  
682   # sanity check
683
684   if [ $FOUNDSPACE -lt $SIZE ]
685   then
686     echo -n "${CRE} ${RED}Copying grml CD-ROM failed. Not enough free space on ${MAGENTA}${TARGET_DEV_DESC}${RED}. Found: ${MAGENTA}${FOUNDSPACE}k${RED} Need: ${MAGENTA}${SIZE}k${RED} ${NORMAL}"
687     sleep 2
688     umount $TARGET
689     return 1
690   fi
691  
692   # do the real copy
693   
694   echo "${CRE} ${GREEN}Copying grml CD-ROM to ${MAGENTA}$TARGET_DEV_DESC${GREEN}... Please be patient. ${NORMAL}"
695   if [ -z "$use_cp" -a -x /usr/bin/rsync ]
696   then 
697     # first cp the small files
698     /usr/bin/rsync -a --exclude="$GRML_DIR/$GRML_NAME" $COPY $TARGET # Copy grml to $TARGET
699     # then the big file with nice progress meter
700     [ -f $TARGET/$GRML_DIR/$GRML_NAME ] && /bin/rm -f $TARGET/$GRML_DIR/$GRML_NAME
701     /usr/bin/rsync -a --progress --include="$GRML_DIR/$GRML_NAME" --include="$GRML_DIR/" --exclude="*" $COPY $TARGET # Copy grml to $TARGET
702     #/usr/bin/rsync -avP $COPY $TARGET # Copy grml to $TARGET
703   else
704     /bin/cp -a -f $COPY $TARGET # Copy grml to $TARGET
705   fi
706   if [ $? -ne 0 ]
707   then
708     echo -n "${CRE} ${RED}Copying grml CD-ROM failed. ${MAGENTA}$TARGET_DEV_DESC${RED} possibly has not enough space left.${NORMAL}"
709     sleep 2
710     return 1
711   fi
712   # remount r/o
713   /bin/mount -n -o remount,ro $TARGET_DEV $TARGET
714   remount_grml
715 }
716
717 mount_grml /cdrom
718
719 COPYTO=""
720 BOOTFROM=""
721 DO_REMOUNT=""
722 REAL_TARGET=""
723 UNIONFS=""
724
725 case "$CMDLINE" in *toram*) DO_REMOUNT="yes"; COPYTO="ram"; ;; esac
726 case "$CMDLINE" in *tohd=*) DO_REMOUNT="yes"; COPYTO="hd"; ;; esac
727 case "$CMDLINE" in *bootfrom=*) DO_REMOUNT="yes"; BOOTFROM="yes" ;; esac
728  
729 # Remount later after copying/isoloading/driverloading?
730 # pre-test if everything succeeded
731 if  test -n "$DO_REMOUNT" -a -n "$FOUND_GRML"
732 then
733   # copy library cache 
734   cat /GRML/etc/ld.so.cache > /etc/ld.so.cache 
735   echo "" 
736
737   SOURCE="/cdrom"
738   TARGET="/cdrom2"
739  
740   # first test for possible hdboot/fromiso (which can be combined with toram / tohd)
741   if [ -n "$BOOTFROM" ]
742   then
743     boot_from
744     if [ $? -eq 0 ]
745     then
746       # set new source / target paths
747       REAL_TARGET="$TARGET"
748       SOURCE2="$LOOP_SOURCE"
749       SOURCE="/cdrom2"
750       TARGET="/cdrom3"
751     fi
752   fi
753   if [ -n "$COPYTO" ]
754   then
755     copy_to $COPYTO && REAL_TARGET="$TARGET"
756   fi
757 fi
758  
759 # Final test if everything succeeded.
760 if test -n "$FOUND_GRML"
761 then
762 # copy library cache
763 cat /GRML/etc/ld.so.cache > /etc/ld.so.cache
764
765 UNIONFS=""
766 $INSMOD /modules/unionfs.ko 2>/dev/null && UNIONFS="yes"
767
768 # Enable kernel messages
769 echo "6" > /proc/sys/kernel/printk
770
771 # Set paths
772 log_begin_msg "Setting paths"
773 PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:."
774 export PATH
775
776 # Debian weirdness
777 /GRML/bin/cp -a /GRML/etc/alternatives /etc/ 2>/dev/null
778
779 # Replace /sbin
780 /GRML/bin/rm -f /sbin
781 /GRML/bin/ln -sf /GRML/sbin /sbin
782
783 # From here, we should have all essential commands available.
784 hash -r
785
786 # Did we remount the source media ? 
787 if  test -n "$REAL_TARGET"; 
788 then
789    /bin/mount -n --move $REAL_TARGET /cdrom # move it back and go on to normal boot 
790 fi
791
792 # Clean up /etc/mtab (and - just in case - make a nice entry for looped ISO)
793 egrep " /GRML | /cdrom " /proc/mounts 2>/dev/null | sed 's|/dev/loop0 /cdrom \(.*\) 0 0|'$LOOP_SOURCE$ISO_PATH' /cdrom/ \1,loop=/dev/loop0 0 0|g' >> /etc/mtab
794
795 # Clean up /
796 rm -rf /modules /static
797 echo "                       $SUCCESS"
798
799 # New in Kernel 2.4.x: tempfs with variable ramdisk size.
800 # We check for available memory anyways and limit the ramdisks
801 # to a reasonable size.
802 FOUNDMEM="$(awk '/MemTotal/{print $2}' /proc/meminfo)"
803 TOTALMEM="$(awk 'BEGIN{m=0};/MemFree|Cached/{m+=$2};END{print m}' /proc/meminfo)"
804  
805 # Be verbose
806 log_begin_msg "Total memory found: $FOUNDMEM kB" ; echo "       $SUCCESS"
807
808 # Now we need to use a little intuition for finding a ramdisk size
809 # that keeps us from running out of space, but still doesn't crash the
810 # machine due to lack of Ram
811
812 # Minimum size of additional ram partitions
813 MINSIZE=20000
814 # At least this much memory minus 30% should remain when home and var are full.
815 MINLEFT=16000
816 # Maximum ramdisk size
817 MAXSIZE="$(expr $TOTALMEM - $MINLEFT)"
818 # Default ramdisk size for ramdisk
819 RAMSIZE="$(expr $TOTALMEM / 5)"
820 RAMSIZE="$(expr $RAMSIZE \* 4)"
821
822 # FIXME
823 RAMSIZE="$(expr $RAMSIZE - 17400)"
824
825 # Create additional dynamic ramdisk.
826 test -z "$RAMSIZE" -o "$RAMSIZE" -lt "$MINSIZE" && RAMSIZE="$MINSIZE"
827 mkdir -p /ramdisk
828 # tmpfs/varsize version, can use swap
829 log_begin_msg "Creating /ramdisk (dynamic size=${RAMSIZE}k) on shared memory"
830 # We need /bin/mount here for the -o size= option
831 /bin/mount -t tmpfs -o "size=${RAMSIZE}k" /ramdisk /ramdisk  && echo "$SUCCESS"
832 mkdir -p /ramdisk/tmp /ramdisk/home/grml && chmod 1777 /ramdisk/tmp && chown grml.grml /ramdisk/home/grml && ln -snf /ramdisk/home /home && mv /tmp /tmp.old && ln -s /ramdisk/tmp /tmp && rm -rf /tmp.old
833 #/bin/mount -t tmpfs -o "size=${RAMSIZE}k" /ramdisk /ramdisk && mkdir -p /ramdisk/home /ramdisk/var && ln -s /ramdisk/home /ramdisk/var /
834
835 stage=3
836 rundebugshell
837 # unionfs
838 log_begin_msg "Creating unionfs and symlinks on ramdisk"
839 mkdir -p /UNIONFS
840 if test -n "$UNIONFS" && /bin/mount -t unionfs -o noatime,dirs=/ramdisk=rw:/GRML=ro /UNIONFS /UNIONFS; then
841  # We now have unionfs, copy some data from the initial ramdisk first
842  cp -a /etc/fstab /etc/auto.mnt /etc/filesystems /etc/mtab /UNIONFS/etc/
843  for i in bin boot etc sbin var lib opt root usr; do # Move directories to unionfs
844   if test -d /$i; then
845    mv /$i /$i.old && \
846    /GRML/lib/ld-linux.so.2 --library-path /GRML/lib /GRML/bin/ln -snf /UNIONFS/$i /$i && \
847    rm -rf /$i.old
848   else
849    ln -snf /UNIONFS/$i /$i
850   fi
851  done
852  #echo "${GREEN}done${NORMAL}"
853  echo "                 $SUCCESS"
854  log_begin_msg "Merging read-only system with read-writeable /ramdisk."
855  for i in $(cd /UNIONFS; echo *); do # Create links for new stuff on /UNIONFS
856    test "$i" = "home" -o "$i" = "tmp" && continue
857    test -L "/$i" || test -d "/$i" || test -f "/$i" || ln -snf "/UNIONFS/$i" /$i
858  done && echo "   $SUCCESS" || echo "   $FAILED"
859 else
860  log_failure_msg "ERROR: CANNOT UNITE READ-ONLY MEDIA AND INITIAL RAMDISK!" ; echo "$FAILED"
861  NOUNIONFS="yes"
862  /GRML/sbin/halt -f -n
863 fi
864
865 chown grml.grml /home/grml
866 chmod 1777 /var/tmp
867 # Create empty utmp and wtmp
868 :> /var/run/utmp
869 :> /var/run/wtmp
870
871 ## Make SURE that these are files, not links!
872 rm -rf /etc/ftpusers /etc/passwd /etc/shadow /etc/group \
873        /etc/ppp /etc/isdn /etc/ssh /etc/ioctl.save \
874        /etc/inittab /etc/network /etc/sudoers \
875        /etc/init /etc/localtime /etc/dhcpc /etc/pnm2ppa.conf 2>/dev/null
876 cp -a /GRML/etc/ftpusers /GRML/etc/passwd /GRML/etc/shadow /GRML/etc/group \
877       /GRML/etc/ppp /GRML/etc/isdn /GRML/etc/ssh \
878       /GRML/etc/inittab /GRML/etc/network /GRML/etc/sudoers \
879       /GRML/sbin/init /GRML/etc/dhcpc /etc/ 2>/dev/null
880
881 # Extremely important, init crashes on shutdown if this is only a link
882 :> /etc/ioctl.save
883 :> /etc/pnm2ppa.conf
884 # Must exist for samba to work
885 [ -d /var/lib/samba ] && :> /var/lib/samba/unexpected.tdb
886 # Diet libc bug workaround
887 # cp -f /GRML/etc/localtime /etc/localtime
888 # echo "${BLUE}Done.${NORMAL}"
889
890 # Now tell kernel where the real modprobe lives
891 echo "/sbin/modprobe" > /proc/sys/kernel/modprobe
892
893 # Change root device from /dev/fd0 to /dev/ram0
894 echo "0x100" > /proc/sys/kernel/real-root-dev
895
896 # umount /sys (remount in grml-autoconfig)
897 umount /sys
898
899 stage=4
900 rundebugshell
901 # Give control to the init process.
902 log_begin_msg "Starting init process."
903 rm -f /linuxrc
904 exit 0
905
906 else
907 echo "${CRE}${RED}Can't find grml filesystem, sorry.${NORMAL}"
908 echo "${RED}Dropping you to the busybox shell.${NORMAL}"
909 echo "${RED}Press reset button to quit.${NORMAL}"
910 echo ""
911 #echo "Additional builtin commands avaliable:"
912 #echo " cat        mount     umount"
913 #echo " insmod     rmmod     lsmod"
914 #echo ""
915 PS1="grml# "
916 export PS1
917 echo "6" > /proc/sys/kernel/printk
918 # Allow signals
919 trap 1 2 3 15
920 exec /static/sh
921 fi