All pastes #408166 Raw Edit

Plouj

public shellscript v1 · immutable
#408166 ·published 2007-03-24 17:18 UTC
rendered paste body
#!/static/ash## KNOPPIX Terminalserver Client Startup Script# (C) Aug 2002 Klaus Knopper <knoppix@knopper.net>## This script needs some commands that are not yet builtins# to ash.static (nfs-capable mount, pump, portmap).## hardcoded but configurable options# Default maximum size of dynamic ramdisk in kilobytesRAMSIZE=1000000# End of options# Don't allow interrupt signalstrap "" 1 2 3 15MODULES_DIR="/cdrom/KNOPPIX/modules"# Misc functionsINSMOD="insmod"[ -x /modules/insmod ] && INSMOD="/modules/insmod"[ -x /static/insmod ] && INSMOD="/static/insmod"RMMOD="rmmod"[ -x /modules/rmmod ] && RMMOD="/modules/rmmod"[ -x /static/rmmod ] && RMMOD="/static/rmmod"# Dynamic program loader# /KNOPPIX is already mounted when this is used.DYNLOADER="/KNOPPIX/lib/ld-linux.so.2"mountit(){# Usage: mountit src dst "options"# Uses builtin mount of ash.knoppix# Builin filesystemsBUILTIN_FS="iso9660 ext2 vfat"for fs in $BUILTIN_FS; dotest -b $1 && mount -t $fs $3 $1 $2 >/dev/null 2>&1 && return 0donereturn 1}FOUND_SCSI=""FOUND_KNOPPIX=""INTERACTIVE=""# Clean input/outputexec >/dev/console </dev/console 2>&1# Reset fb color modeRESET="]R"# ANSI COLORS# Erase to end of lineCRE=""# Clear and reset ScreenCLEAR="c"# Normal colorNORMAL=""# RED: Failure or error messageRED=""# GREEN: Success messageGREEN=""# YELLOW: DescriptionsYELLOW=""# BLUE: System mesagesBLUE=""# MAGENTA: Found devices or driversMAGENTA=""# CYAN: QuestionsCYAN=""# BOLD WHITE: HintWHITE=""# Clear screen with colormode reset# echo "$CLEAR$RESET"# echo "$CLEAR"# Just go to the top of the screen# echo -n ""# We only need the builtin commands and /static at this pointPATH=/staticexport PATHumask 022# Be verboseecho "${WHITE}Welcome to the ${CYAN}K${MAGENTA}N${YELLOW}O${WHITE}P${RED}P${GREEN}I${BLUE}X${WHITE} Terminal Client!${NORMAL}"# Mount /proc and /dev/ptsmount -t proc none /proc# Kernel 2.6mount -t sysfs /sys /sys >/dev/null 2>&1# Check if we are in interactive startup modecmdline="$(cat /proc/cmdline 2>/dev/null)"# Check if we are in interactive startup modecase "$CMDLINE" in *BOOT_IMAGE=expert\ *) INTERACTIVE="yes"; :>/interactive; ;; esaccase "$CMDLINE" in *modules-disk*) INTERACTIVE="yes"; ;; esaccase "$CMDLINE" in *BOOT_IMAGE=debug\ *|*\ debug\ *) DEBUG="yes"; ;; esac# Does the user want to skip scsi detection?NOSCSI=""case "$CMDLINE" in *noscsi*|*nobootscsi*) NOSCSI="yes"; ;; esaccase "$CMDLINE" in *nousb*|*nobootusb*) NOUSB="yes"; ;; esaccase "$CMDLINE" in *nofirewire*|*nobootfirewire*) NOFIREWIRE="yes"; ;; esacNOCD=""case "$CMDLINE" in *fromhd*) NOCD="yes"; ;; esaccase "$CMDLINE" in *fromdvd*) FROMDVD="yes"; ;; esaccase "$CMDLINE" in *idecd*|*atapicd*) IDECD="yes"; ;; esaccase "$CMDLINE" in *noideraid*) NOIDERAID="yes"; ;; esacUSB2="ehci-hcd.o"case "$CMDLINE" in *nousb2*) USB2=""; ;; esacKNOPPIX_DIR="KNOPPIX"KNOPPIX_NAME="KNOPPIX"case "$CMDLINE" in *knoppix_dir=*) KNOPPIX_DIR="$knoppix_dir"; ;; esaccase "$CMDLINE" in *knoppix_name=*) KNOPPIX_NAME="$knoppix_name"; ;; esaccase "$cmdline" in *BOOT_IMAGE=expert\ *) INTERACTIVE="yes"; :>/interactive; ;; esac# Does the user want to skip scsi detection?NOSCSI=""case "$cmdline" in *noscsi*) NOSCSI="yes"; ;; esac# Split cmdline, find NFSDIR variablefor i in $cmdline; do case "$i" in ip=*|IP=*|nm=*|NM=*|gw=*|GW=*|nfsdir=*|NFSDIR=*) eval $i;; esac; done[ -n "$ip" ] && IP="$ip"[ -n "$nm" ] && NM="$nm"[ -n "$gw" ] && GW="$gw"[ -n "$nfsdir" ] && NFSDIR="$nfsdir"# Check for "secure" optionSECURE=""case "$cmdline" in *secure*) SECURE="yes";; esac# Disable kernel messages while probing modules in autodetect modeecho "0" > /proc/sys/kernel/printk# Check if we must use a custom insmodINSMOD=insmodtest -x /static/insmod && INSMOD=/static/insmod# Run a shell if in debug modestage=1rundebugshell(){if [ -n "$DEBUG" ]; thenecho "${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/bashfi}# Mount module diskmountmodules(){TYPE="$1"; shiftecho -n "${CRE}${CYAN}Please insert ${TYPE} modules disk and hit Return. ${NORMAL}"read aecho -n "${CRE}${BLUE}Mounting ${TYPE} modules disk... ${NORMAL}"# We always mount over /modules/scsi (because it's there ;-)if mountit /dev/fd0 /modules/scsi "-o ro"; thenecho "${GREEN}OK.${NORMAL}"return 0fiecho "${RED}NOT FOUND.${NORMAL}"return 1}# Unmount module diskumountmodules(){TYPE="$1"; shiftecho -n "${CRE}${BLUE}Unmounting ${TYPE} modules disk... ${NORMAL}"umount /modules/scsi 2>/dev/nullecho "${GREEN}DONE.${NORMAL}"}# Ask user for modulesaskmodules(){TYPE="$1"; shiftecho "${BLUE}${TYPE} modules available:${WHITE}"c=""; for m in "$@"; doif test -f "/modules/scsi/$m"; thentest -z "$c"  && { echo -n "	$m"; c="1"; } || { echo "		$m"; c=""; }fidone[ -n "$c" ] && echoecho "${CYAN}Load ${TYPE} Modules?${NORMAL}"echo "${CYAN}[Enter full filename(s) (space-separated), Return for autoprobe, ${WHITE}n${CYAN} for none] ${NORMAL}"echo -n "${CYAN}insmod module(s)> ${NORMAL}"read MODULEScase "$MODULES" in n|N) MODULES=""; ;; y|"")  MODULES="$*"; ;; esac}# Try to load the given modules (full path or current directory)loadmodules(){TYPE="$1"; shifttest -n "$INTERACTIVE" && echo "6" > /proc/sys/kernel/printkfor i in "$@"; doecho -n "${CRE}${BLUE}Probing ${TYPE}... ${MAGENTA}$i${NORMAL}"if test -f /modules/scsi/$i && $INSMOD /modules/scsi/$i >/dev/null 2>&1thenecho "${CRE} ${GREEN}Activated support for ${TYPE} device(s) handled by ${MAGENTA}$i${GREEN}.${NORMAL}"case "$TYPE" in scsi|SCSI) FOUND_SCSI="yes"; ;; esacfidonetest -n "$INTERACTIVE" && echo "0" > /proc/sys/kernel/printkecho -n "${CRE}"}dropshell(){echo "${CRE}${RED}Can't NFSmount 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:"helpecho ""PS1="knoppix# "export PS1echo "6" > /proc/sys/kernel/printk# Allow signalstrap 1 2 3 15echo "Modules loaded:" ; cat /proc/modulesexec /static/ash}# Load nfs modulesNFSMODULES="$(cd /modules/net; echo af_packet.*o cifs.*o)"for i in $NFSMODULES; do $INSMOD /modules/net/$i 2>/dev/null; done# Check for misc modules in expert modeif test -n "$INTERACTIVE"; thenanother=""; answer=""while test "$answer" != "n" -a "$answer" != "N"; doecho -n "${CYAN}Do you want to load additional modules from$another floppy disk? [${WHITE}Y${CYAN}/n] ${NORMAL}"another=" another"read answercase "$answer" in n*|N*) break; ;; esacif mountmodules new; thenaskmodules new $(cd /modules/scsi; echo *.*o)test -n "$MODULES" && loadmodules new $MODULESumountmodules currentfidonefi# All interactively requested modules should be loaded now.# Check for SCSI CD-Roms et al.test -f /proc/scsi/scsi && FOUND_SCSI="yes"# Disable kernel messages againecho "0" > /proc/sys/kernel/printkFOUND_NETWORK=""echo "Loading network device module(s)"for i in $(cd /modules/net; echo *.*o); docase "$NFSMODULES" in*$i*) ;;*) $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;;esacdone# Enable kernel messages againecho "6" > /proc/sys/kernel/printk/static/ifconfig lo 127.0.0.1 up[ -n "FOUND_NETWORK" ] || dropshellDHCP=""# How many network cards should we probe for?for i in 0 1 2 3; doifconfig "eth$i" up >/dev/null 2>&1 || continueecho -n "${CRE}${BLUE}DHCP Broadcasting for IP address (${MAGENTA}eth$i${BLUE})... ${NORMAL}"pump -i eth$i && DHCP="eth$i"[ -n "$DHCP" ] && breakecho "${RED}No answer from network.${NORMAL}"done[ -n "$DHCP" ] && echo "${GREEN}OK.${NORMAL}" || dropshellecho "${CRE} ${GREEN}Network card configuration: ${NORMAL}"ifconfig "$DHCP"case "$NFSDIR" in //*)SMBFS="yes" ;;*)portmap && echo "${CRE} ${GREEN}Portmapper started.${NORMAL}";;esac# for the upcoming NFS mountMOUNTED=""SECUREOPTIONS=""[ -n "$SECURE" ] && SECUREOPTIONS=",nosuid"if [ -n "$SMBFS" ];then   RFSOPTS="ro,user=root,pass="   echo -n "Trying to cifsmount $NFSDIR..."   for i in 1 2 3 4   do     /static/mount.cifs "$NFSDIR" /cdrom -o "$RFSOPTS$SECUREOPTIONS" > /dev/null 2>&1 && MOUNTED="cifs" && break   doneelse# if we have an NFSDIR, try mounting itif [ -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}" /cdrom > /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 serverif [ -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$PUMPEOT # 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$PUMPEOT 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" /cdrom > /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" /cdrom > /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" /cdrom > /dev/null 2>&1  && MOUNTED="true"	[ -n "$MOUNTED" ] && break    done}fi[ -n "$MOUNTED" ] && echo "${GREEN}OK.${NORMAL}"[ -z "$MOUNTED" ] && dropshellFOUND_KNOPPIX=""if test -f /cdrom/$KNOPPIX_DIR/$KNOPPIX_NAMEthenecho -n "${CRE} ${GREEN}Accessing KNOPPIX CDROM image at ${MAGENTA}$NFSDIR${GREEN}...${NORMAL}"FOUND_KNOPPIX="true"elsedropshellfi# From here, everything is like in the standard /linuxrc of KNOPPIX.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_DIR"/cloop.ko file="$1/$KNOPPIX_DIR/$KNOPPIX_NAME" || $INSMOD -f /modules/cloop.ko file="$1/$KNOPPIX_DIR/$KNOPPIX_NAME"  mountit /dev/cloop /KNOPPIX "-o ro$SECUREOPTIONS" || FOUND_KNOPPIX=""  # Allow multi-image KNOPPIX mounts  if [ -n "$FOUND_KNOPPIX" -a -x "$DYNLOADER" -a -x /KNOPPIX/sbin/losetup ]; then   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     if "$DYNLOADER" --library-path /KNOPPIX/lib /KNOPPIX/sbin/losetup "/dev/cloop$c" "$1/$KNOPPIX_DIR/$KNOPPIX_NAME$c"; then      if "$DYNLOADER" --library-path /KNOPPIX/lib /KNOPPIX/bin/mkdir -p "/KNOPPIX$c"; then       if mountit "/dev/cloop$c" "/KNOPPIX$c" "-o ro$SECUREOPTIONS"; then        echo ""        echo -n "${CRE} ${GREEN}Found additional KNOPPIX compressed image at ${MAGENTA}$1/$KNOPPIX_DIR/$KNOPPIX_NAME$c${GREEN}.${NORMAL}"       else        "$DYNLOADER" --library-path /KNOPPIX/lib /KNOPPIX/bin/rmdir "/KNOPPIX$c" 2>/dev/null       fi      else       "$DYNLOADER" --library-path /KNOPPIX/lib /KNOPPIX/bin/losetup -d "/dev/cloop$c" 2>/dev/null      fi     fi    fi   done  fi fi}remount_knoppix(){  if test -f $TARGET/$KNOPPIX_DIR/$KNOPPIX_NAME; then    umount /KNOPPIX # unmount it    echo "$RMMOD cloop" | /static/ash # release CD - ash crashes with parts of libc in memory -- FF    umount $SOURCE  # unmount CD    [ -n "$SOURCE2" ] && umount $SOURCE2  # umount possible loop-device    mount_knoppix $TARGET  else    echo "${CRE} ${RED}Warning: Changing to $TARGET failed.${NORMAL}"    return 1  fi    return 0}boot_from(){  # preparations  /bin/mkdir $TARGET  SOURCE_DEV=$(echo $CMDLINE | /usr/bin/tr ' ' '\n' | /bin/sed -n '/bootfrom=/s/.*=//p' | /usr/bin/tail -1)    LOOP_DEV=$(echo $SOURCE_DEV | /usr/bin/gawk -F/ '{ print $1 "/" $2 "/" $3 }')  ISO_PATH=$(echo $SOURCE_DEV | /bin/sed "s|$LOOP_DEV||g" )  case "$ISO_PATH" in /*.[iI][sS][oO]) ;; *) ISO_PATH="" ;; esac  LOOP_SOURCE=""    # load filesystems  /KNOPPIX/sbin/modprobe reiserfs  /KNOPPIX/sbin/modprobe ext3  /KNOPPIX/sbin/modprobe ntfs    # BE CAREFUL! - Only mount it read only! - FF   if [ -n "$ISO_PATH" ]  then     LOOP_SOURCE="$TARGET.loop"     LOOP_SOURCE2="$LOOP_SOURCE"     TARGET_DEV="$LOOP_SOURCE$ISO_PATH"     /bin/mkdir $LOOP_SOURCE     /KNOPPIX/sbin/modprobe loop     /bin/mount -o ro $LOOP_DEV $LOOP_SOURCE || LOOP_SOURCE=""     /bin/mount -n -o loop $LOOP_SOURCE2$ISO_PATH $TARGET  else     TARGET_DEV="$SOURCE_DEV"    /bin/mount -n -o ro $SOURCE_DEV $TARGET  fi  if [ $? -ne 0 ]  then     [ -n "$LOOP_SOURCE" ] && /bin/umount $LOOP_SOURCE     echo -n "${CRE} ${RED}Accessing KNOPPIX CDROM failed. ${MAGENTA}$TARGET_DEV${RED} is not mountable.${NORMAL}"     sleep 2     return 1  fi    if [ -f $TARGET/$KNOPPIX_DIR/$KNOPPIX_NAME ]  then    echo -n "${CRE} ${GREEN}Accessing KNOPPIX CDROM at ${MAGENTA}$TARGET_DEV${GREEN}...${NORMAL}"  else    echo -n "${CRE} ${RED}Accessing KNOPPIX CDROM failed. Could not find $KNOPPIX_DIR/$KNOPPIX_NAME on ${MAGENTA}$TARGET_DEV${RED}.${NORMAL}"    [ -n "$LOOP_SOURCE" ] && /bin/umount $LOOP_SOURCE    umount $TARGET    sleep 2    return 1  fi  # remount the CD   remount_knoppix}copy_to(){  # preparations  /bin/mkdir $TARGET  COPY="$SOURCE/$KNOPPIX_DIR"  # look if we copy to hd or to ram  SIZE="$(/usr/bin/du -s $COPY | /usr/bin/gawk '{print int($1*1.1)}')"  test -n "$SIZE" || SIZE="800000"    case "$1" in     ram)      TARGET_DEV="/dev/shm"      TARGET_DEV_DESC="ramdisk"      FOUNDSPACE="$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)"      /bin/mount -n -t tmpfs -o size=${SIZE}k $TARGET_DEV $TARGET    ;;    hd)      TARGET_DEV=$(echo $CMDLINE | /usr/bin/tr ' ' '\n' | /bin/sed -n '/tohd=/s/.*=//p' | /usr/bin/tail -1)      TARGET_DEV_DESC="$TARGET_DEV"      # load filesystems      /KNOPPIX/sbin/modprobe reiserfs      /KNOPPIX/sbin/modprobe jbd      /KNOPPIX/sbin/modprobe ext3      BUILTIN_FS="iso9660 ext3 ext2 reiserfs vfat"      # we need to use mountit to prevent NTFS to be mounted!      if mountit $TARGET_DEV $TARGET "-o rw"      then        :      else        echo -n "${CRE} ${RED}Copying KNOPPIX CDROM failed. ${MAGENTA}$TARGET_DEV_DESC${RED} is not mountable.${NORMAL}"	sleep 2        return 1      fi      # check for enough free space      USED_SPACE=0      [ -f $TARGET/$KNOPPIX_DIR/$KNOPPIX_NAME ] && USED_SPACE=$(/usr/bin/du -s $TARGET/$KNOPPIX_DIR/$KNOPPIX_NAME | /usr/bin/gawk '{ print $1 }')      FOUNDSPACE="$(/bin/df -k $TARGET | /usr/bin/tail -1 | /usr/bin/gawk '{ print $4+int('$USED_SPACE') }')"   ;;   *)     return 1   ;;  esac   # sanity check  if [ $FOUNDSPACE -lt $SIZE ]  then    echo -n "${CRE} ${RED}Copying KNOPPIX CDROM failed. Not enough free space on ${MAGENTA}${TARGET_DEV_DESC}${RED}. Found: ${MAGENTA}${FOUNDSPACE}k${RED} Need: ${MAGENTA}${SIZE}k${RED} ${NORMAL}"    sleep 2    umount $TARGET    return 1  fi   # do the real copy    echo "${CRE} ${GREEN}Copying KNOPPIX CDROM to ${MAGENTA}$TARGET_DEV_DESC${GREEN}... Please be patient. ${NORMAL}"  if [ -z "$use_cp" -a -x /usr/bin/rsync ]  then     # first cp the small files    /usr/bin/rsync -a --exclude="$KNOPPIX_DIR/$KNOPPIX_NAME" $COPY $TARGET # Copy Knoppix to $TARGET    # then the big file with nice progress meter    [ -f $TARGET/$KNOPPIX_DIR/$KNOPPIX_NAME ] && /bin/rm -f $TARGET/$KNOPPIX_DIR/$KNOPPIX_NAME    /usr/bin/rsync -a --progress --include="$KNOPPIX_DIR/$KNOPPIX_NAME" --include="$KNOPPIX_DIR/" --exclude="*" $COPY $TARGET # Copy Knoppix to $TARGET    #/usr/bin/rsync -avP $COPY $TARGET # Copy Knoppix to $TARGET  else    /bin/cp -a -f $COPY $TARGET # Copy Knoppix to $TARGET  fi  if [ $? -ne 0 ]  then    echo -n "${CRE} ${RED}Copying KNOPPIX CDROM failed. ${MAGENTA}$TARGET_DEV_DESC${RED} possibly has not enough space left.${NORMAL}"    sleep 2    return 1  fi  # remount r/o  /bin/mount -n -o remount,ro $TARGET_DEV $TARGET  remount_knoppix}mount_knoppix /cdromCOPYTO=""BOOTFROM=""DO_REMOUNT=""REAL_TARGET=""UNIONFS=""case "$CMDLINE" in *toram*) DO_REMOUNT="yes"; COPYTO="ram"; ;; esaccase "$CMDLINE" in *tohd=*) DO_REMOUNT="yes"; COPYTO="hd"; ;; esaccase "$CMDLINE" in *bootfrom=*) DO_REMOUNT="yes"; BOOTFROM="yes" ;; esac # Remount later after copying/isoloading/driverloading?# pre-test if everything succeededif  test -n "$DO_REMOUNT" -a -n "$FOUND_KNOPPIX"then  # copy library cache   cat /KNOPPIX/etc/ld.so.cache > /etc/ld.so.cache   echo ""   SOURCE="/cdrom"  TARGET="/cdrom2"   # first test for possible hdboot/fromiso (which can be combined with toram / tohd)  if [ -n "$BOOTFROM" ]  then    boot_from    if [ $? -eq 0 ]    then      # set new source / target paths      REAL_TARGET="$TARGET"      SOURCE2="$LOOP_SOURCE"      SOURCE="/cdrom2"      TARGET="/cdrom3"    fi  fi  if [ -n "$COPYTO" ]  then    copy_to $COPYTO && REAL_TARGET="$TARGET"  fifi # Final test if everything succeeded.if test -n "$FOUND_KNOPPIX"then# copy library cachecat /KNOPPIX/etc/ld.so.cache > /etc/ld.so.cacheecho ""UNIONFS=""$INSMOD "$MODULES_DIR/unionfs.ko" 2>/dev/null && UNIONFS="yes"[ -z "$UNIONFS" ] && $INSMOD /modules/unionfs.ko 2>/dev/null && UNIONFS="yes"# Enable kernel messagesecho "6" > /proc/sys/kernel/printk# Set pathsecho -n "${CRE}${BLUE}Setting paths...${NORMAL}"PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:."export PATH# Make space: We don't need the modules anymore from here./KNOPPIX/bin/rm -rf /modules# Debian weirdness/KNOPPIX/bin/cp -a /KNOPPIX/etc/alternatives /etc/ 2>/dev/null# Replace /sbin/KNOPPIX/bin/rm -f /sbin/KNOPPIX/bin/ln -sf /KNOPPIX/sbin /sbin# From here, we should have all essential commands available.hash -r# Did we remount the source media ? if  test -n "$REAL_TARGET"; then   /bin/mount -n --move $REAL_TARGET /cdrom # move it back and go on to normal boot fi# Clean up //KNOPPIX/bin/rm -rf /modules /static# 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.FOUNDMEM="$(/KNOPPIX/usr/sbin/chroot /KNOPPIX /usr/bin/gawk '/MemTotal/{print $2}' < /proc/meminfo)"TOTALMEM="$(/KNOPPIX/usr/sbin/chroot /KNOPPIX /usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached/{m+=$2};END{print m}' < /proc/meminfo)" # Be verboseecho "${CRE}${BLUE}Total memory found: ${YELLOW}${FOUNDMEM}${BLUE} kB${NORMAL}"# Now we need to use a little intuition for finding a ramdisk size# that keeps us from running out of space, but still doesn't crash the# machine due to lack of Ram# Minimum size of additional ram partitionsMINSIZE=20000# At least this much memory minus 30% should remain when home and var are full.MINLEFT=16000# Maximum ramdisk sizeMAXSIZE="$(expr $TOTALMEM - $MINLEFT)"# Default ramdisk size for ramdiskRAMSIZE="$(expr $TOTALMEM / 5)"# Create additional dynamic ramdisk.test -z "$RAMSIZE" -o "$RAMSIZE" -lt "$MINSIZE" && RAMSIZE="$MINSIZE"mkdir -p /ramdisk# tmpfs/varsize version, can use swapRAMSIZE=$(expr $RAMSIZE \* 4)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 1000.1000 /ramdisk/home/knoppix && ln -snf /ramdisk/home /home && mv /tmp /tmp.old && ln -s /ramdisk/tmp /tmp && rm -rf /tmp.oldecho "${BLUE}Done.${NORMAL}"stage=2rundebugshellecho -n "${CRE}${BLUE}Creating unionfs and symlinks on ramdisk...${NORMAL}"mkdir -p /UNIONFSUNION="/ramdisk=rw"# Add all KNOPPIX images to the unionfor c in "" 1 2 3 4 5 6 7; do [ -d "/KNOPPIX$c" ] && UNION="$UNION:/KNOPPIX$c=ro"done# Do the actual mountif test -n "$UNIONFS" && /bin/mount -t unionfs -o "dirs=$UNION$SECUREOPTIONS" /UNIONFS /UNIONFS; then # We now have unionfs, copy some data from the initial ramdisk first rm -f /UNIONFS/etc/resolv.conf cp -a /etc/fstab /etc/auto.mnt /etc/filesystems /etc/mtab /etc/resolv.conf /UNIONFS/etc/ for i in bin boot etc sbin var lib opt root usr; do # Move directories to unionfs  if test -d /$i; then   mv /$i /$i.old && \   /KNOPPIX/lib/ld-linux.so.2 --library-path /KNOPPIX/lib /KNOPPIX/bin/ln -snf /UNIONFS/$i /$i && \   rm -rf /$i.old  else   ln -snf /UNIONFS/$i /$i  fi done for i in $(cd /UNIONFS; echo *);do # Create links for new stuff on /UNIONFS   test "$i" = "home" -o "$i" = "tmp" && continue   test -L "/$i" || test -d "/$i" || test -f "/$i" || ln -snf "/UNIONFS/$i" /$i doneelse echo -n "${CRE}${RED}ERROR: CANNOT UNITE READ-ONLY MEDIA AND INITIAL RAMDISK!${NORMAL}" /KNOPPIX/sbin/halt -f -nfiecho ""echo "${GREEN}>> Read-only CD/DVD system successfully merged with read-write /ramdisk.${NORMAL}"chown knoppix.knoppix /home/knoppix# CUPS wants writable files. :-/cp -a /KNOPPIX/etc/cups/*.conf /etc/cups/ 2>/dev/null# resolv.conf must be writable as wellcp -a /KNOPPIX/etc/dhcpc/resolv.conf /etc/dhcpc/ 2>/dev/null# Create empty utmp and wtmp:> /var/run/utmp:> /var/run/wtmp# Make SURE that these are files, not links!rm -rf /etc/ftpusers /etc/passwd /etc/shadow /etc/gshadow /etc/group \       /etc/ppp /etc/isdn /etc/ssh /etc/ioctl.save \       /etc/inittab /etc/network /etc/sudoers \       /etc/init /etc/localtime /etc/dhcpc /etc/pnm2ppa.conf 2>/dev/nullcp -a /KNOPPIX/etc/ftpusers /KNOPPIX/etc/passwd /KNOPPIX/etc/shadow /etc/gshadow /KNOPPIX/etc/group \      /KNOPPIX/etc/ppp /KNOPPIX/etc/isdn /KNOPPIX/etc/ssh \      /KNOPPIX/etc/inittab /KNOPPIX/etc/network /KNOPPIX/etc/sudoers \      /KNOPPIX/sbin/init /KNOPPIX/etc/dhcpc /etc/ 2>/dev/null# Extremely important, init crashes on shutdown if this is only a link:> /etc/ioctl.save:> /etc/pnm2ppa.conf# Must exist for samba to work[ -d /var/lib/samba ] && :> /var/lib/samba/unexpected.tdb# Kernel 2.6.9 bug?chmod 1777 /tmp /var/tmp# Diet libc bug workaround/bin/cp -f /KNOPPIX/etc/localtime /etc/localtimeecho "${BLUE}Done.${NORMAL}"# Mount devpts# mount -t devpts /dev/pts /dev/pts 2>/dev/nullsed "s|/etc/init 0|/sbin/shutdown -t1 -a -r now|" /KNOPPIX/etc/inittab > /etc/inittab[ -n "$SECURE" ] && sed 's|/bin/bash -login|/bin/su -c "/bin/bash -login" knoppix|;s|/etc/init 0|/sbin/shutdown -t1 -a -r now|' /KNOPPIX/etc/inittab > /etc/inittabsed 's@^NETMOUNTS.*@NETMOUNTS="$(egrep \"nfs\|smbfs\|cifs\" /proc/mounts 2>/dev/null)"@;s/nfs,smbfs/nfs,smbfs,cifs/' /KNOPPIX/etc/init.d/knoppix-halt > /etc/init.d/knoppix-halt# 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# Now tell kernel where the real modprobe livesecho "/sbin/modprobe" > /proc/sys/kernel/modprobe# Change root device from /dev/fd0 to /dev/ram0echo "0x100" > /proc/sys/kernel/real-root-devstage=3rundebugshell# Give control to the init process.echo "${CRE}${BLUE}Starting init process.${NORMAL}"rm -f /linuxrcexit 0elseecho "${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:"echo "	cat        mount     umount"echo "	insmod     rmmod     lsmod"echo ""PS1="knoppix# "export PS1echo "6" > /proc/sys/kernel/printk# Allow signalstrap 1 2 3 15exec /static/ashfi