Seperated the network mounting related code from linuxrc.
[people/pravin/BKO.git] / pxeknife / dsl / linuxrc
1 #!/static/sh
2 #
3 # KNOPPIX General Startup Script
4 # (C) Klaus Knopper <knoppix@knopper.net>
5 #
6 #
7 # This script needs some of the builtin ash commands (if, test, ...)
8 # mount/umount, insmod/rmmod are also a builtin in ash-knoppix.
9 #
10
11 # hardcoded configurable options
12 # Default maximum size of dynamic ramdisk in kilobytes
13 RAMSIZE=1000000
14 # End of options
15
16 # Don't allow interrupt signals
17 trap "" 1 2 3 15
18
19 # "Safe" SCSI modules in the right order for autoprobe
20 # Warning: The sym53c8xx.o and g_NCR* cause a kernel Oops if no such adapter
21 # is present.
22 #
23 # NB: It looks like that ncr53c8xx.o is more stable than 53c7,8xx.o for
24 # a ncr53c810 controller (at least on my installation box it's more
25 # immune to SCSI timeouts)
26 # Removed 53c7,8xx -> crashes if no device attached.
27 # Removed AM53C974 -> crashes tmscsim if adapter found
28 # Added initio.o on request (untested)
29 SCSI_MODULES="aic7xxx.o aic7xxx_old.o BusLogic.o \
30 ncr53c8xx.o NCR53c406a.o \
31 initio.o mptscsih.o \
32 advansys.o aha1740.o aha1542.o aha152x.o \
33 atp870u.o dtc.o eata.o fdomain.o gdth.o \
34 megaraid.o pas16.o pci2220i.o pci2000.o psi240i.o \
35 qlogicfas.o qlogicfc.o qlogicisp.o \
36 seagate.o t128.o tmscsim.o u14-34f.o ultrastor.o wd7000.o \
37 a100u2w.o 3w-xxxx.o"
38
39 # Misc functions
40
41 INSMOD="insmod"
42 [ -x /modules/insmod ] && INSMOD="/modules/insmod"
43
44 RMMOD="rmmod"
45 [ -x /modules/rmmod ] && RMMOD="/modules/rmmod"
46
47 # Builin filesystems
48 BUILTIN_FS="iso9660 ext2 vfat"
49
50 mountit(){
51 # Usage: mountit src dst "options"
52 # Uses builtin mount of ash.knoppix
53 for fs in $BUILTIN_FS; do
54 test -b $1 && mount -t $fs $3 $1 $2 >/dev/null 2>&1 && return 0
55 done
56 return 1
57 }
58
59 FOUND_SCSI=""
60 FOUND_KNOPPIX=""
61 INTERACTIVE=""
62 SRV_IP=""
63 ISO_URL=""
64
65 # Clean input/output
66 exec >/dev/console </dev/console 2>&1
67
68 # ANSI COLORS
69 CRE="$(echo -e '\r\033[K')"
70 CLEAR="$(echo -e '\033c')"
71 NORMAL="$(echo -e '\033[0;39m')"
72 RED="$(echo -e '\033[1;31m')"
73 GREEN="$(echo -e '\033[1;32m')"
74 YELLOW="$(echo -e '\033[1;33m')"
75 BLUE="$(echo -e '\033[1;34m')"
76 MAGENTA="$(echo -e '\033[1;35m')"
77 CYAN="$(echo -e '\033[1;36m')"
78 WHITE="$(echo -e '\033[1;37m')"
79
80 echo "             _____   _____   _     " 
81 echo " Welcome To |  _  \ /  ___/ | |    " 
82 echo "            | | | | | |___  | |    " 
83 echo "            | | | | \___  \ | |    " 
84 echo "            | |_| |  ___| | | |___ "  
85 echo "            |_____/ /_____/ |_____|" 
86 echo ""
87 echo "        Built using Knoppix Technology."
88 echo ""
89 echo "DSL comes with ABSOLUTELY NO WARRANTY, to the extent"
90 echo "permitted by applicable law."
91 echo "Will be booted over HTTP with help of BKO"
92 echo "${NORMAL}"
93
94 # We only need the builtin commands and /static at this point
95 PATH=/static
96 export PATH
97
98 umask 022
99
100 # Mount /proc and /dev/pts
101 mount -t proc /proc /proc
102
103 # Disable kernel messages while probing modules in autodetect mode
104 echo "0" > /proc/sys/kernel/printk
105
106 mount -t devpts /dev/pts /dev/pts
107 # Kernel 2.6
108 mount -t sysfs /sys /sys >/dev/null 2>&1
109
110 # Read boot command line with builtin cat command (shell read function fails in Kernel 2.4.19-rc1)
111 CMDLINE="$(cat /proc/cmdline)"
112
113 # Check if we are in interactive startup mode
114 case "$CMDLINE" in *BOOT_IMAGE=expert\ *) INTERACTIVE="yes"; :>/interactive; ;; esac
115 case "$CMDLINE" in *modules-disk*) INTERACTIVE="yes"; ;; esac
116 # Does the user want to skip scsi detection?
117 NOSCSI=""
118 case "$CMDLINE" in *noscsi*|*nobootscsi*) NOSCSI="yes"; ;; esac
119 case "$CMDLINE" in *nousb*|*nobootusb*) NOUSB="yes"; ;; esac
120 case "$CMDLINE" in *nofirewire*|*nobootfirewire*) NOFIREWIRE="yes"; ;; esac
121 # Does the use want to delay USB ?
122 WAITUSB=""
123 case "$CMDLINE" in *waitusb*) WAITUSB="yes"; ;; esac
124 NOCD=""
125 case "$CMDLINE" in *fromhd*) NOCD="yes"; ;; esac
126 case "$CMDLINE" in *fromdvd*) FROMDVD="yes"; ;; esac
127 case "$CMDLINE" in *idecd*|*atapicd*) IDECD="yes"; ;; esac
128 case "$CMDLINE" in *noideraid*) NOIDERAID="yes"; ;; esac
129 case "$CMDLINE" in *sata*) SATA="yes"; ;; esac
130
131 KNOPPIX_DIR="KNOPPIX"
132 KNOPPIX_NAME="KNOPPIX"
133 case "$CMDLINE" in *knoppix_dir=*) KNOPPIX_DIR="$knoppix_dir"; ;; esac
134 case "$CMDLINE" in *knoppix_name=*) KNOPPIX_NAME="$knoppix_name"; ;; esac
135
136 case "$CMDLINE" in *srv_ip=*) SRV_IP="$srv_ip"; ;; esac
137
138 # Check for IDE-SCSI capable CD-Rom(s) first
139 test -n "$IDECD" || $INSMOD /modules/scsi/ide-scsi.o >/dev/null 2>&1 
140 # Use ide-cd for ATAPI-only CD-Rom(s)
141 $INSMOD /modules/scsi/ide-cd.o >/dev/null 2>&1
142
143 # Mount module disk
144 mountmodules(){
145 TYPE="$1"; shift
146 echo -n "${CRE}${CYAN}Please insert ${TYPE} modules disk and hit Return. ${NORMAL}"
147 read a
148 echo -n "${CRE}${BLUE}Mounting ${TYPE} modules disk... ${NORMAL}"
149 # We always mount over /modules/scsi (because it's there ;-)
150 if mountit /dev/fd0 /modules/scsi "-o ro"; then
151 echo "${GREEN}OK.${NORMAL}"
152 return 0
153 fi
154 echo "${RED}NOT FOUND.${NORMAL}"
155 return 1
156 }
157
158 # Unmount module disk
159 umountmodules(){
160 TYPE="$1"; shift
161 echo -n "${CRE}${BLUE}Unmounting ${TYPE} modules disk... ${NORMAL}"
162 umount /modules/scsi 2>/dev/null
163 echo "${GREEN}DONE.${NORMAL}"
164 }
165
166 # Ask user for modules
167 askmodules(){
168 TYPE="$1"; shift
169 echo "${BLUE}${TYPE} modules available:${WHITE}"
170 c=""; for m in "$@"; do
171 if test -f "/modules/scsi/$m"; then
172 test -z "$c"  && { echo -n "    $m"; c="1"; } || { echo "               $m"; c=""; }
173 fi
174 done
175 [ -n "$c" ] && echo ""
176 echo "${CYAN}Load ${TYPE} Modules?${NORMAL}"
177 echo "${CYAN}[Enter full filename(s) (space-separated), Return for autoprobe, ${WHITE}n${CYAN} for none] ${NORMAL}"
178 echo -n "${CYAN}insmod module(s)> ${NORMAL}"
179 read MODULES
180 case "$MODULES" in n|N) MODULES=""; ;; y|"")  MODULES="$*"; ;; esac
181 }
182
183 # Try to load the given modules (full path or current directory)
184 loadmodules(){
185 TYPE="$1"; shift
186 test -n "$INTERACTIVE" && echo "6" > /proc/sys/kernel/printk
187 for i in "$@"; do
188 echo -n "${CRE}${BLUE}Probing ${TYPE}... ${MAGENTA}$i${NORMAL}"
189 if test -f /modules/scsi/$i && $INSMOD -f /modules/scsi/$i >/dev/null 2>&1
190 then
191 case "$i" in *ataraid*) ;; *) echo "${CRE} ${GREEN}Found ${TYPE} device(s) handled by ${MAGENTA}$i${GREEN}.${NORMAL}" ;; esac
192 case "$TYPE" in scsi|SCSI) FOUND_SCSI="yes"; ;; esac
193 fi
194 done
195 test -n "$INTERACTIVE" && echo "0" > /proc/sys/kernel/printk
196 echo -n "${CRE}"
197 }
198
199 # Check for SCSI, use modules on bootfloppy first
200 if test -n "$INTERACTIVE"; then
201 # Let the user select interactively
202 askmodules SCSI $(cd /modules/scsi; echo *.o)
203 else
204 # these are the autoprobe-safe modules
205 MODULES="$SCSI_MODULES"
206 fi
207 test -z "$NOSCSI" && test -n "$MODULES" && loadmodules SCSI $MODULES
208 # End of SCSI check
209 # Check for IDE-Raid devices
210 test -z "$NOIDERAID" && MODULES="$(cd /modules/scsi; echo *raid.* 2>/dev/null)" && loadmodules IDE-SOFTRAID $MODULES
211 # End of IDE-Raid check
212
213 # Check for SATA
214 if test -n "$SATA"; then
215 echo "${BLUE}Checking for SATA...${NORMAL}"
216 if test -f /modules/scsi/libata.o; then
217 echo -n "${BLUE}Loading libata...${NORMAL}"
218 $INSMOD /modules/scsi/libata.o >/dev/null 2>&1
219 for i in ahci.o ata_piix.o sata_nv.o sata_nv.o sata_promise.o sata_promise.o \
220 sata_qstor.o sata_qstor.o sata_sil.o sata_sil.o sata_sis.o sata_sis.o sata_svw.o \
221 sata_svw.o sata_sx4.o sata_sx4.o sata_uli.o sata_uli.o sata_via.o sata_via.o \
222 sata_vsc.o sata_vsc.o; do
223 echo -n "${CRE}${BLUE}Loading $i...${NORMAL}"
224 test -f /modules/scsi/$i && $INSMOD /modules/scsi/$i >/dev/null 2>&1 && FOUNDSATA="yes"
225 done
226 if test -z "$FOUNDSATA"; then
227 rmmod libata >/dev/null 2>&1
228 true
229 fi
230 fi
231 echo -n "${CRE}"
232 echo "${BLUE}Done.${NORMAL}"
233 fi
234 # End of SATA check
235
236 # Check for USB, use modules on bootfloppy first
237 if test -z "$NOUSB"; then
238 echo -n "${CRE}${BLUE}Checking for for USB...${NORMAL}"
239 if test -f /modules/scsi/usbcore.o; then
240 $INSMOD /modules/scsi/usbcore.o >/dev/null 2>&1
241 FOUNDUSB=""
242 for i in ehci-hcd.o usb-uhci.o usb-ohci.o ; do
243 test -f /modules/scsi/$i && $INSMOD /modules/scsi/$i >/dev/null 2>&1 && FOUNDUSB="yes"
244 done
245 if test -n "$FOUNDUSB"; then
246 test -f /modules/scsi/usb-storage.o && $INSMOD /modules/scsi/usb-storage.o >/dev/null 2>&1
247 else
248 # For an unknown reason, unloading usbcore hangs smetimes
249 # rmmod usbcore >/dev/null 2>&1
250 true
251 fi
252 fi
253 echo -n "${CRE}"
254 fi
255 # End of USB check
256
257 # Check for Firewire, use modules on bootfloppy first
258 if test -z "$NOFIREWIRE"; then
259 echo -n "${CRE}${BLUE}Checking for Firewire...${NORMAL}"
260 if test -f /modules/scsi/ieee1394.o; then
261 echo -n "${CRE}${BLUE}Loading ieee1394...${NORMAL}"
262 $INSMOD /modules/scsi/ieee1394.o >/dev/null 2>&1
263 FOUNDFIREWIRE=""
264 for i in ohci1394.o; do
265 echo -n "${CRE}${BLUE}Loading $i...${NORMAL}"
266 test -f /modules/scsi/$i && $INSMOD /modules/scsi/$i >/dev/null 2>&1 && FOUNDFIREWIRE="yes"
267 done
268 if test -n "$FOUNDFIREWIRE"; then
269 echo -n "${CRE}${BLUE}Loading sbp2.o...${NORMAL}"
270 test -f /modules/scsi/sbp2.o && $INSMOD /modules/scsi/sbp2.o sbp2_serialize_io=1 >/dev/null 2>&1
271 else
272 # For an unknown reason, unloading ieee1394 hangs smetimes
273 # echo -n "${CRE}${BLUE}Unloading ieee1394...${NORMAL}"
274 # rmmod ieee1394 >/dev/null 2>&1
275 true
276 fi
277 fi
278 echo -n "${CRE}"
279 fi
280 # End of FIREWIRE check
281
282 # Unfortunately, hotpluggable devices tend to need some time in order to register
283 if test -n "$FOUNDUSB" -o -n "$FOUNDFIREWIRE"; then
284 echo -n "${CRE}${BLUE}Scanning for USB devices... ${NORMAL}"
285 if test -n "$FOUNDFIREWIRE"; then
286 # Wait for driver to register
287 sleep 2
288 # Kernel 2.6 does this automatically
289 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
290 fi
291 sleep 6
292 echo "${BLUE}Done.${NORMAL}"
293 fi
294
295 # Check for user request to wait for slow USB devices
296 if test -n "$WAITUSB"; then
297    echo -n "${CRE}${BLUE}Waiting for USB devices${NORMAL}..."
298    ash -c "sleep 6"
299    echo "${BLUE}Done.${NORMAL}"
300 fi
301
302 # Check for misc modules in expert mode
303 if test -n "$INTERACTIVE"; then
304 another=""; answer=""
305 while test "$answer" != "n" -a "$answer" != "N"; do
306 echo -n "${CYAN}Do you want to load additional modules from$another floppy disk? [${WHITE}Y${CYAN}/n] ${NORMAL}"
307 another=" another"
308 read answer
309 case "$answer" in n*|N*) break; ;; esac
310 if mountmodules new; then
311 askmodules new $(cd /modules/scsi; echo *.o)
312 test -n "$MODULES" && loadmodules new $MODULES
313 umountmodules current
314 fi
315 done
316 fi
317 # All interactively requested modules should be loaded now.
318
319
320 # Check for ide-scsi supported CD-Roms et al.
321 test -f /proc/scsi/scsi && FOUND_SCSI="yes"
322
323 # Disable kernel messages again
324 echo "0" > /proc/sys/kernel/printk
325
326 # We now enable DMA right here, for faster reading/writing from/to IDE devices
327 # in FROMHD or TORAM mode
328 case "$CMDLINE" in *\ dma*)
329 for d in $(cd /proc/ide 2>/dev/null && echo hd[a-z]); do
330 if test -d /proc/ide/$d; then
331 MODEL="$(cat /proc/ide/$d/model 2>/dev/null)"
332 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
333 echo "${BLUE}Enabling DMA acceleration for: ${MAGENTA}$d        ${YELLOW}[${MODEL}]${NORMAL}"
334 echo "using_dma:1" >/proc/ide/$d/settings
335 fi
336 done
337 ;;
338 esac
339
340 #mounting iso image over HTTP.
341 /mount_http_iso.sh $SRV_IP
342
343 # test if knoppix is there
344 if test -f /cdrom/$KNOPPIX_DIR/$KNOPPIX_NAME
345 then
346 echo -n "${CRE} ${GREEN}Accessing DSL image at ${MAGENTA}HTTPFS{GREEN}...${NORMAL}"
347 FOUND_KNOPPIX="HTTPFS"
348 fi
349
350
351 # Now that the right SCSI driver is (hopefully) loaded, try to find CDROM
352 DEVICES="/dev/hd?"
353 test -n "$FOUND_SCSI" -a -z "$NOCD" && DEVICES="/dev/scd? /dev/scd?? $DEVICES"
354 # New: Also try parallel port CD-Roms [for Mike].
355 DEVICES="$DEVICES /dev/pcd?"
356 # New: also check HD partitions for a KNOPPIX/KNOPPIX image
357 test -n "$FOUND_SCSI" -a -z "$NOSCSI" && DEVICES="$DEVICES /dev/sd?[1-9] /dev/sd?[1-9][0-9]"
358 DEVICES="$DEVICES /dev/hd?[1-9] /dev/hd?[1-9][0-9]"
359 case "$CMDLINE" in *fromhd=/dev/*) DEVICES="$fromhd"; ;; esac
360 for i in $DEVICES
361 do
362 echo -n "${CRE}${BLUE}Looking for CDROM in: ${MAGENTA}$i${NORMAL}   "
363 if mountit $i /cdrom "-o ro" >/dev/null 2>&1
364 then
365 if test -f /cdrom/$KNOPPIX_DIR/$KNOPPIX_NAME
366 then
367 echo -n "${CRE} ${GREEN}Accessing DSL image at ${MAGENTA}$i${GREEN}...${NORMAL}"
368 FOUND_KNOPPIX="$i"
369 break
370 fi
371 umount /cdrom
372 fi
373 done
374
375 # Harddisk-installed script part version has been removed
376 # (KNOPPIX can be booted directly from HD now).
377
378 mount_knoppix()
379 {
380   if test -n "$FOUND_KNOPPIX" -a -f $1/$KNOPPIX_DIR/$KNOPPIX_NAME; then
381     # DEBUG
382     # echo "6" > /proc/sys/kernel/printk
383     $INSMOD -f /modules/cloop.o file=$1/$KNOPPIX_DIR/$KNOPPIX_NAME
384     mountit /dev/cloop /KNOPPIX "-o ro" || FOUND_KNOPPIX=""
385   fi
386 }
387
388 remount_knoppix()
389 {
390   if test -f $TARGET/$KNOPPIX_DIR/$KNOPPIX_NAME; then
391     umount /KNOPPIX # unmount it
392     echo "$RMMOD cloop" | /static/ash # release CD - ash crashes with parts of libc in memory -- FF
393     umount $SOURCE  # unmount CD
394     [ -n "$SOURCE2" ] && umount $SOURCE2  # umount possible loop-device
395     mount_knoppix $TARGET
396   else
397     echo "${CRE} ${RED}Warning: Changing to $TARGET failed.${NORMAL}"
398     return 1
399   fi
400   
401   return 0
402 }
403
404 boot_from()
405 {
406   # preparations
407   /bin/mkdir $TARGET
408
409   SOURCE_DEV=$(echo $CMDLINE | /usr/bin/tr ' ' '\n' | /bin/sed -n '/bootfrom=/s/.*=//p' | /usr/bin/tail -1)
410   
411   LOOP_DEV=$(echo $SOURCE_DEV | /usr/bin/gawk -F/ '{ print $1 "/" $2 "/" $3 }')
412   ISO_PATH=$(echo $SOURCE_DEV | /bin/sed "s|$LOOP_DEV||g" )
413   case "$ISO_PATH" in /*.[iI][sS][oO]) ;; *) ISO_PATH="" ;; esac
414   LOOP_SOURCE=""
415   
416   # load filesystems
417   /KNOPPIX/sbin/modprobe reiserfs
418   /KNOPPIX/sbin/modprobe ntfs    # BE CAREFUL! - Only mount it read only! - FF
419  
420   if [ -n "$ISO_PATH" ]
421   then
422      LOOP_SOURCE="$TARGET.loop"
423      LOOP_SOURCE2="$LOOP_SOURCE"
424      TARGET_DEV="$LOOP_SOURCE$ISO_PATH"
425      /bin/mkdir $LOOP_SOURCE
426      /KNOPPIX/sbin/modprobe loop
427
428      /bin/mount -o ro $LOOP_DEV $LOOP_SOURCE || LOOP_SOURCE=""
429      /bin/mount -n -o loop $LOOP_SOURCE2$ISO_PATH $TARGET
430   else
431      TARGET_DEV="$SOURCE_DEV"
432     /bin/mount -n -o ro $SOURCE_DEV $TARGET
433   fi
434   if [ $? -ne 0 ]
435   then
436      [ -n "$LOOP_SOURCE" ] && /bin/umount $LOOP_SOURCE
437      echo -n "${CRE} ${RED}Accessing DSL image failed. ${MAGENTA}$TARGET_DEV${RED} is not mountable.${NORMAL}"
438      sleep 2
439      return 1
440   fi
441   
442   if [ -f $TARGET/$KNOPPIX_DIR/$KNOPPIX_NAME ]
443   then
444     echo -n "${CRE} ${GREEN}Accessing DSL image at ${MAGENTA}$TARGET_DEV${GREEN}...${NORMAL}"
445   else
446     echo -n "${CRE} ${RED}Accessing DSL image failed. Could not find $KNOPPIX_DIR/$KNOPPIX_NAME on ${MAGENTA}$TARGET_DEV${RED}.${NORMAL}"
447     [ -n "$LOOP_SOURCE" ] && /bin/umount $LOOP_SOURCE
448     umount $TARGET
449     sleep 2
450     return 1
451   fi
452   # remount the CD 
453   remount_knoppix
454 }
455
456 copy_to()
457 {
458   # preparations
459   /bin/mkdir $TARGET
460   COPY="$SOURCE/$KNOPPIX_DIR"
461
462   # look if we copy to hd or to ram
463   SIZE="$(/usr/bin/du -s $COPY | /usr/bin/gawk '{print int($1*1.01)}')"
464   test -n "$SIZE" || SIZE="800000"
465   
466   case "$1" in 
467     ram)
468       TARGET_DEV="/dev/shm"
469       TARGET_DEV_DESC="ramdisk"
470       FOUNDSPACE="$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)"
471       /bin/mount -n -t tmpfs -o size=${SIZE}k $TARGET_DEV $TARGET
472     ;;
473     hd)
474       TARGET_DEV=$(echo $CMDLINE | /usr/bin/tr ' ' '\n' | /bin/sed -n '/tohd=/s/.*=//p' | /usr/bin/tail -1)
475       TARGET_DEV_DESC="$TARGET_DEV"
476       # load filesystems
477       /KNOPPIX/sbin/modprobe reiserfs
478       /KNOPPIX/sbin/modprobe jbd
479       /KNOPPIX/sbin/modprobe ext3
480       BUILTIN_FS="iso9660 ext3 ext2 reiserfs vfat"
481       # we need to use mountit to prevent NTFS to be mounted!
482       if mountit $TARGET_DEV $TARGET "-o rw"
483       then
484         :
485       else
486         echo -n "${CRE} ${RED}Copying DSL image failed. ${MAGENTA}$TARGET_DEV_DESC${RED} is not mountable.${NORMAL}"
487         sleep 2
488         return 1
489       fi
490    ;;
491    *)
492      return 1
493    ;;
494   esac
495  
496   # do the real copy
497   
498   echo "${CRE} ${GREEN}Copying DSL image to ${MAGENTA}$TARGET_DEV_DESC${GREEN}... Please be patient. ${NORMAL}"
499   /bin/cp -a -f $COPY $TARGET # Copy Knoppix to $TARGET
500   if [ $? -ne 0 ]
501   then
502     echo -n "${CRE} ${RED}Copying DSL image failed. ${MAGENTA}$TARGET_DEV_DESC${RED} possibly has not enough space left.${NORMAL}"
503     sleep 2
504     return 1
505   fi
506   # remount r/o
507   test -f $TARGET/$KNOPPIX_DIR/knoppix && /bin/mv $TARGET/$KNOPPIX_DIR/knoppix $TARGET/$KNOPPIX_DIR/$KNOPPIX_NAME
508   /bin/mount -n -o remount,ro $TARGET_DEV $TARGET
509   remount_knoppix
510 }
511
512 mount_knoppix /cdrom
513
514 COPYTO=""
515 BOOTFROM=""
516 DO_REMOUNT=""
517 REAL_TARGET=""
518
519 case "$CMDLINE" in *toram*) DO_REMOUNT="yes"; COPYTO="ram"; ;; esac
520 case "$CMDLINE" in *tohd=*) DO_REMOUNT="yes"; COPYTO="hd"; ;; esac
521 case "$CMDLINE" in *bootfrom=*) DO_REMOUNT="yes"; BOOTFROM="yes" ;; esac
522  
523 # Remount later after copying/isoloading/driverloading?
524 # pre-test if everything succeeded
525 if  test -n "$DO_REMOUNT" -a -n "$FOUND_KNOPPIX"
526 then
527   # copy library cache 
528   cat /KNOPPIX/etc/ld.so.cache > /etc/ld.so.cache 
529   echo "" 
530
531   SOURCE="/cdrom"
532   TARGET="/cdrom2"
533  
534   # first test for possible hdboot/fromiso (which can be combined with toram / tohd)
535   if [ -n "$BOOTFROM" ]
536   then
537     boot_from
538     if [ $? -eq 0 ]
539     then
540       # set new source / target paths
541       REAL_TARGET="$TARGET"
542       SOURCE2="$LOOP_SOURCE"
543       SOURCE="/cdrom2"
544       TARGET="/cdrom3"
545     fi
546   fi
547   if [ -n "$COPYTO" ]
548   then
549     copy_to $COPYTO && REAL_TARGET="$TARGET"
550   fi
551 fi
552  
553 # Final test if everything succeeded.
554 if test -n "$FOUND_KNOPPIX"
555 then
556 # copy library cache
557 cat /KNOPPIX/etc/ld.so.cache > /etc/ld.so.cache
558 echo ""
559
560 # Enable kernel messages
561 echo "6" > /proc/sys/kernel/printk
562
563 # Set paths
564 echo -n "${CRE}${BLUE}Setting paths...${NORMAL}"
565 PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:."
566 export PATH
567
568 # Debian weirdness
569 /KNOPPIX/bin/cp -a /KNOPPIX/etc/alternatives /etc/ 2>/dev/null
570
571 # Replace /sbin
572 /KNOPPIX/bin/rm -f /sbin
573 /KNOPPIX/bin/ln -sf /KNOPPIX/sbin /sbin
574
575 # From here, we should have all essential commands available.
576 hash -r
577
578 # Did we remount the source media ? 
579 if  test -n "$REAL_TARGET"; 
580 then
581    /bin/mount -n --move $REAL_TARGET /cdrom # move it back and go on to normal boot 
582 fi
583
584 # Clean up /etc/mtab (and - just in case - make a nice entry for looped ISO)
585 egrep " /KNOPPIX | /cdrom " /proc/mounts | sed 's|/dev/loop0 /cdrom \(.*\) 0 0|'$LOOP_SOURCE$ISO_PATH' /cdrom/ \1,loop=/dev/loop0 0 0|g' >> /etc/mtab
586
587 # Clean up /
588 rm -rf /modules /static
589
590 # New in Kernel 2.4.x: tempfs with variable ramdisk size.
591 # We check for available memory anyways and limit the ramdisks
592 # to a reasonable size.
593 FOUNDMEM="$(awk '/MemTotal/{print $2}' /proc/meminfo)"
594 TOTALMEM="$(awk 'BEGIN{m=0};/MemFree|Cached/{m+=$2};END{print m}' /proc/meminfo)"
595  
596 # Be verbose
597 echo "${CRE}${BLUE}Total memory found: ${YELLOW}${FOUNDMEM}${BLUE} kB${NORMAL}"
598
599 # Now we need to use a little intuition for finding a ramdisk size
600 # that keeps us from running out of space, but still doesn't crash the
601 # machine due to lack of Ram
602
603 # Minimum size of additional ram partitions
604 MINSIZE=2000
605 # At least this much memory minus 30% should remain when home and var are full.
606 MINLEFT=16000
607 # Maximum ramdisk size
608 MAXSIZE="$(expr $TOTALMEM - $MINLEFT)"
609 # Default ramdisk size for ramdisk
610 RAMSIZE="$(expr $TOTALMEM / 5)"
611
612 # Check for sufficient memory to mount extra ramdisk for /home + /var
613 test -z "$RAMSIZE" && RAMSIZE=1000000
614 mkdir -p /ramdisk
615 if test -n "$TOTALMEM" -a "$TOTALMEM" -gt "$MINLEFT"; then
616 # tmpfs/varsize version, can use swap
617   RAMSIZE=$(expr $RAMSIZE \* 4)
618   echo -n "${CRE}${BLUE}Creating ${YELLOW}/ramdisk${BLUE} (dynamic size=${RAMSIZE}k) on ${MAGENTA}shared memory${BLUE}...${NORMAL}"
619 # We need /bin/mount here for the -o size= option
620   if /bin/mount -t tmpfs -o "size=${RAMSIZE}k" /ramdisk /ramdisk; then
621     echo "${BLUE}Done.${NORMAL}"
622   else
623     echo "${RED}Failed.${NORMAL}"
624   fi
625 fi
626 mkdir -p /ramdisk/home /ramdisk/var && ln -s /ramdisk/home /ramdisk/var /
627
628 echo -n "${CRE}${BLUE}Creating directories and symlinks on ramdisk...${NORMAL}"
629 # Create common WRITABLE (empty) dirs
630 mkdir -p /var/run /var/local  \
631          /var/tmp /var/lib \
632          /var/lib/samba \
633          /mnt/cdrom /mnt/floppy /mnt/hd /mnt/test \
634          /root /etc/sysconfig /etc/X11 /etc/dhcpc
635 # Create empty utmp and wtmp
636 :> /var/run/utmp
637 :> /var/run/wtmp
638 # resolv.conf must be writable as well
639 cp -a /KNOPPIX/etc/dhcpc/resolv.conf /etc/dhcpc/ 2>/dev/null
640 # All files in here should be size zero after Knoppix.clean was run
641 cp -a /KNOPPIX/var/local /KNOPPIX/var/log \
642       /KNOPPIX/var/spool /var/ 2>/dev/null
643 cp -a /KNOPPIX/var/lib/nfs \
644       /KNOPPIX/var/lib/pcmcia \
645       /KNOPPIX/var/lib/dhcp* \
646       /var/lib/ 2>/dev/null
647 # Link device files (real device file copies should NOT require more space, but in fact, they do)
648 cp -aus /dev/capi /dev/ 2>/dev/null
649 ln -s /KNOPPIX/dev/* /dev/ 2>/dev/null
650 # Problematic directories in /var/lib (lots and lots of inodes)
651 ln -s  /KNOPPIX/var/lib/apt /var/lib/ 2>/dev/null
652 # Debian-apt
653 ln -s /KNOPPIX/var/cache/apt /var/cache/ 2>/dev/null
654 rm -f /etc/resolv.conf 2>/dev/null
655 ln -s /KNOPPIX/etc/skel /etc/dhcpc/resolv.conf \
656       /etc/ 2>/dev/null
657 # Index files can be HUGE, so better replace cache/man tree by links later
658 # cp -a /var/cache/ 2>/dev/null
659 # Create links from CDROM for UNWRITABLE (remaining) files
660 cp -aus /KNOPPIX/var/* /var/ 2>/dev/null
661 cp -aus /KNOPPIX/etc/* /etc/ 2>/dev/null
662 # Make SURE that these are files, not links!
663 rm -rf /etc/ftpusers /etc/passwd /etc/shadow /etc/shadow- /etc/group \
664        /etc/ppp /etc/isdn /etc/ssh /etc/ioctl.save \
665        /etc/inittab /etc/network /etc/sudoers \
666        /etc/init /etc/localtime /etc/dhcpc /etc/pnm2ppa.conf 2>/dev/null
667 cp -a /KNOPPIX/etc/ftpusers /KNOPPIX/etc/passwd /KNOPPIX/etc/shadow /KNOPPIX/etc/shadow- /KNOPPIX/etc/group \
668       /KNOPPIX/etc/ppp /KNOPPIX/etc/isdn /KNOPPIX/etc/ssh \
669       /KNOPPIX/etc/inittab /KNOPPIX/etc/network /KNOPPIX/etc/sudoers \
670       /KNOPPIX/sbin/init /KNOPPIX/etc/dhcpc /etc/ 2>/dev/null
671 # Extremely important, init crashes on shutdown if this is only a link
672 :> /etc/ioctl.save
673 :> /etc/pnm2ppa.conf
674 # Must exist for samba to work
675 [ -d /var/lib/samba ] && :> /var/lib/samba/unexpected.tdb
676 # Diet libc bug workaround
677 cp -f /KNOPPIX/etc/localtime /etc/localtime
678 echo "${BLUE}Done.${NORMAL}"
679
680 # Now tell kernel where the real modprobe lives
681 echo "/sbin/modprobe" > /proc/sys/kernel/modprobe
682
683 # Change root device from /dev/fd0 to /dev/ram0
684 echo "0x100" > /proc/sys/kernel/real-root-dev
685
686 # Give control to the init process.
687 echo "${CRE}${BLUE}Starting init process.${NORMAL}"
688 rm -f /linuxrc
689 exit 0
690
691 else
692 echo "${CRE}${RED}Can't find KNOPPIX filesystem, sorry.${NORMAL}"
693 echo "${RED}Dropping you to a (very limited) shell.${NORMAL}"
694 echo "${RED}Press reset button to quit.${NORMAL}"
695 echo ""
696 echo "Additional builtin commands avaliable:"
697 echo "  cat        mount     umount"
698 echo "  insmod     rmmod     lsmod"
699 echo ""
700 PS1="knoppix# "
701 export PS1
702 echo "6" > /proc/sys/kernel/printk
703 # Allow signals
704 trap 1 2 3 15
705 exec /static/ash
706 fi