X-Git-Url: https://git.grml.org/?p=grml2usb.git;a=blobdiff_plain;f=grml2usb;h=3f5889b4189a44134ce3212f54858bee8f533110;hp=1a69cb4fa8b06f0bfaa226367f817dea47ae549f;hb=12aff0e9cd8510922d3e9393f431efb6e57342ff;hpb=cfd0cbc35a2f042d8de283e3c78c4baa7bc49454 diff --git a/grml2usb b/grml2usb index 1a69cb4..3f5889b 100755 --- a/grml2usb +++ b/grml2usb @@ -4,7 +4,7 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2. -# Latest change: Mit Okt 04 22:52:03 CEST 2006 [mika] +# Latest change: Sat Feb 23 23:43:52 CET 2008 [mika] ################################################################################ # colors {{{ @@ -21,27 +21,27 @@ # usercheck {{{ if ! [ -x "$(which syslinux)" ] ; then - echo 1>&2 "${RED}Error: syslinux is not available. Please install it before running this script.${NORMAL}" ; exit 2 + echo "${RED}Error: syslinux is not available. Please install it before running this script.${NORMAL}" >&2; exit 2 fi - if [ "$UID" != 0 ]; then - echo 1>&2 "${RED}Error: please run this script with uid 0 (root).${NORMAL}" ; exit 1 + if [ "$(id -u)" != 0 ]; then + echo "${RED}Error: please run this script with uid 0 (root).${NORMAL}" >&2 ; exit 1 fi # }}} # set variables {{{ - if [[ $DEBUG -gt 0 ]]; then -# set -x + if [ -n "$DEBUG" ]; then + # set -x debugit(){ echo $* } else debugit(){ - echo $* >/dev/null + echo >/dev/null } fi - if [ "$1" == "uninstall" ] ; then + if [ "$1" = "uninstall" ] ; then UNINSTALL=1 fi @@ -49,10 +49,11 @@ LANGUAGE='C' LC_ALL='C' PROGRAMNAME=${0##*/} - VERSION='0.6' + VERSION='0.9.0' ISO="$1" DEVICE="$2" - [ -n "$TMPMNT" ] || TMPMNT='/mnt/test' + + [ -n "$TMPMNT" ] || TMPMNT='/mnt/test/' [ -d "$TMPMNT" ] || mkdir -p $TMPMNT # }}} @@ -60,18 +61,18 @@ bailout(){ echo echo "Exiting - umounting /mnt/test and $DEVICE" - umount /mnt/test 2>/dev/null + umount $TMPMNT 2>/dev/null umount $DEVICE 2>/dev/null - exit 1 + exit 2 } usage() { - echo 1>&2 "${BLUE}$PROGRAMNAME $VERSION${NORMAL} - install grml-system to usb-device + echo 1>&2 "$PROGRAMNAME $VERSION - install grml-system to usb-device This program installs a grml-iso to an usb-device to be able to boot from usb. Make sure you have a grml-iso, syslinux (just run -'apt-get install syslinux' on debian-systems) and root access. +'apt-get install syslinux' on Debian-based systems) and root access. Usage: $PROGRAMNAME grml.iso /mount/point @@ -79,11 +80,14 @@ Usage: Notice: /mount/point is the mountpoint set up for your USB device in /etc/fstab /mount/point should not be mounted at the time running $PROGRAMNAME -Usage example - install grml-small to usb-device on /mnt/external1: - $PROGRAMNAME grml_small_0.2.iso /mnt/external1 +Usage example - install grml-small to usb-device on /mnt/usb-sdb1: + $PROGRAMNAME grml_1.1.iso /mnt/usb-sdb1 + +Usage example - install currently running grml to usb-device on /mnt/usb-sdb1: + $PROGRAMNAME /live/image /mnt/usb-sdb1 -Usage example - delete grml-installation from /mnt/external1: - $PROGRAMNAME uninstall /mnt/external1 +Usage example - delete grml-installation from /mnt/usb-sdb1: + $PROGRAMNAME uninstall /mnt/usb-sdb1 For more information take a look at http://wiki.grml.org/doku.php?id=usb Report bugs, send wishes and feedback to the grml team: @@ -95,36 +99,35 @@ notice(){ echo " Installing grml to $DEVICE should have been successful! -Tips: - - Use the usb cheatcode on bootprompt if you experience any problems with - booting grml via usb/firewire, so boot with 'grml scandelay' on bootprompt. - This adds a 'sleep' while trying to access the usb-stick and the module - should have enough time to access it. Using scandeleay=seconds is possible - as well, use 'grml scandelay=20' to wait 20 seconds before trying to access - the external device with grml on it. - - Also make sure you have tested all available modes of USB-boot in - the BIOS of your computer. Often found as USB-HDD, USB-FDD and - USB-ZIP in the bootmenu. - - Take a look at http://wiki.grml.org/doku.php?id=usb for more information." +Please take a look at http://wiki.grml.org/doku.php?id=usb +for more information or if you have problems with booting from usb." } info(){ - echo "${BLUE}$PROGRAMNAME ${VERSION}${NORMAL} - install grml-system to usb-device" + echo "$PROGRAMNAME ${VERSION} - install grml-system to usb-device" echo } vfat_warning(){ - echo "Warning: make sure that your usb-device is preformated with vfat. -If not please run it e.g. via: mkfs.vfat -F 16 -v /dev/sda1" - echo + DEV=$(echo ${DEVICE%/}) + TMPDEV=$(grep ${DEV} /etc/fstab | awk '{print $1}') + SYSDEV=$(echo ${TMPDEV%/}) + if [ -x /lib/udev/vol_id ] ; then + /lib/udev/vol_id $SYSDEV | grep -q 'FS_TYPE=vfat' || VFAT=1 + /lib/udev/vol_id $SYSDEV | grep -q 'ID_FS_VERSION=FAT16' || VFAT=1 + else + VFAT=1 + fi + if [ -n "$VFAT" ] ; then + echo 'WARNING: make sure that your usb-device is preformated with vfat.' + echo "Format your device (erases all data) via: mkfs.vfat -F 16 -v $SYSDEV" + echo + fi } mount_device(){ - if grep ${DEVICE} /proc/mounts ; then - echo echo 1>&2 "${WHITE}${DEVICE} already mounted${NORMAL}" + if grep -q ${DEVICE} /proc/mounts ; then + echo "Notice: ${WHITE}${DEVICE} already mounted - continuing anyway${NORMAL}" >&2 else echo -n "Mounting ${DEVICE}: " debugit "debug: mount $DEVICE" @@ -134,33 +137,84 @@ mount_device(){ mount_iso(){ echo -n "Mounting ${ISO} to ${TMPMNT}: " - debugit "debug: mount -o loop ${ISO} ${TMPMNT}" - if mount -o loop ${ISO} ${TMPMNT} ; then - echo "${WHITE}done${NORMAL}" + local mount_opts_="-o loop" + if [ -d $ISO ]; then + mount_opts_="--bind" + elif [ -b $ISO ]; then + mount_opts_="" + fi + debugit "debug: mount $mount_opts_ ${ISO} ${TMPMNT}" + if mount $mount_opts_ "${ISO}" ${TMPMNT} ; then + echo "${WHITE}done${NORMAL}" else - echo 1>&2 "${RED}Problem? You got an error saying 'mount: could not find any free loop device'? -Possible solution: losetup -d /dev/loop/0${NORMAL}" - exit 1 + echo "${RED}Problem? You got an error saying 'mount: could not find any free loop device'? +Possible solution: losetup -d /dev/loop/0${NORMAL}" >&2 + exit 3 fi } unmount(){ - echo -n "Unmounting ${DEVICE} and ${TMPMNT}." + echo -n "Unmounting ${DEVICE} and ${TMPMNT}: " umount ${TMPMNT} - umount ${DEVICE} + umount ${DEVICE} && echo "done" || echo "failed" } copyit(){ echo -n "Installing data from ${ISO} to ${DEVICE} (will take some time): " debugit "debug: cp -dR --preserve=mode,timestamps ${TMPMNT}/* ${DEVICE}" debugit "debug: mv ${DEVICE}/boot/isolinux/* ${DEVICE}/" + if cp -dR --preserve=mode,timestamps ${TMPMNT}/* ${DEVICE} ; then - echo "# filelist of $PROGRAMNAME on $(date) using $ISO on ${DEVICE}:" > $DEVICE/grml2hd.filelist - find ${TMPMNT} -type f | grep -v isolinux | sed 's#^/mnt/test/##' | tr A-Z a-z >> $DEVICE/grml2hd.filelist && \ - find ${DEVICE}/boot/isolinux -type f | sed 's#.*isolinux/##' | tr A-Z a-z >> $DEVICE/grml2hd.filelist && \ - mv ${DEVICE}/boot/isolinux/* ${DEVICE}/ && \ - rmdir ${DEVICE}/boot/isolinux && \ - rmdir ${DEVICE}/boot/ + echo "# filelist of $PROGRAMNAME on $(date) using $ISO on ${DEVICE}:" > $DEVICE/grml2usb.filelist + + find ${TMPMNT} -type f | sed "s#${TMPMNT}##" | \ + sed "s#boot/## ; s#isolinux/## ; s#.*initrd.gz#initrd.gz# ; s#.*linux26#linux26#" | \ + tr A-Z a-z >> $DEVICE/grml2usb.filelist + + # make sure we have a valid syslinux.cfg, if not use isolinux.cfg as base + if ! [ -f "${DEVICE}"/boot/isolinux/syslinux.cfg ] ; then + cp ${DEVICE}/boot/isolinux/isolinux.cfg ${DEVICE}/boot/isolinux/syslinux.cfg && \ + echo 'syslinux.cfg' >> $DEVICE/grml2usb.filelist + fi + + if mv ${DEVICE}/boot/isolinux/* ${DEVICE}/ ; then + rmdir ${DEVICE}/boot/isolinux + fi + echo boot >> $DEVICE/grml2usb.filelist + + if ! [ -r ${DEVICE}/live/filesystem.module ] ; then + GRML_NAME=grml + else + GRML_NAME=$(cat ${DEVICE}/live/filesystem.module) + GRML_NAME=${GRML_NAME%%.squashfs} + GRML_NAME="$(echo $GRML_NAME | tr -d ',./;\- ')" + fi + + KERNEL=$(find ${TMPMNT}/boot/ -maxdepth 2 -name linux26) + INITRD=$(find ${TMPMNT}/boot/ -maxdepth 2 -name initrd.gz) + + case $KERNEL in + */boot/${GRML_NAME}/linux26*) mv ${DEVICE}/boot/${GRML_NAME}/linux26 ${DEVICE}/ + ;; + esac + + case $INITRD in + */boot/${GRML_NAME}/initrd.gz*) mv ${DEVICE}/boot/${GRML_NAME}/initrd.gz ${DEVICE}/ + ;; + esac + + if [ -d "${DEVICE}"/boot/addons ] ; then + [ -d "${DEVICE}/addons" ] || mkdir ${DEVICE}/addons + mv ${DEVICE}/boot/addons/* ${DEVICE}/addons/ + fi + + if [ -d "${DEVICE}"/boot/grub ] ; then + [ -d "${DEVICE}/grub" ] || mkdir ${DEVICE}/grub + mv ${DEVICE}/boot/grub/* ${DEVICE}/grub/ + fi + + rmdir ${DEVICE}/boot 2>/dev/null + sync && echo "${WHITE}done${NORMAL}" else unmount @@ -174,8 +228,14 @@ run_syslinux(){ SYSDEV=$(echo ${TMPDEV%/}) echo -n "Running syslinux on ${SYSDEV}: " debugit "debug: syslinux ${SYSDEV}" - syslinux ${SYSDEV} && echo "${WHITE}done${NORMAL}" || echo 1>&2 "${RED}Problem when running syslinux? -Try to call it manually via 'syslinux /dev/sda1' if you installed grml to /dev/sda1'${NORMAL}" + + if syslinux ${SYSDEV} ; then + echo "${WHITE}done${NORMAL}" + else + echo "${RED}Problem when running syslinux?" >&2 + echo "Try to call it manually via 'syslinux $SYSDEV' if you installed grml to ${SYSDEV}${NORMAL}" >&2 + return 1 + fi } # }}} @@ -183,42 +243,64 @@ Try to call it manually via 'syslinux /dev/sda1' if you installed grml to /dev/s # main program {{{ trap bailout 1 2 3 15 -if [[ $# != 2 ]]; then - usage ; exit 1 +if [ "$#" != 2 ]; then + usage ; exit 4 fi if [ -n "$UNINSTALL" ] ; then - echo "${BLUE}$PROGRAMNAME - ${VERSION}" - echo "${BLUE}Uninstalling grml from ${DEVICE} based on ${DEVICE}/grml2hd.filelist.${NORMAL}" - if mount_device ; then - if [ -f ${DEVICE}/grml2hd.filelist ] ; then - for file in `cat $DEVICE/grml2hd.filelist | grep -v '^#'` ; do - echo -n "removing ${file} on ${DEVICE}: " - rm ${DEVICE}/${file} && echo "${WHITE}done${NORMAL}" || echo "${RED}error${NORMAL}" - done - echo -n "removing directory grml/images/ on ${DEVICE}: " - rmdir ${DEVICE}/grml/images/ && echo "${WHITE}done${NORMAL}" || echo "${RED}error${NORMAL}" - echo -n "removing directory grml/ on ${DEVICE}: " - rmdir ${DEVICE}/grml && echo "${WHITE}done${NORMAL}" || echo "${RED}error${NORMAL}" - echo -n "removing filelist grml2hd.filelist on ${DEVICE}: " - rm ${DEVICE}/grml2hd.filelist && echo "${WHITE}done${NORMAL}" || echo "${RED}error${NORMAL}" - echo -n "Unmounting ${DEVICE}:" - umount $DEVICE && echo "${WHITE}done${NORMAL}" || echo "${RED}error${NORMAL}" - else - echo 1>&2 "${RED}File ${DEVICE}/grml2hd.filelist not found. I have nothing to delete therefor. Exiting.${NORMAL}" + echo "$PROGRAMNAME - ${VERSION}" + echo + + echo -n "Are you sure you want to erase all grml related data on ${DEVICE}? [y/N] " + read a + if ! [ "$a" = 'y' -o "$a" = 'Y' ] ; then + echo "Exiting as requested." + exit 1 + fi + + echo "Uninstalling grml from ${DEVICE} based on ${DEVICE}/grml2usb.filelist${NORMAL}" + if mount_device ; then + if ! [ -f "${DEVICE}"/grml2usb.filelist ] ; then + echo "${RED}File ${DEVICE}/grml2usb.filelist not found." + echo "I have nothing to delete therefor. Exiting.${NORMAL}" + bailout + else + echo + for file in $(grep -v '^#' "${DEVICE}/grml2usb.filelist") ; do + if [ -f "${DEVICE}/${file}" ] ; then + echo -n "removing file ${file} on ${DEVICE}: " + rm ${DEVICE}/${file} && echo "${WHITE}done${NORMAL}" || echo "${RED}error${NORMAL}" + fi + done + + for dir in $(grep -v '^#' "${DEVICE}/grml2usb.filelist" | sed 's#/.*##' | sort -u) ; do + if [ -d "${DEVICE}/$dir" ] ; then + echo -n "removing directory ${dir} on ${DEVICE}: " + rmdir "${DEVICE}/${dir}"/* 2>/dev/null + rmdir "${DEVICE}/${dir}" && echo "${WHITE}done${NORMAL}" || echo "${RED}error${NORMAL}" + fi + done + + echo -n "removing filelist grml2usb.filelist on ${DEVICE}: " + rm ${DEVICE}/grml2usb.filelist && echo "${WHITE}done${NORMAL}" || echo "${RED}error${NORMAL}" + + echo + + echo -n "Unmounting ${DEVICE}: " + umount $DEVICE && echo "${WHITE}done${NORMAL}" || echo "${RED}error${NORMAL}" + fi fi - fi else - info - vfat_warning && \ - mount_iso && \ - mount_device && \ - copyit && \ - unmount && \ - run_syslinux && \ - notice + info + vfat_warning && \ + mount_iso && \ + mount_device && \ + copyit && \ + unmount && \ + run_syslinux && \ + notice fi # }}} ## END OF FILE ################################################################# -# vim:foldmethod=marker +# vim:foldmethod=marker ts=2 ft=sh ai expandtab sw=3