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