--- ../miniroot_cd/linuxrc	2006-03-08 10:47:01.000000000 +0100
+++ linuxrc	2006-10-18 16:48:55.000000000 +0200
@@ -43,10 +43,12 @@
 # Misc functions
 
 INSMOD="insmod"
-[ -x /modules/insmod ] && INSMOD="/modules/insmod"
+#[ -x /modules/insmod ] && INSMOD="/modules/insmod"
+[ -x /static/insmod ] && INSMOD="/static/insmod"
 
 RMMOD="rmmod"
-[ -x /modules/rmmod ] && RMMOD="/modules/rmmod"
+#[ -x /modules/rmmod ] && RMMOD="/modules/rmmod"
+[ -x /static/rmmod ] && RMMOD="/static/rmmod"
 
 # Dynamic program loader
 # /KNOPPIX is already mounted when this is used.
@@ -65,6 +67,7 @@
 }
 
 FOUND_SCSI=""
+MOUNTED=""
 FOUND_KNOPPIX=""
 INTERACTIVE=""
 
@@ -102,7 +105,7 @@
 # echo -n "[H[J"
 echo ""
 # Be verbose
-echo "${WHITE}Welcome to the ${CYAN}K${MAGENTA}N${YELLOW}O${WHITE}P${RED}P${GREEN}I${BLUE}X${WHITE} live Linux-on-DVD!${NORMAL}"
+echo "${WHITE}Welcome to the ${CYAN}K${MAGENTA}N${YELLOW}O${WHITE}P${RED}P${GREEN}I${BLUE}X${WHITE} live Linux-on-${MEDIUM}!${NORMAL}"
 echo ""
 echo ""
 
@@ -122,7 +125,13 @@
 mount -t sysfs /sys /sys >/dev/null 2>&1
 
 # Read boot command line with builtin cat command (shell read function fails in Kernel 2.4.19-rc1)
-CMDLINE="$(cat /proc/cmdline)"
+CMDLINE=" $(cat /proc/cmdline) "
+
+# bootsplash progress bar
+splash() {
+  [ -f /proc/splash ] && echo "show $1" > /proc/splash 2>/dev/null
+}
+splash 1000
 
 # Check if we are in interactive startup mode
 case "$CMDLINE" in *BOOT_IMAGE=expert\ *) INTERACTIVE="yes"; :>/interactive; ;; esac
@@ -138,14 +147,26 @@
 case "$CMDLINE" in *fromdvd*) FROMDVD="yes"; ;; esac
 case "$CMDLINE" in *idecd*|*atapicd*) IDECD="yes"; ;; esac
 case "$CMDLINE" in *noideraid*) NOIDERAID="yes"; ;; esac
-USB2="ehci-hcd.ko"
+USB2="ehci-hcd" # removed .ko, fix from http://www.knoppix.net/wiki/Bugs/4.0.2CD
 case "$CMDLINE" in *nousb2*) USB2=""; ;; esac
+NOCLOOP=""
+case "$CMDLINE" in *nocloop*) NOCLOOP="yes"; ;; esac
+NFSDIR="$nfsdir"
+NFS="$NFSDIR"  # whether to boot with nfs
+case "$CMDLINE" in *\ nfs\ *|*\ NFS\ *) NFS="yes"; ;; esac
+# Whether to not use accelerated knoppix fixes for boot scripts/programs
+case "$CMDLINE" in *\ noac\ *) [ -d /accel ] && /static/rm -rf /accel ;; esac
 
 KNOPPIX_DIR="KNOPPIX"
 KNOPPIX_NAME="KNOPPIX"
 case "$CMDLINE" in *knoppix_dir=*) KNOPPIX_DIR="$knoppix_dir"; ;; esac
 case "$CMDLINE" in *knoppix_name=*) KNOPPIX_NAME="$knoppix_name"; ;; esac
 
+NET="" # whether we need networking to boot
+if [ -n "$NFS" -o -n "$nbdhost" ]; then
+  NET="yes"
+fi
+
 # WARNING: In Kernel 2.4.27, CD-Roms cease to work if both, ide-scsi and ide-cd, are loaded. :-(
 # NOTE: We don't need scsi-emulation anymore in Kernel 2.6.10 and up
 #if test -n "$IDECD"; then
@@ -156,16 +177,45 @@
 #$INSMOD /modules/scsi/ide-scsi.ko >/dev/null 2>&1 
 #fi
 
+dropshell(){
+/busybox printf "\n"
+echo "$@"
+#echo "${CRE}${RED}Can't find KNOPPIX filesystem, sorry.${NORMAL}"
+echo "${RED}Dropping you to a (very limited) shell.${NORMAL}"
+echo "${RED}Press reset button to quit.${NORMAL}"
+echo ""
+echo "Additional builtin commands avaliable:"
+help
+echo ""
+PS1="knoppix# "
+export PS1
+echo "6" > /proc/sys/kernel/printk
+# Allow signals
+trap 1 2 3 15
+echo "Modules loaded:" ; cat /proc/modules
+exec /busybox ash || exec /static/ash
+}
+
+splash 2000
+
 # Run a shell if in debug mode
 stage=1
 rundebugshell(){
 if [ -n "$DEBUG" ]; then
 echo "${CRE}${BLUE}Starting intermediate Shell stage $stage as requested by \"debug\" option.${NORMAL}"
 echo "${CRE}${BLUE}Type \"exit\" to continue with normal bootup.${NORMAL}"
-[ -x /static/ash ] && /static/ash || /bin/bash
+/bin/bash || /busybox ash || /static/ash
 fi
 }
 
+loadfsmodules(){
+#FIXME: remove unused modules after we're done
+for i in $(cd /modules/extra_fs; echo *.*o); do
+  $INSMOD /modules/extra_fs/$i >/dev/null 2>&1 
+done
+  BUILTIN_FS="$(cat /modules/extra_fs/fs_list)"  # for mountit
+}
+
 # Mount module disk
 mountmodules(){
 TYPE="$1"; shift
@@ -222,6 +272,7 @@
 echo -n "${CRE}"
 }
 
+if [ -z "$NET" ]; then
 # Check for SCSI, use modules on bootfloppy first
 # Trying to do kind of /proc/pci hardware detection
 PROCPCI="`cat /proc/pci 2>/dev/null`"
@@ -248,6 +299,8 @@
 case "$PROCPCI" in *[Uu][Ll][Tt][Rr][Aa][Ss][Tt][Oo][Rr]*) SCSI_PROBE="$SCSI_PROBE ultrastor.ko" ;; esac
 case "$PROCPCI" in *3[Ww][Aa][Rr][Ee]*) SCSI_PROBE="$SCSI_PROBE 3w-xxxx.ko" ;; esac
 
+splash 3000
+
 if test -n "$INTERACTIVE"; then
 # Let the user select interactively
 askmodules SCSI $(cd /modules/scsi; echo *.ko)
@@ -258,12 +311,16 @@
 test -z "$NOSCSI" && test -n "$MODULES" && loadmodules SCSI $MODULES
 # End of SCSI check
 
+splash 4000
+
 # Check for IDE-Raid devices
 if test -z "$NOIDERAID"; then
 ( 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 )
 fi
 # End of IDE-Raid check
 
+splash 5000
+
 # Check for USB, use modules on bootfloppy first
 if test -z "$NOUSB"; then
 echo -n "${CRE}${BLUE}Checking for for USB...${NORMAL}"
@@ -275,6 +332,7 @@
 test -f /modules/scsi/$i.ko && $INSMOD /modules/scsi/$i.ko >/dev/null 2>&1 && FOUNDUSB="yes"
 done
 if test -n "$FOUNDUSB"; then
+test -f /modules/scsi/sg.o && $INSMOD /modules/scsi/sg.o >/dev/null 2>&1
 test -f /modules/scsi/ub.ko && $INSMOD /modules/scsi/ub.ko >/dev/null 2>&1
 test -f /modules/scsi/usb-storage.ko && $INSMOD /modules/scsi/usb-storage.ko >/dev/null 2>&1
 else
@@ -287,6 +345,8 @@
 fi
 # End of USB check
 
+splash 6000
+
 # Check for Firewire, use modules on bootfloppy first
 if test -z "$NOFIREWIRE"; then
 echo -n "${CRE}${BLUE}Checking for Firewire...${NORMAL}"
@@ -312,18 +372,28 @@
 fi
 # End of FIREWIRE check
 
+splash 7000
+
 # Unfortunately, hotpluggable devices tend to need some time in order to register
 if test -n "$FOUNDUSB" -o -n "$FOUNDFIREWIRE"; then
 echo -n "${CRE}${BLUE}Scanning for USB/Firewire devices... ${NORMAL}"
 if test -n "$FOUNDFIREWIRE"; then
 # Wait for driver to register
-sleep 2
+# accelerated-knoppix : fixme
+#sleep 2
+case "$CMDLINE" in *usbboot*|*USBBOOT*|*fwboot*|*FWBOOT*) sleep 2; ;; esac
 # Kernel 2.6 does this automatically
 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
 fi
-sleep 6
+# accelerated-knoppix : fixme
+#sleep 6
+case "$CMDLINE" in *usbboot*|*USBBOOT*|*fwboot*|*FWBOOT*) sleep 6; ;; esac
+
 echo "${BLUE}Done.${NORMAL}"
 fi
+fi # $NET
+
+splash 8000
 
 # Check for misc modules in expert mode
 if test -n "$INTERACTIVE"; then
@@ -342,6 +412,8 @@
 fi
 # All interactively requested modules should be loaded now.
 
+splash 9000
+
 # Check for ide-scsi supported CD-Roms et al.
 test -f /proc/scsi/scsi && FOUND_SCSI="yes"
 
@@ -362,9 +434,200 @@
 ;;
 esac
 
+# net stuff
+if [ -n "$NET" ]; then
+
+# Disable kernel messages again
+echo "0" > /proc/sys/kernel/printk
+
+FOUND_NETWORK=""
+echo "Loading network device module(s)"
+for i in $(cd /modules/net; echo *.*o); do
+$INSMOD /modules/net/$i >/dev/null 2>&1 && \
+case "$i" in 00*) ;; *) echo "${CRE} ${GREEN}Found network device(s) handled by ${MAGENTA}$i${GREEN}.${NORMAL}" && FOUND_NETWORK="$i" ;; esac
+done
+
+# Enable kernel messages again
+echo "6" > /proc/sys/kernel/printk
+/static/ifconfig lo 127.0.0.1 up
+
+[ -n "FOUND_NETWORK" ] || dropshell "Couldn't find any network device"
+
+DHCP=""
+# How many network cards should we probe for?
+for i in 0 1 2 3; do
+ifconfig "eth$i" up >/dev/null 2>&1 || continue
+echo -n "${CRE}${BLUE}DHCP Broadcasting for IP address (${MAGENTA}eth$i${BLUE})... ${NORMAL}"
+pump -i eth$i && DHCP="eth$i"
+[ -n "$DHCP" ] && break
+echo "${RED}No answer from network.${NORMAL}"
+done
+[ -n "$DHCP" ] && echo "${GREEN}OK.${NORMAL}" || dropshell "Couldn't bring up dhcp"
+
+echo "${CRE} ${GREEN}Network card configuration: ${NORMAL}"
+ifconfig "$DHCP"
+
+# Disable kernel messages again
+echo "0" > /proc/sys/kernel/printk
+fi #net_needed
+
+splash 10000
+
 stage=1
 rundebugshell
 
+TARGET="/cdrom" # 2 mounts needed in the boot process
+if [ -n "$NOCLOOP" ]; then
+  TARGET="/KNOPPIX" # 1 mount needed in the boot process
+  FOUND_KNOPPIX="mounted"
+fi
+if [ -n "$loopfile" ]; then  
+  TARGET="/cdrom" # 2 mounts needed in the boot process
+  NOCLOOP="yes"
+  FOUND_KNOPPIX="mounted"
+fi
+if [ -n "$fromiso" ]; then
+  TARGET="/cdrom.loop" # 3 mounts needed in the boot process
+  /static/mkdir $TARGET
+fi
+
+
+# Load nfs modules
+if [ -n "$NFS" ]; then 
+
+SECURE=""
+case "$cmdline" in *secure*) SECURE="yes";; esac
+
+NFSMODULES="$(cd /modules/net/nfs; echo *.*o)"
+for i in $NFSMODULES; do $INSMOD /modules/net/nfs/$i 2>/dev/null; done
+
+portmap && echo "${CRE} ${GREEN}Portmapper started.${NORMAL}"
+
+# for the upcoming NFS mount
+SECUREOPTIONS=""
+[ -n "$SECURE" ] && SECUREOPTIONS=",nosuid"
+
+# if we have an NFSDIR, try mounting it
+if [ -n "$NFSDIR" ]; then
+    echo -n "${CRE}${BLUE}Trying to mount CD on" \
+	"${MAGENTA}$NFSDIR${BLUE}...${NORMAL}"
+    /static/mount -t nfs -o \
+	ro,rsize=8192,wsize=8192,hard,intr$SECUREOPTIONS \
+        "${NFSDIR}" "$TARGET" > /dev/null 2>&1  && MOUNTED="yes"
+
+	# unsuccessful? Blank out NFSDIR and see if pump does better
+	[ -z "$MOUNTED" ] && echo "${RED}Failed.${NORMAL}" && NFSDIR=
+fi
+
+# no NFSDIR? ask pump for the second server
+if [ -z "$NFSDIR" ]; then
+ PUMP="$(pump -s)"
+ while read next server nfsroot; do
+ case "$next $server" in [Nn]ext\ [Ss]erver) NFSROOT="$nfsroot"; break; ;; esac
+ done <<EOT
+$PUMP
+EOT
+
+ # if that doesn't exist, use the dhcp server
+ if [ -z "$NFSROOT" -o "$NFSROOT" = "0.0.0.0" ];then
+ while read next server nfsroot; do
+ case "$next $server" in [Bb]oot\ [Ss]erver) NFSROOT="$nfsroot"; break; ;; esac
+ done <<EOT
+$PUMP
+EOT
+ fi
+
+ # still nothing? try the default
+ [ -z "$NFSROOT" ] && NFSROOT=192.168.0.1
+
+ # try mounting it, first with "/knoppix"
+ echo -n "${CRE}${BLUE}Trying to mount CD on ${MAGENTA}$NFSROOT${BLUE}...${NORMAL}"
+ /static/mount -t nfs -o ro,rsize=8192,wsize=8192,hard,intr$SECUREOPTIONS \
+  "${NFSROOT}:/knoppix" "$TARGET" > /dev/null 2>&1  && NFSDIR="${NFSROOT}:/knoppix"
+
+# then with "/cdrom"
+ [ -z "$NFSDIR" ] && /static/mount -t nfs -o \
+  ro,rsize=8192,wsize=8192,hard,intr$SECUREOPTIONS \
+  "${NFSROOT}:/cdrom" "$TARGET" > /dev/null 2>&1  && NFSDIR="${NFSROOT}:/cdrom"
+
+ [ -n "$NFSDIR" ] && MOUNTED="yes"
+fi
+
+# STILL nothing? ask the user
+[ -z "$MOUNTED" ] && {
+    for i in 2 1 0; do
+	echo "${RED}Failed.${NORMAL}"
+	echo -n "${CYAN}Please enter NFS directory path" \
+	    "(aka \"192.168.0.1:/cdrom\"): ${NORMAL}"
+	read NFSDIR
+	/static/mount -t nfs -o ro,rsize=8192,wsize=8192,hard,intr$SECUREOPTIONS \
+	    "$NFSDIR" "$TARGET" > /dev/null 2>&1  && MOUNTED="true"
+	[ -n "$MOUNTED" ] && break
+    done
+}
+
+[ -n "$MOUNTED" ] && echo "${GREEN}OK.${NORMAL}"
+[ -z "$MOUNTED" ] && dropshell "Couldn't mount nfs filesystem"
+fi # NFS
+
+if [ -n "$nbdhost" ]; then
+  loadfsmodules
+  $INSMOD /modules/nbd.ko
+  /static/nbd-client $nbdhost $nbdport /dev/nb0 || \
+     dropshell "couldn't setup nbd device on $nbdhost:$nbdport"
+  echo "${CRE}${BLUE}Trying to mount CD via nbd:" \
+  	"${MAGENTA}$nbdhost:$nbdport${BLUE}...${NORMAL}"
+  mountit /dev/nb0 "$TARGET" "-o ro" && MOUNTED="yes"
+  [ -n "$MOUNTED" ] && echo "${GREEN}OK.${NORMAL}"
+  [ -z "$MOUNTED" ] && dropshell "Couldn't mount filesystem on nbd device"
+fi
+
+if [ -n "$fromhd" ]; then
+  loadfsmodules
+  mountit "$fromhd" "$TARGET" "-o ro" && MOUNTED="yes"
+  if [ -n "MOUNTED" ]; then 
+    echo "${CRE} ${GREEN}Mounted ${MAGENTA}$fromhd${GREEN}...${NORMAL}"
+  else
+    dropshell "${CRE} ${RED}Mounting hd $fromhd failed.${NORMAL}"
+  fi
+fi # fromhd
+
+if [ -n "$loopfile" ]; then
+  loadfsmodules # could be needed with nfs
+  $INSMOD /modules/loop.ko
+  /static/losetup /dev/loop0 "/cdrom/$loopfile"
+  mountit /dev/loop0 "/KNOPPIX" "-o ro" && MOUNTED="yes"
+  if [ -n "MOUNTED" ]; then 
+    echo "${CRE} ${GREEN}Mounted loopfile ${MAGENTA}$loopfile${GREEN}...${NORMAL}"
+  else
+    dropshell "${CRE} ${RED}Mounting loopfile $loopfile failed.${NORMAL}"
+  fi
+fi # loopfile
+
+if [ -n "$fromiso" ]; then
+  $INSMOD /modules/loop.ko
+  MOUNTED=""
+  /static/losetup /dev/loop0 "/cdrom.loop$fromiso" 
+  /static/mount -t iso9660 -o ro /dev/loop0 /cdrom  && MOUNTED="yes"
+  if [ -n "MOUNTED" ]; then 
+    echo "${CRE} ${GREEN}Mounted iso ${MAGENTA}$fromiso${GREEN}...${NORMAL}"
+  else
+    dropshell "${CRE} ${RED}Mounting iso $fromiso failed.${NORMAL}"
+  fi
+fi
+
+# 
+if [ -n "$MOUNTED" -a -z "$FOUND_KNOPPIX" ]; then
+  if test -f "/cdrom/$KNOPPIX_DIR/$KNOPPIX_NAME"; then
+    echo "${CRE} ${GREEN}Accessing KNOPPIX ${MEDIUM}...${NORMAL}"
+    FOUND_KNOPPIX="/cdrom"
+  else
+    dropshell "${CRE} ${RED}Accessing KNOPPIX ${MEDIUM} failed.${NORMAL}"
+  fi
+fi
+
+# normal cd boot
+if [ -z "$FOUND_KNOPPIX" ]; then 
 # Now that the right SCSI driver is (hopefully) loaded, try to find CDROM
 DEVICES="/dev/hd?"
 test -n "$FOUND_SCSI" -a -z "$NOCD" && DEVICES="/dev/scd? /dev/scd?? $DEVICES"
@@ -375,6 +638,7 @@
 test -n "$FOUND_SCSI" -a -z "$NOSCSI" && DEVICES="$DEVICES /dev/sd?[1-9] /dev/sd?[1-9][0-9]"
 DEVICES="$DEVICES /dev/ub?[1-9] /dev/ub?[1-9][0-9] /dev/ub? /dev/hd?[1-9] /dev/hd?[1-9][0-9]"
 case "$CMDLINE" in *fromhd=/dev/*) DEVICES="$fromhd"; ;; esac
+test -n "$NOCD" && loadfsmodules # used if fromhd keyword, but no fromhd=...
 for i in $DEVICES
 do
 echo -n "${CRE}${BLUE}Looking for ${MEDIUM} in: ${MAGENTA}$i${NORMAL}   "
@@ -389,6 +653,9 @@
 umount /cdrom
 fi
 done
+fi # FOUND_KNOPPIX
+
+splash 11000
 
 # Harddisk-installed script part version has been removed
 # (KNOPPIX can be booted directly from HD now).
@@ -396,13 +663,27 @@
 mount_knoppix()
 {
  if test -n "$FOUND_KNOPPIX" -a -f "$1/$KNOPPIX_DIR/$KNOPPIX_NAME"; then
-  # DEBUG
-  # echo "6" > /proc/sys/kernel/printk
-  $INSMOD -f /modules/cloop.ko file="$1/$KNOPPIX_DIR/$KNOPPIX_NAME"
+#  # DEBUG
+#  # echo "6" > /proc/sys/kernel/printk
+#  $INSMOD -f /modules/cloop.ko file="$1/$KNOPPIX_DIR/$KNOPPIX_NAME"
+#
+#  accelerated-knoppix : cloop-opt.ko
+#
+  echo "6" > /proc/sys/kernel/printk
+  THREAD="thread_mode=1"
+  CHKBLK="0"
+  for i in $CMDLINE; do
+   case "$i" in chkblk=*|CHKBLK=*) eval $i; [ -n "$chkblk" ] && CHKBLK="$chkblk" ;; esac
+   case "$i" in *noclpthread*|*NOCLPTHREAD*) THREAD="" ;; esac
+  done
+  echo ""
+  $INSMOD -f /modules/cloop.ko chkblks=$CHKBLK "$THREAD" file="$1/$KNOPPIX_DIR/$KNOPPIX_NAME"
+  echo "0" > /proc/sys/kernel/printk
+
   mountit /dev/cloop /KNOPPIX "-o ro" || FOUND_KNOPPIX=""
   # Allow multi-image KNOPPIX mounts
   if [ -n "$FOUND_KNOPPIX" -a -x "$DYNLOADER" -a -x /KNOPPIX/sbin/losetup ]; then
-   echo ""
+#   echo ""
    echo -n "${CRE} ${GREEN}Found primary KNOPPIX compressed image at ${MAGENTA}$1/$KNOPPIX_DIR/$KNOPPIX_NAME${GREEN}.${NORMAL}"
    for c in 1 2 3 4 5 6 7; do
     if [ -f "$1/$KNOPPIX_DIR/$KNOPPIX_NAME$c" ]; then
@@ -572,8 +853,6 @@
   remount_knoppix
 }
 
-mount_knoppix /cdrom
-
 COPYTO=""
 BOOTFROM=""
 DO_REMOUNT=""
@@ -583,6 +862,31 @@
 case "$CMDLINE" in *toram*) DO_REMOUNT="yes"; COPYTO="ram"; ;; esac
 case "$CMDLINE" in *tohd=*) DO_REMOUNT="yes"; COPYTO="hd"; ;; esac
 case "$CMDLINE" in *bootfrom=*) DO_REMOUNT="yes"; BOOTFROM="yes" ;; esac
+
+if [ -z "$NOCLOOP" ]; then
+  #
+  # accelerated-knoppix : cloop blocks readahead
+  #
+  if test -z "$DO_REMOUNT" -a -n "$FOUND_KNOPPIX" ; then
+    if test -x /accel/cloopreadahead ; then
+      CLOOPREADAHEAD="yes";
+      case "$CMDLINE" in *nocbr*|*NOCBR*) CLOOPREADAHEAD=""; ;; esac
+      if test -n "$CLOOPREADAHEAD" -a -f /cdrom/${KNOPPIX_DIR}/${KNOPPIX_NAME}.boot.lst ; then
+        echo ""
+        echo -n " ${GREEN}Reading cloop blocks....${BLUE}(Backgrounding)${NORMAL}"
+  #      /accel/cloopreadahead /cdrom/$KNOPPIX_DIR/$KNOPPIX_NAME /cdrom/${KNOPPIX_DIR}/${KNOPPIX_NAME}.boot.lst > /dev/null 2>&1 &
+        /accel/cloopreadahead /cdrom/$KNOPPIX_DIR/$KNOPPIX_NAME /cdrom/${KNOPPIX_DIR}/${KNOPPIX_NAME}.boot.lst > /.cloopreadahead.log 2>&1 &
+      fi
+    fi
+  fi
+
+  splash 12000
+
+  mount_knoppix /cdrom
+fi
+
+splash 13000
+
  
 # Remount later after copying/isoloading/driverloading?
 # pre-test if everything succeeded
@@ -613,6 +917,8 @@
     copy_to $COPYTO && REAL_TARGET="$TARGET"
   fi
 fi
+
+splash 14000
  
 # Final test if everything succeeded.
 if test -n "$FOUND_KNOPPIX"
@@ -621,9 +927,15 @@
 cat /KNOPPIX/etc/ld.so.cache > /etc/ld.so.cache
 echo ""
 
+# Replace /lib (exists on network initrds)
+/static/rm -rf /lib   2>/dev/null
+/static/ln -sf /KNOPPIX/lib /lib   2>/dev/null
+
 UNIONFS=""
 $INSMOD /modules/unionfs.ko 2>/dev/null && UNIONFS="yes"
 
+splash 15000
+
 # Enable kernel messages
 echo "6" > /proc/sys/kernel/printk
 
@@ -635,6 +947,8 @@
 # Make space: We don't need the modules anymore from here.
 /KNOPPIX/bin/rm -rf /modules
 
+splash 16000
+
 # Debian weirdness
 /KNOPPIX/bin/cp -a /KNOPPIX/etc/alternatives /etc/ 2>/dev/null
 
@@ -645,6 +959,8 @@
 # From here, we should have all essential commands available.
 hash -r
 
+splash 17000
+
 # Did we remount the source media ? 
 if  test -n "$REAL_TARGET"; 
 then
@@ -654,6 +970,9 @@
 # Clean up /
 /KNOPPIX/bin/rm -rf /modules /static
 
+#FIXME remove
+rundebugshell
+
 # New in Kernel 2.4.x: tmpfs with variable ramdisk size.
 # We check for available memory anyways and limit the ramdisks
 # to a reasonable size.
@@ -684,9 +1003,12 @@
 echo -n "${CRE}${BLUE}Creating ${YELLOW}/ramdisk${BLUE} (dynamic size=${RAMSIZE}k) on ${MAGENTA}shared memory${BLUE}...${NORMAL}"
 # We need /bin/mount here for the -o size= option
 /bin/mount -t tmpfs -o "size=${RAMSIZE}k" /ramdisk /ramdisk 
-mkdir -p /ramdisk/tmp /ramdisk/home/knoppix && chmod 1777 /ramdisk/tmp && chown knoppix.knoppix /ramdisk/home/knoppix && ln -snf /ramdisk/home /home && mv /tmp /tmp.old && ln -s /ramdisk/tmp /tmp && rm -rf /tmp.old
+mkdir -p /ramdisk/tmp && chmod 1777 /ramdisk/tmp && mv /tmp /tmp.old && ln -s /ramdisk/tmp /tmp && rm -rf /tmp.old
+
 echo "${BLUE}Done.${NORMAL}"
 
+splash 18000
+
 stage=2
 rundebugshell
 
@@ -695,6 +1017,7 @@
 UNION="/ramdisk=rw"
 # Add all KNOPPIX images to the union
 for c in "" 1 2 3 4 5 6 7; do
+#FIXME add nfsro support
  [ -d "/KNOPPIX$c" ] && UNION="$UNION:/KNOPPIX$c=ro"
 done
 # Do the actual mount
@@ -711,7 +1034,7 @@
   fi
  done
  for i in $(cd /UNIONFS; echo *);do # Create links for new stuff on /UNIONFS
-   test "$i" = "home" -o "$i" = "tmp" && continue
+   test "$i" = "tmp" && continue
    test -L "/$i" || test -d "/$i" || test -f "/$i" || ln -snf "/UNIONFS/$i" /$i
  done
 else
@@ -719,6 +1042,8 @@
  /KNOPPIX/sbin/halt -f -n
 fi
 
+splash 19000
+
 echo ""
 echo "${GREEN}>> Read-only ${MEDIUM} system successfully merged with read-write /ramdisk.${NORMAL}"
 chown knoppix.knoppix /home/knoppix
@@ -749,24 +1074,96 @@
 /bin/cp -f /KNOPPIX/etc/localtime /etc/localtime
 echo "${BLUE}Done.${NORMAL}"
 
+splash 20000
+
 # Mount devpts
 # mount -t devpts /dev/pts /dev/pts 2>/dev/null
 
 # Clean up /etc/mtab (and - just in case - make a nice entry for looped ISO)
 /bin/egrep " /KNOPPIX[0-9]* | /cdrom " /proc/mounts | sed 's|/dev/loop0 /cdrom \(.*\) 0 0|'$LOOP_SOURCE$ISO_PATH' /cdrom/ \1,loop=/dev/loop0 0 0|g' >> /etc/mtab
 
+splash 21000
+
+#
+# accelerated-knoppix : bootchart
+#
+if test -x /accel/bootchartd -a -f /accel/45xsession ; then
+  BOOTCHART=""
+  case "$CMDLINE" in *bootchart*|*BOOTCHART*) BOOTCHART="yes"; ;; esac
+  if test -n "$BOOTCHART" ; then
+    echo -n "${YELLOW}BOOTCHART INSTALL...${NORMAL}"
+    [ -f /etc/init ] && mv /etc/init /etc/init.org
+    [ -f /accel/accton ] && mv /accel/accton /etc/accton
+    cp /accel/bootchartd /etc/init
+    cp /accel/bootchartd /etc
+    echo " ${BLUE}Done${NORMAL}"
+  fi
+
+  [ -f /etc/X11/Xsession.d/45xsession ] && mv /etc/X11/Xsession.d/45xsession /etc/X11/Xsession.d/45xsession.org
+  NOAC45=""
+  case "$CMDLINE" in *noac45*|*NOAC45*) NOAC45="yes"; ;; esac
+  if test -n "$NOAC45" -a -f /accel/45xsession_bt ; then
+    mv /accel/45xsession_bt /etc/X11/Xsession.d/45xsession
+  else
+    mv /accel/45xsession /etc/X11/Xsession.d/45xsession
+  fi
+fi
+
+#
+# accelerated-knoppix : install and clean up
+#
+if test -f /accel/knoppix-autoconfig ; then
+  NOACKA=""
+  case "$CMDLINE" in *noacka*|*NOACKA*) NOACKA="yes"; ;; esac
+  if test -z "$NOACKA" ; then
+    echo -n "${RED}Accelerated AUTOCONFIG ${YELLOW}INSTALL...${NORMAL}"
+    [ -f /etc/init.d/knoppix-autoconfig ] && mv /etc/init.d/knoppix-autoconfig /etc/init.d/knoppix-autoconfig.org
+    cp /accel/knoppix-autoconfig /etc/init.d
+    [ -f /etc/rcS.d/S00knoppix-autoconfig ] && rm -f /etc/rcS.d/S00knoppix-autoconfig
+    (cd /etc/rcS.d; ln -s ../init.d/knoppix-autoconfig S00knoppix-autoconfig )
+    echo " ${BLUE}Done${NORMAL}"
+  fi
+fi
+if test -f /accel/xsession ; then
+  NOACXS=""
+  case "$CMDLINE" in *noacxs*|*NOACXS*) NOACXS="yes"; ;; esac
+  if test -z "$NOACXS" ; then
+    echo -n "${RED}Accelerated XSESSION ${YELLOW}INSTALL...${NORMAL}"
+    [ -f /etc/init.d/xsession ] && mv /etc/init.d/xsession /etc/init.d/xsession.org
+    cp /accel/xsession /etc/init.d
+    echo " ${BLUE}Done${NORMAL}"
+  fi
+fi
+if test -f /accel/inittab ; then
+  NOACIT=""
+  case "$CMDLINE" in *noacit*|*NOACIT*) NOACIT="yes"; ;; esac
+  if test -z "$NOACIT" ; then
+    echo -n "${RED}Accelerated INITTAB ${YELLOW}INSTALL...${NORMAL}"
+    [ -f /etc/inittab ] && mv /etc/inittab /etc/inittab.org
+    cp /accel/inittab /etc
+    echo " ${BLUE}Done${NORMAL}"
+  fi
+fi
+[ -x /accel/hwsetup ] && cp /accel/hwsetup /etc >/dev/null 2>&1
+[ -x /accel/mkxf86config ] && cp /accel/mkxf86config /etc >/dev/null 2>&1
+[ -x /accel/cloopreadahead ] && cp /accel/cloopreadahead /etc >/dev/null 2>&1
+[ -d /accel ] && rm -rf /accel
+
+
 # Now tell kernel where the real modprobe lives
 echo "/sbin/modprobe" > /proc/sys/kernel/modprobe
 
 # Change root device from /dev/fd0 to /dev/ram0
 echo "0x100" > /proc/sys/kernel/real-root-dev
 
+splash 22000
+
 stage=3
 rundebugshell
 
 # Give control to the init process.
 echo "${CRE}${BLUE}Starting init process.${NORMAL}"
-rm -f /linuxrc
+rm -f /linuxrc /busybox
 exit 0
 
 else
