User Tools

Site Tools


linux:restore_menu

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
linux:restore_menu [2018/04/17 09:06] dodgerlinux:restore_menu [2024/03/25 07:54] dodger
Line 1: Line 1:
-====== [Script] RestoreMenu ======+====== [SCRIPT] RestoreMenu ======
  
-====== Descripcion ====== 
-Ver el post del blog: http://blog.ciberterminal.net/index.php/2012/01/20/script-de-copia-y-restauracion-de-un-sistema-windows 
  
-====== Acciones a realizar ====== 
-Instalar un sistema linux base con las siguientes dependencias: 
-  * bash >= 4.0 
-  * sudo 
-  * dd 
-  * gzip/gunzip 
-  * [[http://www.tuxera.com/community/ntfs-3g-download/|ntfsprogs]] 
-  * 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) 
  
 +https://www.bashcookbook.com/bashinfo/
  
-===== Pasos generales ===== 
-  * Se particiona el disco. 
-  * Instalamos windows 
-  * Instalamos un linux "minimal", y dependencias necesarias para que el script funcione 
-  * Añadimos nuestro script. 
-  * Modificamos los parámetros de configuración necesarios en el mismo 
-  * Creamos un usuario de sistema sin privilegios, modificamos //~/.bashrc// para lanzar automáticamente el script cuando se logue el usuario. 
-  * 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 //GNU/Linux// 
-  * 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://blog.ciberterminal.net/index.php/2012/01/20/script-de-copia-y-restauracion-de-un-sistema-windows 
- 
- 
-SNAPSHOTDIR=/home/snapshots 
-WINDOWSDEV=/dev/sda1 
-SERIAL="serialnumber" 
-HOST="hostname" 
-INITIAL_IMAGE="INITIAL-IMAGE_20120119-115923_mar-eee.img.gz" 
-COMPRESSOR=/usr/bin/pigz 
-COMPRESSOPTIONS="-9fc" 
-UNCOMPRESSOR=/bin/gunzip 
-UNCOMPRESSOPTIONS="-dc" 
-NTFSCLONE="/root/ntfs-3g_ntfsprogs-2011.4.12/ntfsprogs/ntfsclone" 
-NTFSRESIZE="/root/ntfs-3g_ntfsprogs-2011.4.12/ntfsprogs/ntfsresize" 
- 
- 
-# AUTOCONFIG 
-unset IMAGELIST 
-unset IMAGESIZE 
- 
-[ ! -d ${SNAPSHOTDIR} ] && mkdir $SNAPSHOTDIR 
- 
- 
-trap_it() 
-{ 
- [[ "$(kill -l | tail -1 | tr '+' '-')" =~ ([0-9]{1,})\)[[:space:]]{1,}[A-Z0-9\-]{3,15}(.|)$ ]] 
- local TRAPIT=$(eval echo {1..${BASH_REMATCH[1]}}) 
- trap 'echo "NO PERMITIDO"' ${TRAPIT} 
-} 
- 
-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:-0} -ne 0 ] && echo "Seleccion erronea" 
- printf "%s" "->  " 
- read OPTION 
- OPTION=${OPTION:-98} 
- [[ ! ${OPTION} =~ ^[0-9]{1,}$ ]] && OPTION=0 
- done 
- return ${BASH_REMATCH[0]} 
-} 
- 
-test() 
-{ 
-  
- local MENU=$1 
- local let OPTION=0 
- case $MENU in 
- "main" ) 
- 
- ;; 
- "restore" ) 
- ;; 
- "clone" ) 
- ;; 
- * ) 
- ;; 
- 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/clonado. 
-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 "Reiniciando..." 
- sleep 2 
- #exit 0 
- shutdown -r now 
-} 
- 
-list_images() 
-{ 
- let x=0 
- unset IMAGELIST 
- for i in ${SNAPSHOTDIR}/*img.gz ; do 
- IMAGELIST[$x]="$(basename $i)" 
- let x++ 
- done 
-} 
- 
-list_image_size() 
-{ 
- let x=0 
- unset IMAGESIZE 
- for ((x=0; x<${#IMAGELIST[@]} ; x++)) ; do 
- IMAGESIZE[$x]="$(($(stat --format=%s ${SNAPSHOTDIR}/${IMAGELIST[$x]})/1024/1024))" 
- done 
-} 
- 
-check_cable() 
-{ 
- while [[ "$(acpi | egrep -i "Discharging")" ]] ; do 
- echo "Este proceso tardara MUCHO, es necesario conexion a la red electrica" 
- echo "Presione ENTER cuando este conectado" 
- read 
- done 
-} 
- 
-show_agree() 
-{ 
- local YN=N 
- echo "##################################################" 
- echo "Este proceso no se puede parar, Estas seguro?" 
- printf "%s" "(y/N)->  " 
- 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 "$ACTION" in 
- "clone") 
- ${NTFSCLONE} --save-image --output - ${WINDOWSDEV} | $COMPRESSOR $COMPRESSOPTIONS > ${IMAGEFILE} 
- ;; 
- "restore") 
- $UNCOMPRESSOR $UNCOMPRESSOPTIONS $IMAGEFILE | ${NTFSCLONE} --restore-image --overwrite ${WINDOWSDEV} -  
- ;; 
- *) 
- echo "Error, REPORT" 
- return 1 
- ;; 
- esac 
- 
- echo "Completado, Pulse ENTER para continuar" 
- 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<${#IMAGELIST[*]} ; x++)) ; do 
- echo "${x} ) ${IMAGELIST[$x]}" 
- done 
- echo -e "\nIntroduce el numero de imagen a restaurar" 
- while [ ${OPTION} = 99 ] 
- do 
- printf "%s" "->  " 
- read OPTION 
- OPTION=${OPTION:-99} 
- [ ${OPTION} -lt 0 ]  || [ ${OPTION} -ge ${#IMAGELIST[*]} ] || [[ ! ${OPTION} =~ ^[0-9]{1,}$ ]] && OPTION=99 
- done 
- echo "##################################################" 
- echo "Paso 2: Restaurar imagen: ${IMAGELIST[$OPTION]}" 
- echo "La descripcion de la imagen es:" 
- cat ${SNAPSHOTDIR}/$(basename ${IMAGELIST[$OPTION]} .img.gz).description 
- echo "Estas seguro?" 
- printf "%s" "(y/N)->  " 
- read YN 
- [[ ${YN} =~ ^[yY]$ ]] && restore_clone_main restore "${SNAPSHOTDIR}/${IMAGELIST[$OPTION]}" 
- if [ $? -eq 0 ] ; then 
- echo "Es necesario reiniciar el Ordenador..." 
- sleep 2 
- reboot_machine 
- fi 
-} 
- 
-  
-clone_menu() 
-{ 
- MYDATE="$(date +%Y%m%d-%H%M%S)" 
- local let OPTION=99 
- local YN=n 
- local DESCRIPTION="" 
- local USEDSPACE="$(${NTFSRESIZE} -i --no-action ${WINDOWSDEV} 2>&1 | grep "freeing" | awk '{print $5}')" 
- USEDSPACE=$(($USEDSPACE/1024/2)) 
- local FREESPACE="$(df -P ${SNAPSHOTDIR} | grep "%" | awk '{print $4}')" 
- clear 
- echo "##################################################" 
- echo "Menu de Clonado" 
- [ $USEDSPACE -gt $FREESPACE ] && echo "El espacio necesario es mayor que el libre, es necesario hacer espacio (borrar imagenes)" && return 1 
- while [[ ! $DESCRIPTION ]] ; do 
- echo "Introduce una descripcion para la imagen y pulsa ENTER" 
- printf "%s" "->  " 
- read DESCRIPTION 
- echo "${DESCRIPTION}" > "${SNAPSHOTDIR}/${MYDATE}_${HOST}.description" 
- done 
- restore_clone_main clone "${SNAPSHOTDIR}/${MYDATE}_${HOST}.img.gz" 
- return 0 
-} 
-  
-delete_menu() 
-{ 
- local let OPTION=98 
- local YN=n 
- clear 
- list_images 
- list_image_size 
- [ ${#IMAGELIST[@]} -eq 1 ] && echo -e "No hay imagenes que borrar,\nPresione ENTER" && read && return 0 
- echo "##################################################" 
- echo "Menu de Borrado" 
- echo "Paso 1: Elegir imagen para borrar:" 
- for ((x=0; x<${#IMAGELIST[@]} ; x++)) ; do 
- [[ ! "${IMAGELIST[$x]}" =~ ^${INITIAL_IMAGE}$ ]] && echo "$x ) \"${IMAGELIST[$x]}\" , Tamaño : ${IMAGESIZE[$x]} MB" 
- done 
- echo -e "\nIntroduce el numero de imagen a eliminar o 99 para salir" 
- while [ ${OPTION:-98} = 98 ] 
- do 
- printf "%s" "->  " 
- read OPTION 
- OPTION=${OPTION:-98} 
- [ ${OPTION} -eq 99 ] && return 1 
- [ ${OPTION} -lt 0 ]  || [ ${OPTION} -gt ${#IMAGELIST[*]} ] || [[ ! ${OPTION} =~ ^[0-9]{1,}$ ]] && OPTION=98 
- done 
- echo "Estas seguro?" 
- printf "%s" "(y/N)->  " 
- read YN 
- if [[ ${YN} =~ ^[yY]$ ]] 
- then  
- echo "Borrando ${IMAGELIST[$OPTION]}" 
- if [[ ! "${IMAGELIST[$OPTION]}" =~ ^${INITIAL_IMAGE}$ ]] 
- then 
- rm -fv "${SNAPSHOTDIR}/${IMAGELIST[$OPTION]}" 
- rm -fv "${SNAPSHOTDIR}/$(basename ${IMAGELIST[$OPTION]} .img.gz).description" 
- 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<${#IMAGELIST[@]} ; x++)) ; do 
- echo "$x ) Nombre: \"${IMAGELIST[$x]}\" , Tamaño : ${IMAGESIZE[$x]} MB" 
- done 
- echo "##################################################" 
- echo "Presiona ENTER para continuar" 
- 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 
-</file> 
-==== Variables ==== 
-^ Variable     ^ Valor por defecto ^ Descripcion ^ 
-| ''SNAPSHOTDIR'' | ''/home/snapshots'' | Directorio donde se almacenarán los snapshots y descripciones | 
-| ''WINDOWSDEV'' | ''/dev/sda1'' | Partición que contiene Windows | 
-| ''SERIAL'' | ''"8BOAAQ256174"'' | El nº de serie del equipo, se puede ver con la dependencia ''dmidecode'' | 
-| ''HOST'' | ''"my-hostname"'' | Nombre del host, únicamente se usa para generar un nombre de imagen | 
-| ''COMPRESSOR'' | ''/usr/bin/pigz'' | Comando usado para comprimir, en este caso [[http://blog.ciberterminal.net/index.php/2011/11/15/ciclo-herramientas-gnulinux-v-pbzip2/|pigz]] para aprovechar los procesadores multi-core. | 
-| ''COMPRESSOPTIONS'' | ''"-9fc"'' | Opciones para la compresión | 
-| ''UNCOMPRESSOR'' | ''/bin/gunzip'' | Ídem pero para descomprimir | 
-| ''UNCOMPRESSOPTIONS'' | ''"-dc"'' | Opciones para la descompresión | 
-| ''NTFSCLONE'' | ''"/root/ntfs-3g_ntfsprogs-2011.4.12/ntfsprogs/ntfsclone"'' | Donde está el binario de ntfsclone, a veces puede ser necesario compilar (ver [[restore_menu#Troubleshooting|Troubleshooting]]) | 
-| ''NTFSRESIZE'' | ''"/root/ntfs-3g_ntfsprogs-2011.4.12/ntfsprogs/ntfsresize"'' | Ídem que antes, si hemos compilado | 
- 
-==== Ejemplo de Configuración restante ==== 
-=== grub === 
-<file config menu.lst> 
-# general configuration: 
-timeout   2 
-default   0 
-color light-blue/black light-cyan/blue 
- 
-# (0) Windows 
-title Windows 
-rootnoverify (hd0,0) 
-makeactive 
-chainloader +1 
- 
- 
-# (1) Arch Linux 
-title  Recovery Mode 
-root   (hd0,1) 
-kernel /boot/vmlinuz-linux root=/dev/sda2 ro 
-initrd /boot/initramfs-linux.img 
-</file> 
-=== .bashrc === 
-<file bash .bashrc> 
-# 
-# ~/.bashrc 
-# 
-sudo /root/restore_menu.sh 
-</file> 
-=== sudoers === 
-<file config sudoers> 
-username     ALL=(ALL) NOPASSWD: /root/restore_menu.sh 
-</file> 
- 
- 
-====== Troubleshooting ====== 
-===== ntfsclone ===== 
-<code> 
-ERROR: $Bitmap size is smaller than expected 
-</code> 
-Solución: 
-http://www.tuxera.com/forum/viewtopic.php?f=2&t=27527 
  
linux/restore_menu.txt · Last modified: 2024/03/25 07:55 by dodger