Script para instalar System Rescue CD: Ayuda por favor

Muy buenas, no se si conocéis System Rescue CD, es una distribución Live pensada para hacer recuperaciones u operaciones de mantenimiento en un PC, está muy bien y la uso con bastante frecuencia, su página es www.sysresccd.org por si queréis saber más.

El caso es que esta distribución puede ser instalada en una unidad USB (en la página web hay un tutorial para hacerlo), y yo he intentado hacer un script para automatizar esta instalación, entre otras cosas porque estoy a ver si aprendo Bash ^_^

El script ha crecido más de lo que esperaba en un principio, hace ya mucho tiempo que no programo gran cosa y es el segundo script decente que hago en Bash, me gustaría que me dijérais, por favor, si vale la pena como para mandarlo como contribución al proyecto de System Rescue CD.

#!/bin/bash

#############################################################################
## Automatización de la instalación del System Rescue CD en una unidad USB ##
## Por Terseus el 28/01/2008 ##
#############################################################################

##### CHANGELOG #####
#-- v0.5.0.0208 05/02/08 --
## - Primera versión funcional.
#-- v0.6.2.0208 06/02/08 --
## - Añadidos varios parámetros:
## - -d [dev], --usb-device [dev]: Especifica el dispositivo de instalación.
## - --force-ms-sys: Fuerza a utilizar ms-sys -s en lugar de install-mbr.
## - --force-secure-syslinux: Fuerza a utilizar syslinux -s en lugar de syslinux.
## - --help: Muestra la ayuda y finaliza.
## - --version: Muestra la versión y finaliza.
## - Ahora no se continúa si el dispositivo de instalación está montado al ejecutar el script.
## - Ahora se comprueban todos los parámetros no básicos utilizados en el script.
#-- v0.6.7.0208
## - Añadida la funcionalidad de formatear el dispositivo de instalación.
## - Añadir colores para hacerlo más amigable.
## - Arreglado para que, en el archivo de log, haya un salto de línea entre cada copia de archivo.
## - Ahora comprueba que el sistema de archivos del dispositivo es FAT32 (cuando no se utilice --mount-bind).
## - Ahora comprueba que el dispositivo de instalación no sea la partición SWAP del sistema.

##### TODO #####
## - v0.6.2.0208) Comprobar todos los comandos necesarios al comenzar el script e informar de lo que hay que instalar en caso de que alguno falte.
## - v0.6.2.0208) Alternar entre install-mbr y ms-sys por medio de un parámetro.
## - v0.6.2.0208) Añadir un parámetro para forzar un dispositivo concreto, en caso de que falle en la autodetección.
## - v0.6.2.0208) Añadir una ayuda.
## - v0.6.7.0208) Añadir la funcionalidad de formatear el dispositivo de instalación.
## - v0.6.7.0208) Optimizar el cálculo del tamaño de la instalación (imposible optimizarlo).
## - v0.6.7.0208) Añadir colores para hacerlo más amigable.
## - v0.6.7.0208) Arreglarlo para que, en el archivo de log, haya un salto de línea entre cada copia de archivo.
## - v0.6.7.0208) Comprobar que el sistema de archivos del dispositivo es FAT32 (cuando no se utilice --mount-bind).
## - Aumentar la estabilidad del script en diversos tipos de sistemas linux.
## - Autodetectar el último dispositivo insertado.
## - Añadir (si fuera posible) un progreso durante la copia de archivos.
## - Añadir (si fuera posible) autocomplementación cuando el usuario introduce la ruta del archivo de imagen ISO.
## - Eliminar los archivos sobrantes de una instalación anterior al encontrar un log.
## - Añadir autodetección de las imágenes ISO del System Rescue CD en el directorio $HOME.
## - CANCELED) Añadir la funcionalidad de particionar una unidad USB; cancelado porque no parece propio de un script de instalación (el proceso es algo delicado y peligroso).
## - Añadir la funcionalidad de agregar archivos al System Rescue CD; esta tarea no es nada urgente porque al parecer utilizan la herramienta unsquashfs-lzma para hacer la imagen sysrcd.dat, herramienta que no es fácilmente accesible.

##############################################
## DECLARACIÓN DE LAS CONSTANTES DE COLORES ##
##############################################

## Colores de texto.
readonly TCNE="\033[0;30m" ## Negro
readonly TCRO="\033[0;31m" ## Rojo
readonly TCVE="\033[0;32m" ## Verde
readonly TCMA="\033[0;33m" ## Marrón
readonly TCAZ="\033[0;34m" ## Azul
readonly TCPU="\033[0;35m" ## Púrpura
readonly TCCY="\033[0;36m" ## Cyan
readonly TCGRC="\033[0;37m" ## Gris claro
readonly TCGRO="\033[1;30m" ## Gris oscuro
readonly TCROO="\033[1;31m" ## Rojo oscuro
readonly TCVEC="\033[1;32m" ## Verde claro
readonly TCAM="\033[1;33m" ## Amarillo
readonly TCAZC="\033[1;34m" ## Azul claro
readonly TCPUC="\033[1;35m" ## Púrpura claro
readonly TCCYC="\033[1;36m" ## Cyan claro
readonly TCBL="\033[1;37m" ## Blanco

## Colores de fondo.
readonly BGNE="\033[0;40m" ## Negro
readonly BGRO="\033[0;41m" ## Rojo
readonly BGVE="\033[0;42m" ## Verde
readonly BGMA="\033[0;43m" ## Marrón
readonly BGAZ="\033[0;44m" ## Azul
readonly BGPU="\033[0;45m" ## Púrpura
readonly BGCY="\033[0;46m" ## Cyan
readonly BGGRC="\033[0;47m" ## Gris claro
readonly BGGRO="\033[1;40m" ## Gris oscuro
readonly BGROO="\033[1;41m" ## Rojo oscuro
readonly BGVEC="\033[1;42m" ## Verde claro
readonly BGAM="\033[1;43m" ## Amarillo
readonly BGAZC="\033[1;44m" ## Azul claro
readonly BGPUC="\033[1;45m" ## Púrpura claro
readonly BGCYC="\033[1;46m" ## Cyan claro
readonly BGBL="\033[1;47m" ## Blanco

## Colores para propósitos específicos.
readonly TC=$TCGRC ## Texto normal.
readonly TCERR=$TCRO ## Errores.
readonly TCPARAM=$TCMA ## Parámetros.
readonly TCCOMM=$TCAZ ## Comandos.
readonly TCVAL=$TCVE ## Valores de un menú o valores a escribir... valores en general.
readonly TCEXIT=$TCGRC ## El color para antes de salir.

###############################
## DECLARACIÓN DE CONSTANTES ##
###############################

readonly ISO_PATH_DEFAULT="$HOME/systemrescuecd-x86-0.4.3.iso" ## La ruta por defecto de la imagen ISO.
readonly ISO_MOUNTPOINT_DEFAULT="/mnt/mksysresccd-iso" ## El punto de montaje por defecto de la imagen ISO.
readonly USB_MOUNTPOINT_DEFAULT="/mnt/mksysresccd-usb" ## El punto de montaje por defecto del dispositivo de instalación.
#readonly VERSION_NUMBER_REGEX="[0-9]\{1,5\}\(\.[0-9]\{1,5\}\)\{0,3\}" ## La expresión regular para extraer los números de versión de los comandos. Sin usar.
readonly VERSION=0.6.7.0208 ## El número de versión del programa.

##############################
## DECLARACIÓN DE FUNCIONES ##
##############################

## Función para sincronizar las unidades, llamada antes de leer las unidades.
my_sync () { echo -e -n "${TC}Sincronizando dispositivos... "; sync; echo -e "${TC}Hecho."; }

## Función para limpiar los puntos de montaje cuando sea necesario en las salidas.
## Recibe tres parámetros:
## - 1º Código de salida: El código de salida del script.
## - 2º Texto de salida: El texto que se mostrará al salir (0 si es vacío)
## - 3º Acciones: Lista de acciones, separadas por espacios, que debe hacer la función.
## Se aceptan las siguientes acciones:
## - umount_usb: Desmonta la unidad USB.
## - umount_iso: Desmonta la imagen ISO.
## - clean: Muestra los textos de "Limpiando... " y "Hecho."; cuando se use, esta acción debe ser la primera de la lista.
## - del_usb_mp: Borra el punto de montaje del dispositivo de instalación; cuando se use, el dispositivo debe estar desmontado.
## - del_iso_mp: Borra el punto de montaje de la imagen ISO; cuando se use, la imagen ISO debe estar desmontada.
my_exit ()
{
if ! [ -z "$2" ]; then echo -e "${TCERR}Error: ${TC}$2"; fi

for PARAM in $3; do
case $PARAM in
clean) echo -e -n "${TC}Limpiando... "; CANCEL=1 ;;
umount_usb)
if [ "$(cat /proc/mounts | grep "$USB_DEVICE")" -o "$MOUNT_BIND" ]; then umount "$USB_DEVICE"; fi ;;
umount_iso) if ! [ "$ISO_PREMOUNTED" ]; then if [ "$(cat /proc/mounts | grep "$ISO_MOUNTPOINT")" ]; then umount "$ISO_MOUNTPOINT"; fi; fi ;;
del_usb_mp) rm -rf "$USB_MOUNTPOINT" 2>/dev/null ;;
del_iso_mp) rm -rf "$ISO_MOUNTPOINT" 2>/dev/null ;;
esac
done

if [ "$CANCEL" ]; then echo -e "${TC}Hecho."; fi
echo -e -n "${TCEXIT}"
exit $1
}

## Función para comprobar un comando pasado como parámetro.
check_command () { if ! [ "$($1 2>/dev/null)" ]; then my_exit 1 "El comando ${TCCOMM}${1% *}${TC} no ha sido encontrado.\nEn algunas distribuciones se instala con el paquete ${TCCOMM}$2${TC}."; fi }

##############################
## DECLARACIÓN DE VARIABLES ##
##############################

STATUS=0 ## Estado de la lectura de parámetros.
USB_DEVICE="" ## La partición donde realizaremos la instalación.
USB_MOUNTPOINT="" ## El punto de montaje de la partición de destino.
ISO_PATH="" ## La ruta de la imagen ISO.
ISO_MOUNTPOINT="" ## El punto de montaje de la imagen ISO.
ISO_PREMOUNTED="" ## Indica si la imagen ISO ya estaba montada antes de ejecutar el script.

#########################
## CUERPO DEL PROGRAMA ##
#########################

#------------------------------
#-- OBTENCIÓN DE PARÁMETROS ---
#------------------------------

if [ "$#" -gt 0 ]; then
for PARAM in "$@"; do
case $STATUS in
0) ## Procesamos los parámetros simples y cambiamos STATUS para los parámetros múltiples.
case $PARAM in
-d|--usb-device) STATUS=1 ;;
--force-ms-sys) FORCE_MS_SYS=1 ;; ## Parámetro para forzar el uso de ms-sys
--force-secure-syslinux) FORCE_SECURE_SYSLINUX=1 ;; ## Parámetro para forzar el uso de syslinux -s
--mount-bind) MOUNT_BIND=1 ;; ## Parámetro para montar un directorio y hacer un test de la instalación.
--format-device) FORMAT_DEVICE=1 ;; ## Parámetro para formatear el dispositivo de instalación.
--help) ## Parámetro de ayuda.
echo -e "${TCAZC}mksysresccd version $VERSION${TC}"
echo -e "Este script instala el System Rescue CD en un disco USB.\nEl script no necesita parámetros pues funciona a través de menús, sin embargo\ntiene algunas opciones de uso que ayudan en situaciones específicas.\n\nParámetros aceptados:"
echo -e " ${TCPARAM}-d${TC} dev, ${TCPARAM}--usb-device${TC} dev\n\tEspecifica el dispositivo de instalación."
echo -e " ${TCPARAM}--force-ms-sys${TC}\n\tFuerza a utilizar ${TCCOMM}ms-sys -s${TC} en lugar de ${TCCOMM}install-mbr${TC}.\n\tUtilizarlo en caso de que haya problemas al utilizar ${TCCOMM}install-mbr${TC}."
echo -e " ${TCPARAM}--force-secure-syslinux${TC}\n\tFuerza a utilizar ${TCCOMM}syslinux -s${TC}, que instala una versión mucho más lenta,\n\tpero más segura, del arranque de la partición.\n\tUtilizarlo en caso de que haya problemas al utilizar ${TCCOMM}syslinux${TC}."
echo -e " ${TCPARAM}--mount-bind${TC}\n\tMonta un directorio como si fuera el dispositivo de instalación.\n\tEl dispositivo de instalación debe ser un directorio válido.\n\tEste parámetro es utilizado básicamente para testear."
echo -e " ${TCPARAM}--help${TC}\n\tMuestra este texto de ayuda y finaliza."
echo -e " ${TCPARAM}--version${TC}\n\tMuestra el número de versión y finaliza.${TCEXIT}"
my_exit 0
;;
--version) echo "mksysresccd version $VERSION"; my_exit 0 ;; ## El número de versión es revision_mayor.revision_menor.bugs_arreglados.mes_año
*) my_exit 1 "Parámetro desconocido: ${TCPARAM}$PARAM" ;;
esac
;;
1) USB_DEVICE=$PARAM; STATUS=0 ;; ## Parámetro del dispositivo del disco USB.
esac
done

#------------------------------------
#-- COMPROBACIÓN DE LOS PARÁMETROS --
#------------------------------------

## Comprobación del dispositivo de entrada.
if [ "$USB_DEVICE" ]; then
if [ "$MOUNT_BIND" ]; then
if ! [ -d "$USB_DEVICE" -a -w "$USB_DEVICE" ]; then my_exit 1 "${TCVAL}$USB_DEVICE${TC} no es un directorio válido.${TCEXIT}"; fi
else
if ! [ -b "$USB_DEVICE" -a -w "$USB_DEVICE" ]; then my_exit 1 "${TCVAL}$USB_DEVICE${TC} no es un dispositivo de bloques válido.${TCEXIT}"; fi
fi
fi
## Comprobación de que no haya parámetros en conflicto con --mount-bind.
if [ "$MOUNT_BIND" ]; then
if [ "$FORCE_MS_SYS" ]; then my_exit 1 "El parámetro ${TCPARAM}--mount-bind${TC} no puede combinarse con el parámetro ${TCPARAM}--force-ms-sys${TC}."; fi
if [ "$FORCE_SECURE_SYSLINUX" ]; then my_exit 1 "El parámetro ${TCPARAM}--mount-bind${TC} no puede combinarse con el parámetro ${TCPARAM}--force-secure-syslinux${TC}."; fi
if [ "$FORMAT_DEVICE" ]; then my_exit 1 "${TC}El parámetro ${TCPARAM}--mount-bind${TC} no puede combinarse con el parámetro ${TCPARAM}--format-device${TC}."; fi
fi
fi

## Comprobamos que STATUS sea correcto, de lo contrario falta parte de un parámetro.
if [ $STATUS -ne 0 ]; then my_exit 1 "Parámetro incompleto: ${TCPARAM}$PARAM${TC}"; fi

#----------------------------------------
#-- COMPROBACIONES BÁSICAS DEL SISTEMA --
#----------------------------------------

echo -e "${TC}Comprobando validez del sistema... "

## Comprobamos que seamos root.
if [ "$(whoami)" != root ]; then my_exit 1 "Necesitas ser root para realizar la instalación."; fi

## Comprobamos que el sistema contiene todos los archivos en /proc necesarios.
if ! [ "$USB_DEVICE" ]; then
if ! [ -e /proc/partitions ]; then my_exit 1 "El archivo ${TCVAL}/proc/partitions${TC} no existe o está corrupto."; fi
fi

if ! [ -e /proc/mounts ]; then my_exit 1 "El archivo ${TCVAL}/proc/mounts${TC} no existe o está corrupto."; fi

## Comprobamos que existan todos los comandos necesarios.
if ! [ "$MOUNT_BIND" ]; then
check_command "sync --version" "coreutils"
fi

if [ "$FORMAT_DEVICE" ]; then
check_command "mkdosfs" "dosfstools" ## mkdosfs no tiene un parámetro para imprimir sólo la versión! qué decepcionante.
fi

if [ "$FORCE_MS_SYS" ]; then
check_command "ms-sys --version" "ms-sys"
else
check_command "install-mbr --version" "mbr"
fi

check_command "mount --version" "mount"
check_command "vol_id --help" "e2fsprogs" ## vol_id no tiene un miserable parámetro para mostrar la versión...

echo "Hecho."

#------------------------------------------------------------
#-- ELECCIÓN Y COMPROBACIÓN DEL DISPOSITIVO DE INSTALACIÓN --
#------------------------------------------------------------

my_sync ## Sincronizamos los dispositivos.

## Mostramos el menú de las particiones disponibles.
if ! [ "$USB_DEVICE" ]; then
USB_DEVICE_LIST=$(cat /proc/partitions | awk '/[a-z][a-z][a-z][0-9]/ {print $4}')\ quit
echo -e "${TC}Elige la partición en la que quieres realizar la instalación.${TCVAL}"
PS3="$(tput setaf 7)Partición: " ## Aquí las variables de color no funcionan, así que nos vemos obligados a utilizar tput.
select USB_DEVICE in $USB_DEVICE_LIST; do
ENTRADA=""
if [ "$USB_DEVICE" == "quit" ]; then my_exit 0; fi
if [ "$USB_DEVICE" ]; then break; fi
done
USB_DEVICE=/dev/$USB_DEVICE
fi

my_sync ## Sincronizamos los dispositivos.

## Todas las comprobaciones del dispositivo de destino sobran si se utiliza la opción --mount-bind.
if ! [ "$MOUNT_BIND" ]; then
## Comprobamos que la partición no sea la SWAP del sistema.
if [ "$(cat /proc/swaps | grep "$USB_DEVICE")" ]; then my_exit 1 "El dispositivo ${TCVAL}$USB_DEVICE${TC} es la partición SWAP del sistema.\nDebes elegir otro dispositivo."; fi
## Comprobamos si la partición está montada.
## Primero comprobamos si lo han montado por el nombre del dispositivo, luego si lo han montado por el UUID del dispositivo.
AUX_MOUNTPOINT=$(cat /proc/mounts | grep -m 1 "$USB_DEVICE" | awk '{print $2}') ## Obtenemos el punto de montaje por el nombre del dispositivo.
if ! [ "$AUX_MOUNTPOINT" ]; then
#USB_DEVICE_UUID=$(ls -l /dev/disk/by-uuid | grep "$USB_DEVICE" | sed "s/.*:[0-9][0-9] //" | sed "s/ ->.*//") ## Obtenemos el UUID de la partición.
USB_DEVICE_UUID="$(vol_id -u $USB_DEVICE)" ## Obtenemos el UUID de la partición.
if [ "$USB_DEVICE_UUID" ]; then
AUX_MOUNTPOINT=$(cat /proc/mounts | grep -m 1 "$USB_DEVICE_UUID" | awk '{print $2}')
fi
fi

## Si la partición está montada, cancelamos.
if [ "$AUX_MOUNTPOINT" ]; then my_exit 1 "La unidad ${TCVAL}$USB_DEVICE${TC} está montada en ${TCVAL}$AUX_MOUNTPOINT${TC}\nDesmonta la partición y vuelve a ejecutar el script."; fi

if ! [ "$FORMAT_DEVICE" ]; then
## Comprobamos el formato de archivos del dispositivo.
if [ "$(vol_id -t $USB_DEVICE)" != "vfat" ]; then my_exit 1 "El dispositivo ${TCVAL}"$USB_DEVICE"${TC} está formateado como ${TCVAL}$(vol_id -t "$USB_DEVICE")${TC}.\nEs obligatorio que la unidad esté formateada como ${TCVAL}FAT32${TC} ó ${TCVAL}vfat${TC}.\nPrueba con ${TCPARAM}--format-device${TC}."; fi
fi
fi

if ! [ "$USB_MOUNTPOINT" ]; then USB_MOUNTPOINT="$USB_MOUNTPOINT_DEFAULT"; fi
## Nos aseguramos de que el punto de montaje por defecto no exista.
AUX_CONT=0
while [ -e "$USB_MOUNTPOINT" ]; do
USB_MOUNTPOINT="$USB_MOUNTPOINT.$AUX_CONT"
AUX_CONT=$(expr $AUX_CONT + 1)
done

#--------------------------------------------------------
#-- OBTENCIÓN Y COMPROBACIÓN DEL ARCHIVO DE IMAGEN ISO --
#--------------------------------------------------------

## Le pedimos al usuario la ruta del archivo ISO.
while [ -z "$ISO_PATH" ]; do
echo -e "${TC}Introduzca la ruta del archivo ISO.\nPara salir escriba ${TCVAL}quit${TC}.\nPara utilizar la ruta ${TCVAL}$ISO_PATH_DEFAULT${TC} dejarlo en blanco."
read ISO_PATH
if ! [ "$ISO_PATH" ]; then ISO_PATH="$ISO_PATH_DEFAULT"; fi
if [ "$ISO_PATH" == "quit" ]; then my_exit 0
elif [ "$(vol_id -t "$ISO_PATH" 2>/dev/null)" == "iso9660" -a "$(expr substr "$(vol_id -l "$ISO_PATH" 2>/dev/null)" 1 6)" == "sysrcd" ]; then break
else
echo -e "${TCERR}Error: ${TC}El archivo ${TCVAL}$ISO_PATH${TC} no es un archivo ISO válido."
unset ISO_PATH
fi
done

## Comprobamos si la imagen ISO está montada.
AUX_MOUNTPOINT="$(mount -l -t iso9660 | sed "s/.*${ISO_PATH##*/} on //" | sed "s/ type iso9660.*//")"
#echo "$AUX_MOUNTPOINT"
if [ "$AUX_MOUNTPOINT" ]; then
ISO_MOUNTPOINT="$AUX_MOUNTPOINT"
ISO_PREMOUNTED=1
else
if ! [ "$ISO_MOUNTPOINT" ]; then ISO_MOUNTPOINT="$ISO_MOUNTPOINT_DEFAULT"; fi
## Si la imagen no está montada, nos aseguramos de que el punto de montaje por defecto de la imagen ISO no exista.
AUX_CONT=0
while [ -e "$ISO_MOUNTPOINT" ]; do
ISO_MOUNTPOINT="$ISO_MOUNTPOINT.$AUX_CONT"
AUX_CONT=$(expr $AUX_CONT + 1)
done
fi

#-----------------------------------------
#-- PETICIÓN DE CONFIRMACIÓN AL USUARIO --
#-----------------------------------------

## Mostramos los datos finales y pedimos la confirmación del usuario.
ENTRADA=""
echo -e "${TC}Dispositivo de instalación: ${TCVAL}$USB_DEVICE"
echo -e "${TC}Punto de montaje de la partición de destino: ${TCVAL}$USB_MOUNTPOINT${TC} (desmontado)"
echo -e "${TC}Imagen ISO: ${TCVAL}$ISO_PATH"
echo -e -n "${TC}Punto de montaje de la imagen ISO: ${TCVAL}$ISO_MOUNTPOINT${TC} "
if [ "$ISO_PREMOUNTED" ]; then echo "(montado)"; else echo "(desmontado)"; fi
while [ -z "$ENTRADA" ]; do
echo -e -n "¿Desea continuar? (${TCVAL}s${TC}/${TCVAL}n${TC}) "
read ENTRADA
if ! [ "$ENTRADA" = "s" -o "$ENTRADA" = "n" ]; then
ENTRADA=""
fi
done

if [ "$ENTRADA" = "n" ]; then
my_exit 0
fi

######################################
## INSTALACIÓN DEL SYSTEM RESCUE CD ##
######################################

#------------------------------------------------------
#-- CREACIÓN Y COMPROBACIÓN DE LOS PUNTOS DE MONTAJE --
#------------------------------------------------------

my_sync ## Sincronizamos los dispositivos.

## Formateamos el dispositivo de instalación si se ha indicado por parámetro.
if [ "$FORMAT_DEVICE" ]; then
echo -e "${TC}Formateando ${TCVAL}$USB_DEVICE${TC}... "
mkdosfs -F 32 "$USB_DEVICE"
if [ $? -ne 0 ]; then my_exit 1 "Error al formatear el dispositivo ${TCVAL}$USB_DEVICE${TC}." "clean"; fi
echo "Hecho."
fi
## Creamos el punto de montaje y lo montamos.
mkdir "$USB_MOUNTPOINT"
## Comprobamos que el dispositivo USB se monte correctamente.
if [ "$MOUNT_BIND" ]; then mount --bind "$USB_DEVICE" "$USB_MOUNTPOINT"
else mount "$USB_DEVICE" "$USB_MOUNTPOINT"; fi
if [ $? -ne 0 ]; then my_exit 1 "Error al montar el dispositivo ${TCVAL}$USB_DEVICE${TC}." "clean del_usb_mp"; fi

## Si la imagen ISO no está montada, creamos el punto de montaje y la montamos.
if ! [ "$ISO_PREMOUNTED" ]; then
mkdir "$ISO_MOUNTPOINT"
## Comprobamos que la imagen ISO se monte correctamente.
mount -o loop -t iso9660 "$ISO_PATH" "$ISO_MOUNTPOINT"
if [ $? -ne 0 ]; then my_exit 1 "Error al montar la imagen ISO ${TCVAL}$ISO_PATH${TC}." "clean umount_usb del_usb_mp del_iso_mp"; fi
fi

#---------------------------------------------------------------------
#-- COMPROBACIÓN DEL ESPACIO LIBRE EN EL DISPOSITIVO DE INSTALACIÓN --
#---------------------------------------------------------------------

## Comprobamos que haya espacio suficiente en el disco para la copia.
## Para ello primero hallamos el espacio que gasta la instalación.
## También se podría hacer con un for en lugar de con ls, pero el ls es aproximadamente el doble de rápido.
AUX_SIZES=$(ls -l "$ISO_MOUNTPOINT/syslinux/syslinux.cfg" "$ISO_MOUNTPOINT/sysrcd.dat" "$ISO_MOUNTPOINT/isolinux/" "$ISO_MOUNTPOINT/bootdisk/" | awk '{print $5}')
INSTALL_SIZE=0
for SIZE in $AUX_SIZES; do
INSTALL_SIZE=$(expr $INSTALL_SIZE + $SIZE)
done

## Hallamos el espacio libre en la unidad USB.
FREE_USB_SIZE=$(expr $(stat -fc%f "$USB_MOUNTPOINT") \* $(stat -fc%S "$USB_MOUNTPOINT"))

## Comprobamos el espacio.
if [ $INSTALL_SIZE -gt $FREE_USB_SIZE ]; then my_exit 1 "No hay espacio suficiente para la instalación.\nNecesitas al menos ${TCVAL}$(expr $(expr $INSTALL_SIZE \/ 1048576) + 1)MB${TC} libres en el dispositivo de destino." "clean umount_usb umount_iso del_usb_mp del_iso_mp"; fi

#-------------------------------------------------------
#-- INSTALACIÓN Y MARCA DE ARRANQUE EN EL DISPOSITIVO --
#-------------------------------------------------------

echo -e "Copiando archivos necesarios... "

## Hacemos la instalación y guardamos todos los resultados.
LOG_DATA="$(cp -fv "$ISO_MOUNTPOINT/syslinux/syslinux.cfg" "$USB_MOUNTPOINT/")
$(cp -fv "$ISO_MOUNTPOINT/sysrcd.dat" "$USB_MOUNTPOINT/")
$(cp -Rfv "$ISO_MOUNTPOINT/isolinux/"* "$USB_MOUNTPOINT/")
$(cp -Rfv "$ISO_MOUNTPOINT/bootdisk" "$USB_MOUNTPOINT/")"

## Guardamos el log con los resultados, eliminando los puntos de montaje de todas las rutas.
## Para que sed acepte las / que hay en las rutas, hay que añadirle un \ lo que complica estas extracciones.
## Para que las coja bien primero las hemos sustituido por '\ /' y luego le hemos eliminado el espacio entre ambos caracteres.
## Es la forma más sencilla que he encontrado para conseguirlo, si alguien pudiese hacerlo de un modo más simple sería genial ^_^
echo "$LOG_DATA" | sed "s/\`$(echo $USB_MOUNTPOINT | sed "s/\//\\\ \//g" | sed "s/ //g")//g" | sed "s/\`$(echo $ISO_MOUNTPOINT | sed "s/\//\\\ \//g" | sed "s/ //g")//g" | sed "s/'//g" > "$USB_MOUNTPOINT/mksysresccd.log"

## Desmontamos la unidad.
umount "$USB_DEVICE"

echo "Hecho."

## Si se usa la opción --mount-bind no hacemos arrancable la unidad (evidentemente).
if ! [ "$MOUNT_BIND" ]; then
## Hacemos arrancable a la unidad.
## Escribimos el boot record en el dispositivo.
echo "Haciendo unidad arrancable... "
if [ "$FORCE_SECURE_SYSLINUX" ]; then syslinux -s $USB_DEVICE
else syslinux $USB_DEVICE
fi

## Escribimos un nuevo MBR en el disco del dispositivo de instalación.
if [ "$FORCE_MS_SYS" ]; then ms-sys -s ${USB_DEVICE%[0-9]}
else install-mbr ${USB_DEVICE%[0-9]}
fi

echo "Hecho."
fi

my_sync ## Sincronizamos los discos antes de terminar.

echo "Instalación completada."

my_exit 0 "" "umount_usb umount_iso del_usb_mp del_iso_mp"
############################### FIN DEL SCRIPT ###############################

Sé que sobra código, como las variables de colores que no se utilizan, pero todavía no está completamente terminado (aunque no le falta mucho ^_^).

Ahí queda eso, por favor decidme vuestras opiniones, y si alguien lo testea y le falla le agradecería que me pegara aquí los mensajes de error que le aparezcan (sólo lo he probado en mi sistema), también se agradecen todo tipo de ideas que aportar al script.

Gracias por no reiros xD

PD.: Siento no ponerlo como código pero la etiqueta se quita con cada línea vacía.
PD2.: Si alguien prefiere que le envíe el código por correo, que lo pida.