#!/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="[K"# Clear and reset ScreenCLEAR="c"# Normal colorNORMAL="[0;39m"# RED: Failure or error messageRED="[1;31m"# GREEN: Success messageGREEN="[1;32m"# YELLOW: DescriptionsYELLOW="[1;33m"# BLUE: System mesagesBLUE="[1;34m"# MAGENTA: Found devices or driversMAGENTA="[1;35m"# CYAN: QuestionsCYAN="[1;36m"# BOLD WHITE: HintWHITE="[1;37m"# Clear screen with colormode reset# echo "$CLEAR$RESET"# echo "$CLEAR"# Just go to the top of the screen# echo -n "[H[J"# 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 /ramdiskmkdir -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