diff options
Diffstat (limited to 'packages/altboot/files/altboot-menu/Advanced/80-copyrootfs')
-rw-r--r-- | packages/altboot/files/altboot-menu/Advanced/80-copyrootfs | 324 |
1 files changed, 324 insertions, 0 deletions
diff --git a/packages/altboot/files/altboot-menu/Advanced/80-copyrootfs b/packages/altboot/files/altboot-menu/Advanced/80-copyrootfs new file mode 100644 index 0000000000..1949f20b48 --- /dev/null +++ b/packages/altboot/files/altboot-menu/Advanced/80-copyrootfs @@ -0,0 +1,324 @@ +# !/bin/sh +M_TITLE="Copy rootfs to SD/CF" + + +die() { + echo "ERROR: $1" >/dev/tty0 + exec $SH_SHELL </dev/tty0 >/dev/tty0 2>&1 +} + +ask_target() { + available_disks="`mount | grep "/media" | grep -v ram | awk '{print $3}'`" + + if test -z "$available_disks" + then + die "No mounted targets found!" + fi + + cnt=1 + for d in $available_disks + do + echo -e "\t[$cnt] $d" + let cnt=$cnt+1 + done + + while test -z "$ROOTFS_TARGET" + do + echo -n "Target: " + read junk </dev/tty1 + + x=1 + for d in $available_disks + do + if test "$junk" = "$x" + then + ROOTFS_TARGET="$d" + break + fi + let x=$x+1 + done + + + done + + ROOTFS_TARGET_DEV="`mount | grep "$ROOTFS_TARGET " | awk '{print $1}'`" + ROOTFS_TARGET_FS="`mount | grep "$ROOTFS_TARGET " | awk '{print $5}'`" + + echo "Using [$ROOTFS_TARGET] on [$ROOTFS_TARGET_DEV] with [$ROOTFS_TARGET_FS] filesystem" +} + +ask_format() { + if test "$ROOTFS_TARGET_FS" != ext2 + then + echo -e "\nYou are not using the ext2 filesystem on your target.\nYou now have two choices:" + echo -e "\t[1] Reformat to ext2" + echo -e "\t[2] Use an image-file ontop of the existing filesystem" + + while true + do + echo -n "Your choice: " + read junk </dev/tty1 + + case "$junk" in + 1) ROOTFS_TARGET_TYPE="ext2" + break ;; + 2) ROOTFS_TARGET_TYPE="image" + break ;; + esac + done + + echo "Mode: [$ROOTFS_TARGET_TYPE]" + else + echo -e "\nYou are using the ext2 filesystem on your target.\nYou now have two choices:" + echo -e "\t[1] Install to the target directly" + echo -e "\t[2] Use an image-file ontop of the existing filesystem\n" + + while true + do + echo -n "Your choice: " + read junk </dev/tty1 + + case "$junk" in + 1) ROOTFS_TARGET_TYPE="direct" + break ;; + 2) ROOTFS_TARGET_TYPE="image" + break ;; + esac + done + + echo "Mode: [$ROOTFS_TARGET_TYPE]" + + fi +} + +ask_confirm() { + echo -e "\nYour choices are:" + echo -e "\tTarget:\t$ROOTFS_TARGET_DEV (currently mounted as $ROOTFS_TARGET)" + case "$ROOTFS_TARGET_TYPE" in + direct) echo -e "\tType:\t${C_RED}direct install, reformat if required${C_RESET}";; + image) echo -e "\tType:\tinstall into image-file";; + esac + + while true + do + echo -n "Continue? [y|n] " + read junk </dev/tty1 + + case "$junk" in + y) break ;; + n) exit 1 + esac + done +} + +direct_install() { + + format_target + + echo -n "Creating temporary directory..." + mkdir -p /media/temp && echo ok || die "mkdir -p /media/temp failed!" + + echo -n "Mounting [$ROOTFS_TARGET_DEV] as /media/temp..." + mount "$ROOTFS_TARGET_DEV" /media/temp && echo "ok" || die "mount "$ROOTFS_TARGET_DEV" /media/temp FAILED" + + copy_files +} + +format_target() { + echo -e "\n\nI'm about to format your target ($ROOTFS_TARGET_DEV) to the ext2 filesystem\n" + echo -e "${C_RED}YOU WILL LOSE ALL DATA ON YOUR TARGET IF YOU CONTINUE${C_RESET}\n" + + while true + do + echo -n "Continue? [y|n] " + read junk </dev/tty1 + + case "$junk" in + y) break ;; + n) die "User aborted mkfs" + break ;; + esac + done + + echo -n "Umounting $ROOTFS_TARGET_DEV..." + umount "$ROOTFS_TARGET_DEV" && echo "ok" || die "umount $ROOTFS_TARGET_DEV failed!" + + + echo "Formatting..." + /sbin/mkfs.ext2 -m0 "$ROOTFS_TARGET_DEV" && echo -e "\nmkfs.ext2 finished" || die "\nmkfs.ext2 FAILED" + } + +image_install() { + flash_size="` df -h | grep "/"$| awk '{print $3}'| sed s/M//`" + + echo -e "\nHow many MB do you want to configure for the image file?" + echo -e "It is generally a good idea to use 2.5x the used flash size ($flash_size)\n" + + while test -z "$ROOTFS_IMAGE_SIZE" + do + echo -n "Size in MegaBytes: " + read junk + + # test fails if $junk isn't a number + if test "$junk" -gt 0 >/dev/null 2>&1 + then + echo -n "Use [$junk]MB? [y|n] " + read junk2 + if test "$junk2" = y + then + ROOTFS_IMAGE_SIZE="$junk" + fi + fi + done + + echo -e "\nPlease enter a name for the image file." + echo "The name must _not_ contain whitespaces or the '-' sign." + + while test -z "$ROOTFS_IMAGE_NAME" + do + echo -n "File name: " + read junk + + if ! test -z "$junk" + then + echo -n "Use [$junk] as image name? [y|n] " + read junk2 + + if test "$junk2" = y + then + ROOTFS_IMAGE_NAME="$junk" + fi + fi + done + + echo -e "\nDo you want to format [$ROOTFS_TARGET_DEV] to the ext2 filesystem?" + + while true + do + echo -n "Format to ext2? [y|n] " + read junk + case "$junk" in + y) format_target + break ;; + n) break ;; + esac + done + + /etc/init.d/devices start + + echo -en "\nCreating image file [$ROOTFS_TARGET/$IMAGE_PATH/$ROOTFS_IMAGE_NAME-rootfs.bin] (${ROOTFS_IMAGE_SIZE}MB)..." + mkdir -p "$ROOTFS_TARGET/$IMAGE_PATH" + + dd if=/dev/zero of="$ROOTFS_TARGET/$IMAGE_PATH/$ROOTFS_IMAGE_NAME-rootfs.bin" bs=1024k count=$ROOTFS_IMAGE_SIZE >/dev/null 2>&1 && echo ok || die "FAILED" + losetup /dev/loop1 "$ROOTFS_TARGET/$IMAGE_PATH/$ROOTFS_IMAGE_NAME-rootfs.bin" + + echo -n "Creating filesystem..." + mkfs.ext2 -m0 /dev/loop1 >/dev/null 2>&1 && echo ok || die FAILED + + mkdir -p /media/temp + mount /dev/loop1 /media/temp || die "mount /dev/loop1 /media/temo FAILED!" + + copy_files + +} + +copy_files() { + echo -e "\nCopying files..." + + exclude_list="tmp sys proc var dev media root" + mkdir_list="var proc sys dev media/card media/cf /media/hdd" + + if (cat /etc/fstab | grep -q "/home") + then + echo "Note: /home appears to be mounted on a different flash partition: not copying /home" + exclude_list="$exclude_list home" + mkdir_list="$mkdir_list home/root" + + fi + + + + source_dirs="`ls -1 /`" + + echo -n "Excluding [" + for d in $exclude_list + do + echo -n "$d " + source_dirs="`echo "$source_dirs" | grep -v "$d"`" + done + echo "] from copy" + + + cd / + for dir in $source_dirs + do + if test -d "$dir" + then + echo -n "Copying [$dir]..." + cp -a $dir /media/temp && echo ok || echo FAILED + fi + done + + for dir in $mkdir_list + do + mkdir -p /media/temp/$dir + done + + rm /media/temp/etc/rcS.s/S39sd + +} +run_module() { + + test -e /etc/altboot.func && . /etc/altboot.func || die "ERROR: /etc/altboot.func not found. Check your installation!" + + echo -e "${C_RED}* * * * * WARNING * * * * *${C_RESET}" + echo -e "${C_RED}Continueing will delete the content of the selected target device.\nTHIS IS NO JOKE. If you do now know what this menu-item does, exit NOW${C_RESET}" + + mount -o remount,rw / + + while true + do + echo -en "\nContinue? [y|n] " + read junk </dev/tty1 + + if test "$junk" = n + then + exit 0 + fi + + if test "$junk" = y + then + break + fi + done + +# echo -n "Trying to activate PCMCIA..." +# cardmgr -o >/dev/null 2>&1 && echo ok || echo "FAILED" +# +# echo -n "Trying to mount SD card..." +# /etc/init.d/sd start >/dev/null 2>&1 +# sleep 3 +# /etc/sdcontrol insert >/dev/null 2>&1 && echo ok || echo "FAILED" + + #exit 0 + echo -e "\nPlease select the target device:" + + # Sets ROOTFS_TARGET* + ask_target + + # Sets ROOTFS_TARGET_TYPE ([direct | image] + ask_format + + # Ask confirmation + ask_confirm + + case "$ROOTFS_TARGET_TYPE" in + direct) direct_install;; + image) image_install;; + esac +} + +case "$1" in +title) echo "$M_TITLE";; +run) run_module;; +esac |