linux:restore_menu
no way to compare when less than two revisions
Differences
This shows you the differences between two versions of the page.
Previous revisionNext revision | |||
— | linux:restore_menu [2022/02/11 11:36] – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== [SCRIPT] RestoreMenu ====== | ||
+ | |||
+ | ====== Descripcion ====== | ||
+ | Ver el post del blog: http:// | ||
+ | |||
+ | ====== Acciones a realizar ====== | ||
+ | Instalar un sistema linux base con las siguientes dependencias: | ||
+ | * bash >= 4.0 | ||
+ | * sudo | ||
+ | * dd | ||
+ | * gzip/gunzip | ||
+ | * [[http:// | ||
+ | * acpi (comprobación de batería en portátil) | ||
+ | * dmidecode (revisamos el serial, el script hay que configurarlo cada vez) | ||
+ | * pigz (para proceso en paralelo) | ||
+ | |||
+ | |||
+ | ===== Pasos generales ===== | ||
+ | * Se particiona el disco. | ||
+ | * Instalamos windows | ||
+ | * Instalamos un linux " | ||
+ | * Añadimos nuestro script. | ||
+ | * Modificamos los parámetros de configuración necesarios en el mismo | ||
+ | * Creamos un usuario de sistema sin privilegios, | ||
+ | * Deshabilitamos la posibilidad de salir del script (//trap//) para evitar problemas. | ||
+ | * Nos guardamos el pass de root ;-) | ||
+ | * Modificamos grub para que el menú diga algo como Restore or similar y el usuario no se asuste viendo // | ||
+ | * Informar al usuario de como funciona el entorno, aunque es muy muy sencillo) | ||
+ | |||
+ | |||
+ | ===== Script ===== | ||
+ | ==== Codigo ==== | ||
+ | <file bash restore_menu.sh> | ||
+ | #!/bin/bash | ||
+ | |||
+ | # Coded by dodger | ||
+ | # More information on | ||
+ | # http:// | ||
+ | |||
+ | |||
+ | SNAPSHOTDIR=/ | ||
+ | WINDOWSDEV=/ | ||
+ | SERIAL=" | ||
+ | HOST=" | ||
+ | INITIAL_IMAGE=" | ||
+ | COMPRESSOR=/ | ||
+ | COMPRESSOPTIONS=" | ||
+ | UNCOMPRESSOR=/ | ||
+ | UNCOMPRESSOPTIONS=" | ||
+ | NTFSCLONE="/ | ||
+ | NTFSRESIZE="/ | ||
+ | |||
+ | |||
+ | # AUTOCONFIG | ||
+ | unset IMAGELIST | ||
+ | unset IMAGESIZE | ||
+ | |||
+ | [ ! -d ${SNAPSHOTDIR} ] && mkdir $SNAPSHOTDIR | ||
+ | |||
+ | |||
+ | trap_it() | ||
+ | { | ||
+ | [[ " | ||
+ | local TRAPIT=$(eval echo {1..${BASH_REMATCH[1]}}) | ||
+ | trap 'echo "NO PERMITIDO"' | ||
+ | } | ||
+ | |||
+ | print_main_menu() | ||
+ | { | ||
+ | |||
+ | local let OPTION=0 | ||
+ | clear | ||
+ | cat > /dev/stdout <<EOF | ||
+ | ################################################## | ||
+ | Menu de restauracion y copia de sistema | ||
+ | 1) Restauracion de imagen | ||
+ | 2) Generacion de Imagen | ||
+ | 3) Borrar imagen | ||
+ | 4) Lista las imagenes existentes y su tamanyo | ||
+ | 5) Ayuda | ||
+ | 99) Reinicio del sistema | ||
+ | ################################################## | ||
+ | EOF | ||
+ | while [[ ! $OPTION =~ ^([1-5]|99)$ ]] | ||
+ | do | ||
+ | [ ${OPTION: | ||
+ | printf " | ||
+ | read OPTION | ||
+ | OPTION=${OPTION: | ||
+ | [[ ! ${OPTION} =~ ^[0-9]{1,}$ ]] && OPTION=0 | ||
+ | done | ||
+ | return ${BASH_REMATCH[0]} | ||
+ | } | ||
+ | |||
+ | test() | ||
+ | { | ||
+ | |||
+ | local MENU=$1 | ||
+ | local let OPTION=0 | ||
+ | case $MENU in | ||
+ | " | ||
+ | |||
+ | ;; | ||
+ | " | ||
+ | ;; | ||
+ | " | ||
+ | ;; | ||
+ | * ) | ||
+ | ;; | ||
+ | esac | ||
+ | } | ||
+ | |||
+ | help() | ||
+ | { | ||
+ | clear | ||
+ | cat > /dev/stdout <<EOF | ||
+ | Este menu permite la restauracion de una copia de sistema anterior o | ||
+ | la generacion de una nueva copia. | ||
+ | Lo que se realiza es una copia integral del sistema windows o bien, | ||
+ | una restauracion de 0 del mismo tal como estaba en el momento de la copia. | ||
+ | Ya que el espacio es limitado, deberian revisarse las imágenes de sistema | ||
+ | existentes y eliminar las que no sean necesarias. | ||
+ | |||
+ | |||
+ | Las opciones de menu son las siguientes: | ||
+ | Opcion 1, dara opciones para la restauracion. | ||
+ | Opcion 2, dara opciones para la copia/ | ||
+ | Opcion 3, dara opciones para el borrado de imagenes existentes. | ||
+ | Opcion 99, reinicia el equipo. | ||
+ | |||
+ | Recuerde que la opcion 1 elimina todos los datos actuales del sistema windows, dejándolo como cuando se realizó la copia. | ||
+ | |||
+ | |||
+ | |||
+ | Presiona ENTER para continuar | ||
+ | EOF | ||
+ | read | ||
+ | } | ||
+ | |||
+ | reboot_machine() | ||
+ | { | ||
+ | echo " | ||
+ | sleep 2 | ||
+ | #exit 0 | ||
+ | shutdown -r now | ||
+ | } | ||
+ | |||
+ | list_images() | ||
+ | { | ||
+ | let x=0 | ||
+ | unset IMAGELIST | ||
+ | for i in ${SNAPSHOTDIR}/ | ||
+ | IMAGELIST[$x]=" | ||
+ | let x++ | ||
+ | done | ||
+ | } | ||
+ | |||
+ | list_image_size() | ||
+ | { | ||
+ | let x=0 | ||
+ | unset IMAGESIZE | ||
+ | for ((x=0; x< | ||
+ | IMAGESIZE[$x]=" | ||
+ | done | ||
+ | } | ||
+ | |||
+ | check_cable() | ||
+ | { | ||
+ | while [[ " | ||
+ | echo "Este proceso tardara MUCHO, es necesario conexion a la red electrica" | ||
+ | echo " | ||
+ | read | ||
+ | done | ||
+ | } | ||
+ | |||
+ | show_agree() | ||
+ | { | ||
+ | local YN=N | ||
+ | echo "##################################################" | ||
+ | echo "Este proceso no se puede parar, Estas seguro?" | ||
+ | printf " | ||
+ | read YN | ||
+ | [[ ! ${YN} =~ ^[yY]$ ]] && return 1 | ||
+ | return 0 | ||
+ | } | ||
+ | |||
+ | |||
+ | restore_clone_main() | ||
+ | { | ||
+ | local ACTION=$1 | ||
+ | local IMAGEFILE=$2 | ||
+ | local DDPID=0 | ||
+ | check_cable | ||
+ | show_agree | ||
+ | [ ! $? -eq 0 ] && return 1 | ||
+ | case " | ||
+ | " | ||
+ | ${NTFSCLONE} --save-image --output - ${WINDOWSDEV} | $COMPRESSOR $COMPRESSOPTIONS > ${IMAGEFILE} | ||
+ | ;; | ||
+ | " | ||
+ | $UNCOMPRESSOR $UNCOMPRESSOPTIONS $IMAGEFILE | ${NTFSCLONE} --restore-image --overwrite ${WINDOWSDEV} - | ||
+ | ;; | ||
+ | *) | ||
+ | echo " | ||
+ | return 1 | ||
+ | ;; | ||
+ | esac | ||
+ | |||
+ | echo " | ||
+ | read | ||
+ | return 0 | ||
+ | } | ||
+ | |||
+ | restore_menu() | ||
+ | { | ||
+ | local let OPTION=99 | ||
+ | local YN=n | ||
+ | clear | ||
+ | echo "##################################################" | ||
+ | echo "Menu de restauracion" | ||
+ | echo "Paso 1: Elegir imagen:" | ||
+ | list_images | ||
+ | for ((x=0; x< | ||
+ | echo "${x} ) ${IMAGELIST[$x]}" | ||
+ | done | ||
+ | echo -e " | ||
+ | while [ ${OPTION} = 99 ] | ||
+ | do | ||
+ | printf " | ||
+ | read OPTION | ||
+ | OPTION=${OPTION: | ||
+ | [ ${OPTION} -lt 0 ] || [ ${OPTION} -ge ${# | ||
+ | done | ||
+ | echo "##################################################" | ||
+ | echo "Paso 2: Restaurar imagen: ${IMAGELIST[$OPTION]}" | ||
+ | echo "La descripcion de la imagen es:" | ||
+ | cat ${SNAPSHOTDIR}/ | ||
+ | echo "Estas seguro?" | ||
+ | printf " | ||
+ | read YN | ||
+ | [[ ${YN} =~ ^[yY]$ ]] && restore_clone_main restore " | ||
+ | if [ $? -eq 0 ] ; then | ||
+ | echo "Es necesario reiniciar el Ordenador..." | ||
+ | sleep 2 | ||
+ | reboot_machine | ||
+ | fi | ||
+ | } | ||
+ | |||
+ | |||
+ | clone_menu() | ||
+ | { | ||
+ | MYDATE=" | ||
+ | local let OPTION=99 | ||
+ | local YN=n | ||
+ | local DESCRIPTION="" | ||
+ | local USEDSPACE=" | ||
+ | USEDSPACE=$(($USEDSPACE/ | ||
+ | local FREESPACE=" | ||
+ | clear | ||
+ | echo "##################################################" | ||
+ | echo "Menu de Clonado" | ||
+ | [ $USEDSPACE -gt $FREESPACE ] && echo "El espacio necesario es mayor que el libre, es necesario hacer espacio (borrar imagenes)" | ||
+ | while [[ ! $DESCRIPTION ]] ; do | ||
+ | echo " | ||
+ | printf " | ||
+ | read DESCRIPTION | ||
+ | echo " | ||
+ | done | ||
+ | restore_clone_main clone " | ||
+ | return 0 | ||
+ | } | ||
+ | |||
+ | delete_menu() | ||
+ | { | ||
+ | local let OPTION=98 | ||
+ | local YN=n | ||
+ | clear | ||
+ | list_images | ||
+ | list_image_size | ||
+ | [ ${# | ||
+ | echo "##################################################" | ||
+ | echo "Menu de Borrado" | ||
+ | echo "Paso 1: Elegir imagen para borrar:" | ||
+ | for ((x=0; x< | ||
+ | [[ ! " | ||
+ | done | ||
+ | echo -e " | ||
+ | while [ ${OPTION: | ||
+ | do | ||
+ | printf " | ||
+ | read OPTION | ||
+ | OPTION=${OPTION: | ||
+ | [ ${OPTION} -eq 99 ] && return 1 | ||
+ | [ ${OPTION} -lt 0 ] || [ ${OPTION} -gt ${# | ||
+ | done | ||
+ | echo "Estas seguro?" | ||
+ | printf " | ||
+ | read YN | ||
+ | if [[ ${YN} =~ ^[yY]$ ]] | ||
+ | then | ||
+ | echo " | ||
+ | if [[ ! " | ||
+ | then | ||
+ | rm -fv " | ||
+ | rm -fv " | ||
+ | fi | ||
+ | fi | ||
+ | } | ||
+ | |||
+ | list_menu() | ||
+ | { | ||
+ | local let OPTION=98 | ||
+ | local YN=n | ||
+ | clear | ||
+ | list_images | ||
+ | list_image_size | ||
+ | echo "##################################################" | ||
+ | echo "Lista de imagenes" | ||
+ | for ((x=0; x< | ||
+ | echo "$x ) Nombre: \" | ||
+ | done | ||
+ | echo "##################################################" | ||
+ | echo " | ||
+ | read | ||
+ | } | ||
+ | |||
+ | |||
+ | main() | ||
+ | { | ||
+ | trap_it | ||
+ | while true ; do | ||
+ | local let OPTION=0 | ||
+ | print_main_menu | ||
+ | OPTION=$? | ||
+ | case $OPTION in | ||
+ | 1) | ||
+ | restore_menu | ||
+ | ;; | ||
+ | 2) | ||
+ | clone_menu | ||
+ | ;; | ||
+ | 3) | ||
+ | delete_menu | ||
+ | ;; | ||
+ | 4) | ||
+ | list_menu | ||
+ | ;; | ||
+ | 5) | ||
+ | help | ||
+ | ;; | ||
+ | 99) | ||
+ | reboot_machine | ||
+ | ;; | ||
+ | *) | ||
+ | ;; | ||
+ | esac | ||
+ | done | ||
+ | } | ||
+ | |||
+ | main | ||
+ | </ | ||
+ | ==== Variables ==== | ||
+ | ^ Variable | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | |||
+ | ==== Ejemplo de Configuración restante ==== | ||
+ | === grub === | ||
+ | <file config menu.lst> | ||
+ | # general configuration: | ||
+ | timeout | ||
+ | default | ||
+ | color light-blue/ | ||
+ | |||
+ | # (0) Windows | ||
+ | title Windows | ||
+ | rootnoverify (hd0,0) | ||
+ | makeactive | ||
+ | chainloader +1 | ||
+ | |||
+ | |||
+ | # (1) Arch Linux | ||
+ | title Recovery Mode | ||
+ | root | ||
+ | kernel / | ||
+ | initrd / | ||
+ | </ | ||
+ | === .bashrc === | ||
+ | <file bash .bashrc> | ||
+ | # | ||
+ | # ~/.bashrc | ||
+ | # | ||
+ | sudo / | ||
+ | </ | ||
+ | === sudoers === | ||
+ | <file config sudoers> | ||
+ | username | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====== Troubleshooting ====== | ||
+ | ===== ntfsclone ===== | ||
+ | < | ||
+ | ERROR: $Bitmap size is smaller than expected | ||
+ | </ | ||
+ | Solución: | ||
+ | http:// | ||
linux/restore_menu.txt · Last modified: 2024/03/25 07:55 by dodger