3 # Purpose: minirt for kernel 2.6
4 # Authors: (c) Klaus Knopper <knoppix@knopper.net>, (c) Michael Prokop <mika@grml.org>
5 # Latest change: Die Apr 19 11:44:14 CEST 2005 [mika]
6 #######################################################################################
8 # hardcoded configurable options
9 # Default maximum size of dynamic ramdisk in kilobytes
13 # Don't allow interrupt signals
18 [ -x /modules/insmod ] && INSMOD="/modules/insmod"
21 [ -x /modules/rmmod ] && RMMOD="/modules/rmmod"
24 #BUILTIN_FS="iso9660 ext2 ext3 reiserfs vfat reiser4"
25 BUILTIN_FS="iso9660 ext2 vfat"
28 # Usage: mountit src dst "options"
29 # Uses builtin mount of ash.grml
30 for fs in $BUILTIN_FS; do
31 test -b $1 && mount -t $fs $3 $1 $2 >/dev/null 2>&1 && return 0
41 exec >/dev/console </dev/console 2>&1
43 # Mount /proc and /dev/pts
44 mount -t proc /proc /proc
46 # Disable kernel messages while probing modules in autodetect mode
47 echo "0" > /proc/sys/kernel/printk
49 mount -t devpts /dev/pts /dev/pts
51 mount -t sysfs /sys /sys >/dev/null 2>&1
53 # Read boot command line with builtin cat command (shell read function fails in Kernel 2.4.19-rc1)
54 CMDLINE="$(cat /proc/cmdline)"
58 case "$(cat $2)" in *$1*) return 0;; esac
64 case "$2" in *$1*) return 0;; esac
68 # Reread boot command line; echo last parameter's argument or return false.
70 stringinstring " $1=" "$CMDLINE" || return 1
71 result="${CMDLINE##*$1=}"
72 result="${result%%[ ]*}"
77 # Check boot commandline for specified option
79 stringinstring " $1" "$CMDLINE"
83 if checkbootparam "nocolor" ; then
84 echo "Disabling colors in bootsequence as requested on commandline."
88 # Erase to end of line
90 # Clear and reset Screen
96 # Erase to end of line
98 # Clear and reset Screen
102 # RED: Failure or error message
104 # GREEN: Success message
106 # YELLOW: Descriptions
108 # BLUE: System mesages
110 # MAGENTA: Found devices or drivers
118 # helper functions {{{
119 #log_success_msg () {
124 echo " ${RED}*${NORMAL} $@"
127 #log_warning_msg () {
128 # echo " ${BLUE}*${NORMAL} $@"
131 # int log_begin_message (char *message)
133 echo -n " ${GREEN}*${NORMAL} $@"
136 # int log_end_message (int exitstatus)
137 SUCCESS=" ${BLUE}[ ${GREEN}ok ${BLUE}]${NORMAL}"
138 FAILED=" ${NORMAL}[${RED}fail${NORMAL}]"
141 # Clear screen with colormode reset
142 # echo "$CLEAR$RESET"
144 # Just go to the top of the screen
148 #echo "${WHITE}Welcome to ${CYAN}G${YELLOW}R${WHITE}M${RED}L${WHITE}!${NORMAL}"
152 echo "${WHITE}Welcome to"
154 echo "${RED} ____ ____ __ __ _ "
155 echo "${RED} / ___| _ \| \/ | | "
156 echo "${RED} | | _| |_) | |\/| | | "
157 echo "${RED} | |_| | _ <| | | | |___ "
158 echo "${RED} \____|_| \_\_| |_|_____|"
160 echo "${WHITE}grml.org - Linux for users of texttools and sysadmins."
163 # We only need the builtin commands and /static at this point
169 # Check if we are in interactive startup mode
170 case "$CMDLINE" in *BOOT_IMAGE=expert\ *) INTERACTIVE="yes"; :>/interactive; ;; esac
171 case "$CMDLINE" in *modules-disk*) INTERACTIVE="yes"; ;; esac
172 #case "$CMDLINE" in *BOOT_IMAGE=debug\ *|*\ debug\ *) DEBUG="yes"; ;; esac
173 case "$CMDLINE" in *debug*) DEBUG="yes"; ;; esac
174 # Does the user want to skip scsi detection?
176 case "$CMDLINE" in *noscsi*|*nobootscsi*) NOSCSI="yes"; ;; esac
177 case "$CMDLINE" in *nousb*|*nobootusb*) NOUSB="yes"; ;; esac
178 case "$CMDLINE" in *nofirewire*|*nobootfirewire*) NOFIREWIRE="yes"; ;; esac
180 case "$CMDLINE" in *fromhd*) NOCD="yes"; ;; esac
181 case "$CMDLINE" in *fromdvd*) FROMDVD="yes"; ;; esac
182 case "$CMDLINE" in *idecd*|*atapicd*) IDECD="yes"; ;; esac
183 case "$CMDLINE" in *noideraid*) NOIDERAID="yes"; ;; esac
185 case "$CMDLINE" in *nousb2*) USB2=""; ;; esac
189 case "$CMDLINE" in *grml_dir=*) GRML_DIR="$grml_dir"; ;; esac
190 case "$CMDLINE" in *grml_name=*) GRML_NAME="$grml_name"; ;; esac
192 # WARNING: In Kernel 2.4.27, CD-Roms cease to work if both, ide-scsi and ide-cd, are loaded. :-(
193 #if test -n "$IDECD"; then
194 # Use ide-cd for ATAPI-only CD-Rom(s)
195 #$INSMOD /modules/scsi/ide-cd.ko >/dev/null 2>&1
196 #$INSMOD /modules/scsi/ide-cd.ko
198 # Check for IDE-SCSI capable CD-Rom(s) first
199 #$INSMOD /modules/scsi/ide-scsi.ko >/dev/null 2>&1
200 #$INSMOD /modules/scsi/ide-scsi.ko
203 # Run a shell if in debug mode
204 # echo "${BLUE}Dropping you to a busybox shell for debugging.${NORMAL}"
207 if [ -n "$DEBUG" ]; then
208 echo "${CRE}${BLUE}Starting intermediate shell stage $stage as requested by \"debug\" option.${NORMAL}"
209 echo "${CRE}${BLUE}Just exit the shell to continue boot process...${NORMAL}"
210 [ -x /static/sh ] && /static/sh || /bin/bash
217 echo -n "${CRE}Please insert ${TYPE} modules disk and hit Return."
219 echo -n "${CRE}Mounting ${TYPE} modules disk... "
220 # We always mount over /modules/scsi (because it's there ;-)
221 if mountit /dev/fd0 /modules/scsi "-o ro"; then
222 echo "${GREEN}OK.${NORMAL}"
225 echo "${RED}NOT FOUND.${NORMAL}"
229 # Unmount module disk
232 echo -n "${CRE}Unmounting ${TYPE} modules disk... "
233 umount /modules/scsi 2>/dev/null
234 echo "${GREEN}DONE.${NORMAL}"
237 # Ask user for modules
240 echo "${TYPE} modules available:${WHITE}"
241 c=""; for m in "$@"; do
242 if test -f "/modules/scsi/$m"; then
243 test -z "$c" && { echo -n " $m"; c="1"; } || { echo " $m"; c=""; }
246 [ -n "$c" ] && echo ""
247 echo "Load ${TYPE} Modules?"
248 echo "[Enter full filename(s) (space-separated), Return for autoprobe, n for none] "
249 echo -n "insmod module(s)> "
251 case "$MODULES" in n|N) MODULES=""; ;; y|"") MODULES="$*"; ;; esac
254 # Try to load the given modules (full path or current directory)
257 test -n "$INTERACTIVE" && echo "6" > /proc/sys/kernel/printk
259 echo -n "${CRE}Probing ${TYPE}... ${WHITE}$i${NORMAL}"
260 if test -f /modules/scsi/$i && $INSMOD -f /modules/scsi/$i >/dev/null 2>&1
262 # case "$i" in *ataraid*) ;; *) echo "${CRE} ${GREEN}Found ${TYPE} device(s) handled by ${MAGENTA}$i${GREEN}.${NORMAL}" ;; esac
263 case "$TYPE" in scsi|SCSI) FOUND_SCSI="yes"; ;; esac
266 test -n "$INTERACTIVE" && echo "0" > /proc/sys/kernel/printk
270 # Check for SCSI, use modules on bootfloppy first
271 # Trying to do kind of /proc/pci hardware detection
272 PROCPCI="`cat /proc/pci 2>/dev/null`"
273 #ISA_SCSI="aha1740.ko aha1542.ko aha152x.ko pas16.ko psi240i.ko qlogicfas.ko qlogicfc.ko seagate.ko t128.ko u14-34f.ko wd7000.ko"
274 ISA_SCSI="aha1740.o aha1542.o aha152x.o pas16.o psi240i.o qlogicfas.o qlogicfc.o seagate.o t128.o u14-34f.o wd7000.o"
275 SCSI_PROBE="$ISA_SCSI"
276 case "$PROCPCI" in *[Aa][Ii][Cc]-*|*[Aa][Hh][Aa]-*) SCSI_PROBE="$SCSI_PROBE aic7xxx.o" ;; esac
277 case "$PROCPCI" in *[Bb][Uu][Ss][Ll][Oo][Gg][Ii][Cc]*) SCSI_PROBE="$SCSI_PROBE BusLogic.ko" ;; esac
278 case "$PROCPCI" in *53[Cc]8*) SCSI_PROBE="$SCSI_PROBE ncr53c8xx.o" ;; esac
279 #case "$PROCPCI" in *53[Cc]9*) SCSI_PROBE="$SCSI_PROBE NCR53C9x.ko" ;; esac
280 case "$PROCPCI" in *53[Cc]406*) SCSI_PROBE="$SCSI_PROBE NCR53c406a.ko" ;; esac
281 case "$PROCPCI" in *[Ii][Nn][Ii][Tt][Ii][Oo]\ *|*[Ii][Nn][Ii]-[Aa]100[Uu]2[Ww]*) SCSI_PROBE="$SCSI_PROBE initio.ko" ;; esac
282 case "$PROCPCI" in *[Mm][Pp][Tt]*[Ss][Cc][Ss][Ii]*) SCSI_PROBE="$SCSI_PROBE mptscsih.ko" ;; esac
283 case "$PROCPCI" in *[Aa][Dd][Vv][Aa][Nn][Cc][Ee][Dd]\ [Ss][Yy][Ss]*) SCSI_PROBE="$SCSI_PROBE advansys.ko" ;; esac
284 case "$PROCPCI" in *[Aa][Tt][Pp]8|*[Aa][Ee][Cc]6*) SCSI_PROBE="$SCSI_PROBE atp870u.ko" ;; esac
285 case "$PROCPCI" in *[Dd][Tt][Cc]*) SCSI_PROBE="$SCSI_PROBE dtc.ko" ;; esac
286 case "$PROCPCI" in *[Ee][Aa][Tt][Aa]*) SCSI_PROBE="$SCSI_PROBE eata.ko" ;; esac
287 case "$PROCPCI" in *[Ff]*[Dd][Oo][Mm][Aa][Ii][Nn]*) SCSI_PROBE="$SCSI_PROBE fdomain.ko" ;; esac
288 case "$PROCPCI" in *[Gg][Dd][Tt]\ *) SCSI_PROBE="$SCSI_PROBE gdth.ko" ;; esac
289 case "$PROCPCI" in *[Mm][Ee][Gg][Aa][Rr][Aa][Ii][Dd]*) SCSI_PROBE="$SCSI_PROBE megaraid.ko" ;; esac
290 #case "$PROCPCI" in *[Pp][Cc][Ii]-22*) SCSI_PROBE="$SCSI_PROBE pci2220i.ko" ;; esac
291 #case "$PROCPCI" in *[Pp][Cc][Ii]-2000*) SCSI_PROBE="$SCSI_PROBE pci2000.ko" ;; esac
292 case "$PROCPCI" in *[Qq][Ll][Oo][Gg][Ii][Cc]*) SCSI_PROBE="$SCSI_PROBE qlogicisp.ko" ;; esac
293 case "$PROCPCI" in *53[Cc]974*) SCSI_PROBE="$SCSI_PROBE tmscsim.ko" ;; esac
294 case "$PROCPCI" in *[Uu][Ll][Tt][Rr][Aa][Ss][Tt][Oo][Rr]*) SCSI_PROBE="$SCSI_PROBE ultrastor.ko" ;; esac
295 case "$PROCPCI" in *3[Ww][Aa][Rr][Ee]*) SCSI_PROBE="$SCSI_PROBE 3w-xxxx.ko" ;; esac
296 # modules/scsi/3w-9xxx.ko
297 # modules/scsi/a100u2w.ko
298 # modules/scsi/aic7xxx_old_CAUTION.ko
300 if test -n "$INTERACTIVE"; then
301 # Let the user select interactively
302 askmodules SCSI $(cd /modules/scsi; echo *.ko)
304 # these are the autoprobe-safe modules
305 MODULES="$SCSI_PROBE"
308 test -z "$NOSCSI" && test -n "$MODULES" && loadmodules SCSI $MODULES
311 ## test -z "$NOSCSI" && \
312 if checkbootparam scsi ; then
313 MODULE="$(getbootparam 'scsi' 2>/dev/null)"
314 if test "$MODULE" = "probe" ; then
315 echo "Bootoption scsi=probe found. Trying to autoprobe SCSI modules:" && \
316 loadmodules SCSI $MODULES
318 [ -n "$MODULE" ] || echo "${RED}Neither a specific module nor option probe for SCSI module given. Skipping.${NORMAL}"
319 [ -n "$MODULE" ] && echo "Trying to load module ${WHITE}${MODULE}${NORMAL}." && \
320 /modules/insmod "/modules/scsi/${MODULE}.ko"
324 #if checkbootparam module ; then
325 # MODULE="$(getbootparam 'module' 2>/dev/null)"
326 # # ehci-hcd ieee1394 ohci1394 ohci-hcd sbp2 uhci-hcd usbcore usb-storage
327 # [ -n "$MODULE" ] && echo "${BLUE}Trying to load module ${MAGENTA}${MODULE}${BLUE}.${NORMAL}" && \
328 # /modules/insmod "/modules/div/${MODULE}.ko"
331 #test -z "$NOSCSI" && \
332 #/static/discover --disable-bus all --enable-bus scsi --type bridge --normalize-whitespace --data-path=linux/module/name --data-version=`uname -r` | grep -v '^ $' | uniq
334 #/static/discover --disable-bus all --enable-bus pci --type bridge --normalize-whitespace --data-path=linux/module/name --data-version=`uname -r` | grep -v '^ $' | uniq
335 #echo "End of Debugging SCSI"
337 #echo "Commands are:"
339 #/static/discover --disable-bus all --enable-bus scsi --type bridge --normalize-whitespace --data-path=linux/module/name --data-version=\`uname -r\` | grep -v '^ $' | uniq
340 #/static/discover --disable-bus all --enable-bus pci --type bridge --normalize-whitespace --data-path=linux/module/name --data-version=\`uname -r\` | grep -v '^ $' | uniq
342 #echo "Starting ash:"
344 #echo "End of starting ash"
346 # Check for IDE-Raid devices
347 if test -z "$NOIDERAID"; then
348 ( 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 )
350 # End of IDE-Raid check
352 # Check for USB, use modules on bootfloppy first
353 if test -z "$NOUSB"; then
354 echo -n "${CRE}Checking for for USB..."
355 if test -f /modules/div/usbcore.ko; then
356 $INSMOD /modules/div/usbcore.ko >/dev/null 2>&1
359 for i in $USB2 usb-uhci.ko usb-ohci.ko; do
360 test -f /modules/div/$i && $INSMOD /modules/div/$i >/dev/null 2>&1 && FOUNDUSB="yes"
362 if test -n "$FOUNDUSB"; then
363 test -f /modules/div/usb-storage.ko && $INSMOD /modules/div/usb-storage.ko >/dev/null 2>&1
365 # For an unknown reason, unloading usbcore hangs smetimes
366 # rmmod usbcore >/dev/null 2>&1
374 # Check for Firewire, use modules on bootfloppy first
375 if test -z "$NOFIREWIRE"; then
376 echo -n "${CRE}Checking for Firewire..."
377 if test -f /modules/div/ieee1394.ko; then
378 echo -n "${CRE}Loading ieee1394..."
379 $INSMOD /modules/div/ieee1394.ko >/dev/null 2>&1
381 for i in ohci1394.ko; do
382 echo -n "${CRE}Loading $i..."
383 test -f /modules/div/$i && $INSMOD /modules/div/$i >/dev/null 2>&1 && FOUNDFIREWIRE="yes"
385 if test -n "$FOUNDFIREWIRE"; then
386 echo -n "${CRE}Loading sbp2.ko..."
387 test -f /modules/scsi/sbp2.ko && $INSMOD /modules/scsi/sbp2.ko sbp2_serialize_io=1 >/dev/null 2>&1
389 # For an unknown reason, unloading ieee1394 hangs smetimes
390 # echo -n "${CRE}${BLUE}Unloading ieee1394...${NORMAL}"
391 # rmmod ieee1394 >/dev/null 2>&1
397 # End of FIREWIRE check
399 # Unfortunately, hotpluggable devices tend to need some time in order to register
400 if test -n "$FOUNDUSB" -o -n "$FOUNDFIREWIRE"; then
401 log_begin_msg "Scanning for USB/Firewire devices."
402 if test -n "$FOUNDFIREWIRE"; then
403 # Wait for driver to register
405 # Kernel 2.6 does this automatically
406 #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
412 # Check for misc modules in expert mode
413 if test -n "$INTERACTIVE"; then
414 another=""; answer=""
415 while test "$answer" != "n" -a "$answer" != "N"; do
416 echo -n "${CYAN}Do you want to load additional modules from$another floppy disk? [${WHITE}Y${CYAN}/n] ${NORMAL}"
419 case "$answer" in n*|N*) break; ;; esac
420 if mountmodules new; then
421 askmodules new $(cd /modules/scsi; echo *.ko)
422 test -n "$MODULES" && loadmodules new $MODULES
423 umountmodules current
427 # All interactively requested modules should be loaded now.
429 # Check for ide-scsi supported CD-Roms et al.
430 test -f /proc/scsi/scsi && FOUND_SCSI="yes"
432 # Disable kernel messages again
433 echo "0" > /proc/sys/kernel/printk
435 # We now enable DMA right here, for faster reading/writing from/to IDE devices
436 # in FROMHD or TORAM mode
437 case "$CMDLINE" in *\ nodma*) ;; *)
438 for d in $(cd /proc/ide 2>/dev/null && echo hd[a-z]); do
439 if test -d /proc/ide/$d; then
440 MODEL="$(cat /proc/ide/$d/model 2>/dev/null)"
441 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
442 log_begin_msg "Enabling DMA acceleration for: ${MAGENTA}$d ${YELLOW}[${MODEL}]${NORMAL}"
443 echo "using_dma:1" >/proc/ide/$d/settings && echo ""
452 for i in $cmdline; do case "$i" in nfsdir=*|NFSDIR=*) eval $i;; esac; done
453 [ -n "$nfsdir" ] && NFS="$nfsdir"
456 if [ -n "$NFS" ]; then
457 tmp_="$(getbootparam nfsdir)"
458 echo -n "checkbootparam nfsdir "
459 checkbootparam "nfsdir" && echo "OK" || echo "FAILED"
460 echo "getbootparam nfsdir=\"$tmp_\""
462 # put the mylibs into /lib for discover and udhcpc
465 # starting hw-detection for network card
466 echo "Starting hw-detection"
467 kernel_version_=`uname -r`
468 modules_to_load=$(/static/discover --disable-bus all --enable-bus pci --type network --normalize-whitespace --data-path=linux/module/name --data-version=$kernel_version_ | grep -v '^ $' | uniq)
469 echo "trying to load the following network modules: \"$modules_to_load\""
471 # FIXME modprobe is buggy from busybox
472 modules_to_load=`echo $modules_to_load | xargs`
476 tmp_="`modprobe -vn $mod`"
477 if [ $? -ne 0 ]; then
483 modLoad "$modules_to_load"
485 # loading additional modules
486 modLoad sunrpc lockd af_packet nfs
488 /static/udhcpc --foreground --quit --script=/static/udhcp-config.sh
489 #echo "press <enter> to start a system shell and configure your system"
492 # recreate the old dir structures
494 #rm -rf /myusr /mylib
496 log_begin_msg "${RED}Debug: NFS = ${NFS}${NORMAL}"
497 log_begin_msg -n "${CRE}${BLUE}Looking for GRML in: ${MAGENTA}$NFS${NORMAL} "
498 if mount -t nfs "$NFS" -o "async,ro,nolock" /cdrom #>/dev/null 2>&1
500 if test -f /cdrom/$GRML_DIR/$GRML_NAME
502 log_begin_msg -n "${CRE} ${GREEN}Accessing grml CDROM at ${MAGENTA}$NFS${GREEN}...${NORMAL}"
511 # Now that the right SCSI driver is (hopefully) loaded, try to find CD-ROM
512 if test -z $NFS ; then
514 test -n "$FOUND_SCSI" -a -z "$NOCD" && DEVICES="/dev/scd? /dev/scd?? $DEVICES"
515 # New: Also try parallel port CD-Roms [for Mike].
516 DEVICES="$DEVICES /dev/pcd?"
517 # New: also check HD partitions for a GRML/GRML image
518 test -n "$FOUND_SCSI" -a -z "$NOSCSI" && DEVICES="$DEVICES /dev/sd?[1-9] /dev/sd?[1-9][0-9]"
519 DEVICES="$DEVICES /dev/hd?[1-9] /dev/hd?[1-9][0-9]"
520 case "$CMDLINE" in *fromhd=/dev/*) DEVICES="$fromhd"; ;; esac
523 log_begin_msg "${CRE} ${GREEN}*${NORMAL} Looking for CD-ROM in: ${MAGENTA}$i${NORMAL}"
524 if mountit $i /cdrom "-o ro" >/dev/null 2>&1
527 if test -f /cdrom/$GRML_DIR/$GRML_NAME
529 log_begin_msg "Accessing grml CD-ROM at: ${MAGENTA}$i${NORMAL}" ; echo " $SUCCESS"
538 # Harddisk-installed script part version has been removed
539 # (GRML can be booted directly from HD now).
543 if test -n "$FOUND_GRML" -a -f $1/$GRML_DIR/$GRML_NAME; then
545 # echo "6" > /proc/sys/kernel/printk
547 #$INSMOD -f /modules/cloop.ko file=$1/$GRML_DIR/$GRML_NAME
548 #mountit /dev/cloop /GRML "-o ro" || FOUND_GRML=""
550 #losetup /dev/loop0 $1/$GRML_DIR/$GRML_NAME
551 mount -t squashfs $1/$GRML_DIR/$GRML_NAME /GRML -o loop,ro || FOUND_GRML=""
555 # case $(dd if=$1/$KNOPPIX_DIR/$KNOPPIX_NAME bs=4 count=1 2>/dev/null) in
557 # $INSMOD /modules/cloop.o file=$1/$KNOPPIX_DIR/$KNOPPIX_NAME
558 # mountit /dev/cloop /KNOPPIX "-o ro" || FOUND_KNOPPIX=""
560 # "hsqs") COMP=squashfs
561 # mount -t squashfs $1/$KNOPPIX_DIR/$KNOPPIX_NAME /KNOPPIX -o loop,ro || FOUND_KNOPPIX=""
562 # #losetup /dev/loop0 $1/$KNOPPIX_DIR/$KNOPPIX_NAME
563 # #mount -t squashfs /dev/loop0 /KNOPPIX -o loop,ro || FOUND_KNOPPIX=""
570 if test -f $TARGET/$GRML_DIR/$GRML_NAME; then
571 umount /GRML # unmount it
572 # echo "$RMMOD cloop" | /static/sh # release CD - ash crashes with parts of libc in memory -- FF
573 umount $SOURCE # unmount CD
574 [ -n "$SOURCE2" ] && umount $SOURCE2 # umount possible loop-device
577 echo "${CRE} ${RED}Warning: Changing to $TARGET failed.${NORMAL}"
589 SOURCE_DEV=$(echo $CMDLINE | /usr/bin/tr ' ' '\n' | /bin/sed -n '/bootfrom=/s/.*=//p' | /usr/bin/tail -1)
591 LOOP_DEV=$(echo $SOURCE_DEV | /usr/bin/gawk -F/ '{ print $1 "/" $2 "/" $3 }')
592 ISO_PATH=$(echo $SOURCE_DEV | /bin/sed "s|$LOOP_DEV||g" )
593 case "$ISO_PATH" in /*.[iI][sS][oO]) ;; *) ISO_PATH="" ;; esac
597 # /GRML/sbin/modprobe reiserfs
598 /GRML/sbin/modprobe reiser4
599 /GRML/sbin/modprobe ntfs # BE CAREFUL! - Only mount it read only! - FF
601 if [ -n "$ISO_PATH" ]
603 LOOP_SOURCE="$TARGET.loop"
604 LOOP_SOURCE2="$LOOP_SOURCE"
605 TARGET_DEV="$LOOP_SOURCE$ISO_PATH"
606 /bin/mkdir $LOOP_SOURCE
607 /GRML/sbin/modprobe loop
609 /bin/mount -o ro $LOOP_DEV $LOOP_SOURCE || LOOP_SOURCE=""
610 /bin/mount -n -o loop $LOOP_SOURCE2$ISO_PATH $TARGET
612 TARGET_DEV="$SOURCE_DEV"
613 /bin/mount -n -o ro $SOURCE_DEV $TARGET
617 [ -n "$LOOP_SOURCE" ] && /bin/umount $LOOP_SOURCE
618 echo -n "${CRE} ${RED}Accessing grml CD-ROM failed. ${MAGENTA}$TARGET_DEV${RED} is not mountable.${NORMAL}"
623 if [ -f $TARGET/$GRML_DIR/$GRML_NAME ]
625 log_begin_msg "Accessing grml CD-ROM at ${MAGENTA}$TARGET_DEV${NORMAL}." ; echo $SUCCESS
627 echo -n "${CRE} ${RED}Accessing grml CD-ROM failed. Could not find $GRML_DIR/$GRML_NAME on ${MAGENTA}$TARGET_DEV${RED}.${NORMAL}"
628 [ -n "$LOOP_SOURCE" ] && /bin/umount $LOOP_SOURCE
641 COPY="$SOURCE/$GRML_DIR"
643 # look if we copy to hd or to ram
644 SIZE="$(/usr/bin/du -s $COPY | /usr/bin/gawk '{print int($1*1.1)}')"
645 test -n "$SIZE" || SIZE="800000"
649 TARGET_DEV="/dev/shm"
650 TARGET_DEV_DESC="ramdisk"
651 FOUNDSPACE="$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)"
652 /bin/mount -n -t tmpfs -o size=${SIZE}k $TARGET_DEV $TARGET
655 TARGET_DEV=$(echo $CMDLINE | /usr/bin/tr ' ' '\n' | /bin/sed -n '/tohd=/s/.*=//p' | /usr/bin/tail -1)
656 TARGET_DEV_DESC="$TARGET_DEV"
658 # /GRML/sbin/modprobe reiserfs
659 # /GRML/sbin/modprobe jbd
660 # /GRML/sbin/modprobe ext3
661 /GRML/sbin/modprobe reiser4
662 BUILTIN_FS="iso9660 ext3 ext2 reiserfs reiser4 vfat"
663 # we need to use mountit to prevent NTFS to be mounted!
664 if mountit $TARGET_DEV $TARGET "-o rw"
668 echo -n "${CRE} ${RED}Copying grml CD-ROM failed. ${MAGENTA}$TARGET_DEV_DESC${RED} is not mountable.${NORMAL}"
672 # check for enough free space
674 [ -f $TARGET/$GRML_DIR/$GRML_NAME ] && USED_SPACE=$(/usr/bin/du -s $TARGET/$GRML_DIR/$GRML_NAME | /usr/bin/gawk '{ print $1 }')
675 FOUNDSPACE="$(/bin/df -k $TARGET | /usr/bin/tail -1 | /usr/bin/gawk '{ print $4+int('$USED_SPACE') }')"
684 if [ $FOUNDSPACE -lt $SIZE ]
686 echo -n "${CRE} ${RED}Copying grml CD-ROM failed. Not enough free space on ${MAGENTA}${TARGET_DEV_DESC}${RED}. Found: ${MAGENTA}${FOUNDSPACE}k${RED} Need: ${MAGENTA}${SIZE}k${RED} ${NORMAL}"
694 echo "${CRE} ${GREEN}Copying grml CD-ROM to ${MAGENTA}$TARGET_DEV_DESC${GREEN}... Please be patient. ${NORMAL}"
695 if [ -z "$use_cp" -a -x /usr/bin/rsync ]
697 # first cp the small files
698 /usr/bin/rsync -a --exclude="$GRML_DIR/$GRML_NAME" $COPY $TARGET # Copy grml to $TARGET
699 # then the big file with nice progress meter
700 [ -f $TARGET/$GRML_DIR/$GRML_NAME ] && /bin/rm -f $TARGET/$GRML_DIR/$GRML_NAME
701 /usr/bin/rsync -a --progress --include="$GRML_DIR/$GRML_NAME" --include="$GRML_DIR/" --exclude="*" $COPY $TARGET # Copy grml to $TARGET
702 #/usr/bin/rsync -avP $COPY $TARGET # Copy grml to $TARGET
704 /bin/cp -a -f $COPY $TARGET # Copy grml to $TARGET
708 echo -n "${CRE} ${RED}Copying grml CD-ROM failed. ${MAGENTA}$TARGET_DEV_DESC${RED} possibly has not enough space left.${NORMAL}"
713 /bin/mount -n -o remount,ro $TARGET_DEV $TARGET
725 case "$CMDLINE" in *toram*) DO_REMOUNT="yes"; COPYTO="ram"; ;; esac
726 case "$CMDLINE" in *tohd=*) DO_REMOUNT="yes"; COPYTO="hd"; ;; esac
727 case "$CMDLINE" in *bootfrom=*) DO_REMOUNT="yes"; BOOTFROM="yes" ;; esac
729 # Remount later after copying/isoloading/driverloading?
730 # pre-test if everything succeeded
731 if test -n "$DO_REMOUNT" -a -n "$FOUND_GRML"
734 cat /GRML/etc/ld.so.cache > /etc/ld.so.cache
740 # first test for possible hdboot/fromiso (which can be combined with toram / tohd)
741 if [ -n "$BOOTFROM" ]
746 # set new source / target paths
747 REAL_TARGET="$TARGET"
748 SOURCE2="$LOOP_SOURCE"
755 copy_to $COPYTO && REAL_TARGET="$TARGET"
759 # Final test if everything succeeded.
760 if test -n "$FOUND_GRML"
763 cat /GRML/etc/ld.so.cache > /etc/ld.so.cache
766 $INSMOD /modules/unionfs.ko 2>/dev/null && UNIONFS="yes"
768 # Enable kernel messages
769 echo "6" > /proc/sys/kernel/printk
772 log_begin_msg "Setting paths"
773 PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:."
777 /GRML/bin/cp -a /GRML/etc/alternatives /etc/ 2>/dev/null
780 /GRML/bin/rm -f /sbin
781 /GRML/bin/ln -sf /GRML/sbin /sbin
783 # From here, we should have all essential commands available.
786 # Did we remount the source media ?
787 if test -n "$REAL_TARGET";
789 /bin/mount -n --move $REAL_TARGET /cdrom # move it back and go on to normal boot
792 # Clean up /etc/mtab (and - just in case - make a nice entry for looped ISO)
793 egrep " /GRML | /cdrom " /proc/mounts 2>/dev/null | sed 's|/dev/loop0 /cdrom \(.*\) 0 0|'$LOOP_SOURCE$ISO_PATH' /cdrom/ \1,loop=/dev/loop0 0 0|g' >> /etc/mtab
796 rm -rf /modules /static
799 # New in Kernel 2.4.x: tempfs with variable ramdisk size.
800 # We check for available memory anyways and limit the ramdisks
801 # to a reasonable size.
802 FOUNDMEM="$(awk '/MemTotal/{print $2}' /proc/meminfo)"
803 TOTALMEM="$(awk 'BEGIN{m=0};/MemFree|Cached/{m+=$2};END{print m}' /proc/meminfo)"
806 log_begin_msg "Total memory found: $FOUNDMEM kB" ; echo " $SUCCESS"
808 # Now we need to use a little intuition for finding a ramdisk size
809 # that keeps us from running out of space, but still doesn't crash the
810 # machine due to lack of Ram
812 # Minimum size of additional ram partitions
814 # At least this much memory minus 30% should remain when home and var are full.
816 # Maximum ramdisk size
817 MAXSIZE="$(expr $TOTALMEM - $MINLEFT)"
818 # Default ramdisk size for ramdisk
819 RAMSIZE="$(expr $TOTALMEM / 5)"
820 RAMSIZE="$(expr $RAMSIZE \* 4)"
823 RAMSIZE="$(expr $RAMSIZE - 17400)"
825 # Create additional dynamic ramdisk.
826 test -z "$RAMSIZE" -o "$RAMSIZE" -lt "$MINSIZE" && RAMSIZE="$MINSIZE"
828 # tmpfs/varsize version, can use swap
829 log_begin_msg "Creating /ramdisk (dynamic size=${RAMSIZE}k) on shared memory"
830 # We need /bin/mount here for the -o size= option
831 /bin/mount -t tmpfs -o "size=${RAMSIZE}k" /ramdisk /ramdisk && echo "$SUCCESS"
832 mkdir -p /ramdisk/tmp /ramdisk/home/grml && chmod 1777 /ramdisk/tmp && chown grml.grml /ramdisk/home/grml && ln -snf /ramdisk/home /home && mv /tmp /tmp.old && ln -s /ramdisk/tmp /tmp && rm -rf /tmp.old
833 #/bin/mount -t tmpfs -o "size=${RAMSIZE}k" /ramdisk /ramdisk && mkdir -p /ramdisk/home /ramdisk/var && ln -s /ramdisk/home /ramdisk/var /
838 log_begin_msg "Creating unionfs and symlinks on ramdisk"
840 if test -n "$UNIONFS" && /bin/mount -t unionfs -o noatime,dirs=/ramdisk=rw:/GRML=ro /UNIONFS /UNIONFS; then
841 # We now have unionfs, copy some data from the initial ramdisk first
842 cp -a /etc/fstab /etc/auto.mnt /etc/filesystems /etc/mtab /UNIONFS/etc/
843 for i in bin boot etc sbin var lib opt root usr; do # Move directories to unionfs
846 /GRML/lib/ld-linux.so.2 --library-path /GRML/lib /GRML/bin/ln -snf /UNIONFS/$i /$i && \
849 ln -snf /UNIONFS/$i /$i
852 #echo "${GREEN}done${NORMAL}"
854 log_begin_msg "Merging read-only system with read-writeable /ramdisk."
855 for i in $(cd /UNIONFS; echo *); do # Create links for new stuff on /UNIONFS
856 test "$i" = "home" -o "$i" = "tmp" && continue
857 test -L "/$i" || test -d "/$i" || test -f "/$i" || ln -snf "/UNIONFS/$i" /$i
858 done && echo " $SUCCESS" || echo " $FAILED"
860 log_failure_msg "ERROR: CANNOT UNITE READ-ONLY MEDIA AND INITIAL RAMDISK!" ; echo "$FAILED"
862 /GRML/sbin/halt -f -n
865 chown grml.grml /home/grml
867 # Create empty utmp and wtmp
871 ## Make SURE that these are files, not links!
872 rm -rf /etc/ftpusers /etc/passwd /etc/shadow /etc/group \
873 /etc/ppp /etc/isdn /etc/ssh /etc/ioctl.save \
874 /etc/inittab /etc/network /etc/sudoers \
875 /etc/init /etc/localtime /etc/dhcpc /etc/pnm2ppa.conf 2>/dev/null
876 cp -a /GRML/etc/ftpusers /GRML/etc/passwd /GRML/etc/shadow /GRML/etc/group \
877 /GRML/etc/ppp /GRML/etc/isdn /GRML/etc/ssh \
878 /GRML/etc/inittab /GRML/etc/network /GRML/etc/sudoers \
879 /GRML/sbin/init /GRML/etc/dhcpc /etc/ 2>/dev/null
881 # Extremely important, init crashes on shutdown if this is only a link
884 # Must exist for samba to work
885 [ -d /var/lib/samba ] && :> /var/lib/samba/unexpected.tdb
886 # Diet libc bug workaround
887 # cp -f /GRML/etc/localtime /etc/localtime
888 # echo "${BLUE}Done.${NORMAL}"
890 # Now tell kernel where the real modprobe lives
891 echo "/sbin/modprobe" > /proc/sys/kernel/modprobe
893 # Change root device from /dev/fd0 to /dev/ram0
894 echo "0x100" > /proc/sys/kernel/real-root-dev
896 # umount /sys (remount in grml-autoconfig)
901 # Give control to the init process.
902 log_begin_msg "Starting init process."
907 echo "${CRE}${RED}Can't find grml filesystem, sorry.${NORMAL}"
908 echo "${RED}Dropping you to the busybox shell.${NORMAL}"
909 echo "${RED}Press reset button to quit.${NORMAL}"
911 #echo "Additional builtin commands avaliable:"
912 #echo " cat mount umount"
913 #echo " insmod rmmod lsmod"
917 echo "6" > /proc/sys/kernel/printk