Attempting to boot from iso instead of KNOPPIX
[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 echo "HTTP Boot: inserting network modules"
341 insmod /modules/crc32.o >/dev/null 2>&1  
342 insmod /modules/8390.o  >/dev/null 2>&1 
343 insmod /modules/mii.o  >/dev/null 2>&1 
344 insmod /modules/ne2k-pci.o  >/dev/null 2>&1 
345 insmod /modules/pcnet32.o  >/dev/null 2>&1 
346 insmod /modules/r8169.o  >/dev/null 2>&1 
347 insmod /modules/e100.o  >/dev/null 2>&1 
348 insmod /modules/e1000.o  >/dev/null 2>&1 
349 insmod /modules/sis900.o  >/dev/null 2>&1 
350 insmod /modules/via-rhine.o  >/dev/null 2>&1 
351 insmod /modules/8139too.o  >/dev/null 2>&1 
352 insmod /modules/af_packet.o >/dev/null 2>&1 
353 insmod /modules/loop.o >/dev/null 2>&1 
354
355 ifconfig lo 127.0.0.1 up
356 ifconfig eth0 up
357 udhcpc -s /static/udhcpc.sh  >/dev/null 2>&1 
358 insmod /modules/fuse.o >/dev/null 2>&1 
359
360 echo "The location of dsl.iso is $SRV_IP"
361 echo "mounting CDROM"
362 mkdir /iso
363 httpfs $SRV_IP /iso
364 dd if=/iso/dsl.iso of=/dsl.iso_copy count=1000
365 chmod 0777 /dsl.iso_copy
366 busybox mount -t iso9660 /dsl.iso_copy /cdrom -o loop
367
368
369 #echo "mounting KNOPPIX"
370 #mkdir /cdrom/KNOPPIX
371 #httpfs $SRV_IP /cdrom/KNOPPIX
372
373 # test if knoppix is there
374 if test -f /cdrom/$KNOPPIX_DIR/$KNOPPIX_NAME
375 then
376 echo -n "${CRE} ${GREEN}Accessing DSL image at ${MAGENTA}HTTPFS{GREEN}...${NORMAL}"
377 FOUND_KNOPPIX="HTTPFS"
378 fi
379
380
381 # Now that the right SCSI driver is (hopefully) loaded, try to find CDROM
382 DEVICES="/dev/hd?"
383 test -n "$FOUND_SCSI" -a -z "$NOCD" && DEVICES="/dev/scd? /dev/scd?? $DEVICES"
384 # New: Also try parallel port CD-Roms [for Mike].
385 DEVICES="$DEVICES /dev/pcd?"
386 # New: also check HD partitions for a KNOPPIX/KNOPPIX image
387 test -n "$FOUND_SCSI" -a -z "$NOSCSI" && DEVICES="$DEVICES /dev/sd?[1-9] /dev/sd?[1-9][0-9]"
388 DEVICES="$DEVICES /dev/hd?[1-9] /dev/hd?[1-9][0-9]"
389 case "$CMDLINE" in *fromhd=/dev/*) DEVICES="$fromhd"; ;; esac
390 for i in $DEVICES
391 do
392 echo -n "${CRE}${BLUE}Looking for CDROM in: ${MAGENTA}$i${NORMAL}   "
393 if mountit $i /cdrom "-o ro" >/dev/null 2>&1
394 then
395 if test -f /cdrom/$KNOPPIX_DIR/$KNOPPIX_NAME
396 then
397 echo -n "${CRE} ${GREEN}Accessing DSL image at ${MAGENTA}$i${GREEN}...${NORMAL}"
398 FOUND_KNOPPIX="$i"
399 break
400 fi
401 umount /cdrom
402 fi
403 done
404
405 # Harddisk-installed script part version has been removed
406 # (KNOPPIX can be booted directly from HD now).
407
408 mount_knoppix()
409 {
410   if test -n "$FOUND_KNOPPIX" -a -f $1/$KNOPPIX_DIR/$KNOPPIX_NAME; then
411     # DEBUG
412     # echo "6" > /proc/sys/kernel/printk
413     $INSMOD -f /modules/cloop.o file=$1/$KNOPPIX_DIR/$KNOPPIX_NAME
414     mountit /dev/cloop /KNOPPIX "-o ro" || FOUND_KNOPPIX=""
415   fi
416 }
417
418 remount_knoppix()
419 {
420   if test -f $TARGET/$KNOPPIX_DIR/$KNOPPIX_NAME; then
421     umount /KNOPPIX # unmount it
422     echo "$RMMOD cloop" | /static/ash # release CD - ash crashes with parts of libc in memory -- FF
423     umount $SOURCE  # unmount CD
424     [ -n "$SOURCE2" ] && umount $SOURCE2  # umount possible loop-device
425     mount_knoppix $TARGET
426   else
427     echo "${CRE} ${RED}Warning: Changing to $TARGET failed.${NORMAL}"
428     return 1
429   fi
430   
431   return 0
432 }
433
434 boot_from()
435 {
436   # preparations
437   /bin/mkdir $TARGET
438
439   SOURCE_DEV=$(echo $CMDLINE | /usr/bin/tr ' ' '\n' | /bin/sed -n '/bootfrom=/s/.*=//p' | /usr/bin/tail -1)
440   
441   LOOP_DEV=$(echo $SOURCE_DEV | /usr/bin/gawk -F/ '{ print $1 "/" $2 "/" $3 }')
442   ISO_PATH=$(echo $SOURCE_DEV | /bin/sed "s|$LOOP_DEV||g" )
443   case "$ISO_PATH" in /*.[iI][sS][oO]) ;; *) ISO_PATH="" ;; esac
444   LOOP_SOURCE=""
445   
446   # load filesystems
447   /KNOPPIX/sbin/modprobe reiserfs
448   /KNOPPIX/sbin/modprobe ntfs    # BE CAREFUL! - Only mount it read only! - FF
449  
450   if [ -n "$ISO_PATH" ]
451   then
452      LOOP_SOURCE="$TARGET.loop"
453      LOOP_SOURCE2="$LOOP_SOURCE"
454      TARGET_DEV="$LOOP_SOURCE$ISO_PATH"
455      /bin/mkdir $LOOP_SOURCE
456      /KNOPPIX/sbin/modprobe loop
457
458      /bin/mount -o ro $LOOP_DEV $LOOP_SOURCE || LOOP_SOURCE=""
459      /bin/mount -n -o loop $LOOP_SOURCE2$ISO_PATH $TARGET
460   else
461      TARGET_DEV="$SOURCE_DEV"
462     /bin/mount -n -o ro $SOURCE_DEV $TARGET
463   fi
464   if [ $? -ne 0 ]
465   then
466      [ -n "$LOOP_SOURCE" ] && /bin/umount $LOOP_SOURCE
467      echo -n "${CRE} ${RED}Accessing DSL image failed. ${MAGENTA}$TARGET_DEV${RED} is not mountable.${NORMAL}"
468      sleep 2
469      return 1
470   fi
471   
472   if [ -f $TARGET/$KNOPPIX_DIR/$KNOPPIX_NAME ]
473   then
474     echo -n "${CRE} ${GREEN}Accessing DSL image at ${MAGENTA}$TARGET_DEV${GREEN}...${NORMAL}"
475   else
476     echo -n "${CRE} ${RED}Accessing DSL image failed. Could not find $KNOPPIX_DIR/$KNOPPIX_NAME on ${MAGENTA}$TARGET_DEV${RED}.${NORMAL}"
477     [ -n "$LOOP_SOURCE" ] && /bin/umount $LOOP_SOURCE
478     umount $TARGET
479     sleep 2
480     return 1
481   fi
482   # remount the CD 
483   remount_knoppix
484 }
485
486 copy_to()
487 {
488   # preparations
489   /bin/mkdir $TARGET
490   COPY="$SOURCE/$KNOPPIX_DIR"
491
492   # look if we copy to hd or to ram
493   SIZE="$(/usr/bin/du -s $COPY | /usr/bin/gawk '{print int($1*1.01)}')"
494   test -n "$SIZE" || SIZE="800000"
495   
496   case "$1" in 
497     ram)
498       TARGET_DEV="/dev/shm"
499       TARGET_DEV_DESC="ramdisk"
500       FOUNDSPACE="$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)"
501       /bin/mount -n -t tmpfs -o size=${SIZE}k $TARGET_DEV $TARGET
502     ;;
503     hd)
504       TARGET_DEV=$(echo $CMDLINE | /usr/bin/tr ' ' '\n' | /bin/sed -n '/tohd=/s/.*=//p' | /usr/bin/tail -1)
505       TARGET_DEV_DESC="$TARGET_DEV"
506       # load filesystems
507       /KNOPPIX/sbin/modprobe reiserfs
508       /KNOPPIX/sbin/modprobe jbd
509       /KNOPPIX/sbin/modprobe ext3
510       BUILTIN_FS="iso9660 ext3 ext2 reiserfs vfat"
511       # we need to use mountit to prevent NTFS to be mounted!
512       if mountit $TARGET_DEV $TARGET "-o rw"
513       then
514         :
515       else
516         echo -n "${CRE} ${RED}Copying DSL image failed. ${MAGENTA}$TARGET_DEV_DESC${RED} is not mountable.${NORMAL}"
517         sleep 2
518         return 1
519       fi
520    ;;
521    *)
522      return 1
523    ;;
524   esac
525  
526   # do the real copy
527   
528   echo "${CRE} ${GREEN}Copying DSL image to ${MAGENTA}$TARGET_DEV_DESC${GREEN}... Please be patient. ${NORMAL}"
529   /bin/cp -a -f $COPY $TARGET # Copy Knoppix to $TARGET
530   if [ $? -ne 0 ]
531   then
532     echo -n "${CRE} ${RED}Copying DSL image failed. ${MAGENTA}$TARGET_DEV_DESC${RED} possibly has not enough space left.${NORMAL}"
533     sleep 2
534     return 1
535   fi
536   # remount r/o
537   test -f $TARGET/$KNOPPIX_DIR/knoppix && /bin/mv $TARGET/$KNOPPIX_DIR/knoppix $TARGET/$KNOPPIX_DIR/$KNOPPIX_NAME
538   /bin/mount -n -o remount,ro $TARGET_DEV $TARGET
539   remount_knoppix
540 }
541
542 mount_knoppix /cdrom
543
544 COPYTO=""
545 BOOTFROM=""
546 DO_REMOUNT=""
547 REAL_TARGET=""
548
549 case "$CMDLINE" in *toram*) DO_REMOUNT="yes"; COPYTO="ram"; ;; esac
550 case "$CMDLINE" in *tohd=*) DO_REMOUNT="yes"; COPYTO="hd"; ;; esac
551 case "$CMDLINE" in *bootfrom=*) DO_REMOUNT="yes"; BOOTFROM="yes" ;; esac
552  
553 # Remount later after copying/isoloading/driverloading?
554 # pre-test if everything succeeded
555 if  test -n "$DO_REMOUNT" -a -n "$FOUND_KNOPPIX"
556 then
557   # copy library cache 
558   cat /KNOPPIX/etc/ld.so.cache > /etc/ld.so.cache 
559   echo "" 
560
561   SOURCE="/cdrom"
562   TARGET="/cdrom2"
563  
564   # first test for possible hdboot/fromiso (which can be combined with toram / tohd)
565   if [ -n "$BOOTFROM" ]
566   then
567     boot_from
568     if [ $? -eq 0 ]
569     then
570       # set new source / target paths
571       REAL_TARGET="$TARGET"
572       SOURCE2="$LOOP_SOURCE"
573       SOURCE="/cdrom2"
574       TARGET="/cdrom3"
575     fi
576   fi
577   if [ -n "$COPYTO" ]
578   then
579     copy_to $COPYTO && REAL_TARGET="$TARGET"
580   fi
581 fi
582  
583 # Final test if everything succeeded.
584 if test -n "$FOUND_KNOPPIX"
585 then
586 # copy library cache
587 cat /KNOPPIX/etc/ld.so.cache > /etc/ld.so.cache
588 echo ""
589
590 # Enable kernel messages
591 echo "6" > /proc/sys/kernel/printk
592
593 # Set paths
594 echo -n "${CRE}${BLUE}Setting paths...${NORMAL}"
595 PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:."
596 export PATH
597
598 # Debian weirdness
599 /KNOPPIX/bin/cp -a /KNOPPIX/etc/alternatives /etc/ 2>/dev/null
600
601 # Replace /sbin
602 /KNOPPIX/bin/rm -f /sbin
603 /KNOPPIX/bin/ln -sf /KNOPPIX/sbin /sbin
604
605 # From here, we should have all essential commands available.
606 hash -r
607
608 # Did we remount the source media ? 
609 if  test -n "$REAL_TARGET"; 
610 then
611    /bin/mount -n --move $REAL_TARGET /cdrom # move it back and go on to normal boot 
612 fi
613
614 # Clean up /etc/mtab (and - just in case - make a nice entry for looped ISO)
615 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
616
617 # Clean up /
618 rm -rf /modules /static
619
620 # New in Kernel 2.4.x: tempfs with variable ramdisk size.
621 # We check for available memory anyways and limit the ramdisks
622 # to a reasonable size.
623 FOUNDMEM="$(awk '/MemTotal/{print $2}' /proc/meminfo)"
624 TOTALMEM="$(awk 'BEGIN{m=0};/MemFree|Cached/{m+=$2};END{print m}' /proc/meminfo)"
625  
626 # Be verbose
627 echo "${CRE}${BLUE}Total memory found: ${YELLOW}${FOUNDMEM}${BLUE} kB${NORMAL}"
628
629 # Now we need to use a little intuition for finding a ramdisk size
630 # that keeps us from running out of space, but still doesn't crash the
631 # machine due to lack of Ram
632
633 # Minimum size of additional ram partitions
634 MINSIZE=2000
635 # At least this much memory minus 30% should remain when home and var are full.
636 MINLEFT=16000
637 # Maximum ramdisk size
638 MAXSIZE="$(expr $TOTALMEM - $MINLEFT)"
639 # Default ramdisk size for ramdisk
640 RAMSIZE="$(expr $TOTALMEM / 5)"
641
642 # Check for sufficient memory to mount extra ramdisk for /home + /var
643 test -z "$RAMSIZE" && RAMSIZE=1000000
644 mkdir -p /ramdisk
645 if test -n "$TOTALMEM" -a "$TOTALMEM" -gt "$MINLEFT"; then
646 # tmpfs/varsize version, can use swap
647   RAMSIZE=$(expr $RAMSIZE \* 4)
648   echo -n "${CRE}${BLUE}Creating ${YELLOW}/ramdisk${BLUE} (dynamic size=${RAMSIZE}k) on ${MAGENTA}shared memory${BLUE}...${NORMAL}"
649 # We need /bin/mount here for the -o size= option
650   if /bin/mount -t tmpfs -o "size=${RAMSIZE}k" /ramdisk /ramdisk; then
651     echo "${BLUE}Done.${NORMAL}"
652   else
653     echo "${RED}Failed.${NORMAL}"
654   fi
655 fi
656 mkdir -p /ramdisk/home /ramdisk/var && ln -s /ramdisk/home /ramdisk/var /
657
658 echo -n "${CRE}${BLUE}Creating directories and symlinks on ramdisk...${NORMAL}"
659 # Create common WRITABLE (empty) dirs
660 mkdir -p /var/run /var/local  \
661          /var/tmp /var/lib \
662          /var/lib/samba \
663          /mnt/cdrom /mnt/floppy /mnt/hd /mnt/test \
664          /root /etc/sysconfig /etc/X11 /etc/dhcpc
665 # Create empty utmp and wtmp
666 :> /var/run/utmp
667 :> /var/run/wtmp
668 # resolv.conf must be writable as well
669 cp -a /KNOPPIX/etc/dhcpc/resolv.conf /etc/dhcpc/ 2>/dev/null
670 # All files in here should be size zero after Knoppix.clean was run
671 cp -a /KNOPPIX/var/local /KNOPPIX/var/log \
672       /KNOPPIX/var/spool /var/ 2>/dev/null
673 cp -a /KNOPPIX/var/lib/nfs \
674       /KNOPPIX/var/lib/pcmcia \
675       /KNOPPIX/var/lib/dhcp* \
676       /var/lib/ 2>/dev/null
677 # Link device files (real device file copies should NOT require more space, but in fact, they do)
678 cp -aus /dev/capi /dev/ 2>/dev/null
679 ln -s /KNOPPIX/dev/* /dev/ 2>/dev/null
680 # Problematic directories in /var/lib (lots and lots of inodes)
681 ln -s  /KNOPPIX/var/lib/apt /var/lib/ 2>/dev/null
682 # Debian-apt
683 ln -s /KNOPPIX/var/cache/apt /var/cache/ 2>/dev/null
684 rm -f /etc/resolv.conf 2>/dev/null
685 ln -s /KNOPPIX/etc/skel /etc/dhcpc/resolv.conf \
686       /etc/ 2>/dev/null
687 # Index files can be HUGE, so better replace cache/man tree by links later
688 # cp -a /var/cache/ 2>/dev/null
689 # Create links from CDROM for UNWRITABLE (remaining) files
690 cp -aus /KNOPPIX/var/* /var/ 2>/dev/null
691 cp -aus /KNOPPIX/etc/* /etc/ 2>/dev/null
692 # Make SURE that these are files, not links!
693 rm -rf /etc/ftpusers /etc/passwd /etc/shadow /etc/shadow- /etc/group \
694        /etc/ppp /etc/isdn /etc/ssh /etc/ioctl.save \
695        /etc/inittab /etc/network /etc/sudoers \
696        /etc/init /etc/localtime /etc/dhcpc /etc/pnm2ppa.conf 2>/dev/null
697 cp -a /KNOPPIX/etc/ftpusers /KNOPPIX/etc/passwd /KNOPPIX/etc/shadow /KNOPPIX/etc/shadow- /KNOPPIX/etc/group \
698       /KNOPPIX/etc/ppp /KNOPPIX/etc/isdn /KNOPPIX/etc/ssh \
699       /KNOPPIX/etc/inittab /KNOPPIX/etc/network /KNOPPIX/etc/sudoers \
700       /KNOPPIX/sbin/init /KNOPPIX/etc/dhcpc /etc/ 2>/dev/null
701 # Extremely important, init crashes on shutdown if this is only a link
702 :> /etc/ioctl.save
703 :> /etc/pnm2ppa.conf
704 # Must exist for samba to work
705 [ -d /var/lib/samba ] && :> /var/lib/samba/unexpected.tdb
706 # Diet libc bug workaround
707 cp -f /KNOPPIX/etc/localtime /etc/localtime
708 echo "${BLUE}Done.${NORMAL}"
709
710 # Now tell kernel where the real modprobe lives
711 echo "/sbin/modprobe" > /proc/sys/kernel/modprobe
712
713 # Change root device from /dev/fd0 to /dev/ram0
714 echo "0x100" > /proc/sys/kernel/real-root-dev
715
716 # Give control to the init process.
717 echo "${CRE}${BLUE}Starting init process.${NORMAL}"
718 rm -f /linuxrc
719 exit 0
720
721 else
722 echo "${CRE}${RED}Can't find KNOPPIX filesystem, sorry.${NORMAL}"
723 echo "${RED}Dropping you to a (very limited) shell.${NORMAL}"
724 echo "${RED}Press reset button to quit.${NORMAL}"
725 echo ""
726 echo "Additional builtin commands avaliable:"
727 echo "  cat        mount     umount"
728 echo "  insmod     rmmod     lsmod"
729 echo ""
730 PS1="knoppix# "
731 export PS1
732 echo "6" > /proc/sys/kernel/printk
733 # Allow signals
734 trap 1 2 3 15
735 exec /static/ash
736 fi