"Después del juego es antes del juego"
Sepp Herberger

lunes, 24 de junio de 2013

Añadiendo cosas a nuestro SystemRescueCD+Clonezilla

Tras haber aprendido a crear nuestra imagen combinada de SystemRescueCD y Clonezilla, podemos aprovechar para añadir dentro scripts que usemos habitualmente en nuestro trabajo. Os cuento algunos de los scripts que tengo yo dentro del /root de la imagen.

1) Regeneración de GRUB.

El GRUB lleva bastante mal que lo cambiemos de disco duro clonando. Es muy normal que al arrancar en el nuevo PC no pueda encontrar la partición de Linux. Lo ideal es regenerar la configuración de GRUB despues de clonar, para que detecte las características del nuevo disco duro y se adapte a ellas. Éste es el script que lo hace por nosotros:

 root # cat regenera_grub.sh   
 #!/bin/bash  
 #Para ser ejecutado como root  
 #Parametros   
 #    $1 = ruta a la particion con Linux. Ej /dev/sda1  
 #    $2 = ruta al disco donde va el grub. Ej /dev/sda  
 if [ $# -ne 2 ]  
 then  
   echo "Ejemplo uso: $0 /dev/sda1 /dev/sda "  
   echo "    Siendo /dev/sda1: partición root de Linux"  
   echo "       /dev/sda : disco duro donde se instala grub"  
   exit 1  
 fi  
 particion=$1  
 disco=$2  
 echo "Montando particiones..."  
 mount $particion /mnt  
 mount --bind /dev /mnt/dev  
 mount --bind /dev/pts /mnt/dev/pts  
 mount --bind /proc /mnt/proc  
 mount --bind /sys /mnt/sys  
 echo "Regenerando grub...."  
 chroot /mnt /usr/sbin/grub-install --recheck $disco  
 chroot /mnt /usr/sbin/update-grub2  
 echo "Desmontando particiones"  
 umount /mnt/dev/pts  
 umount /mnt/dev  
 umount /mnt/proc  
 umount /mnt/sys  
 umount /mnt  
 echo "Fin"  


2) Llamar a Clonezilla con el directorio de imágenes montado.

Cuando clonamos con Clonezilla, normalmente usamos un directorio fijo donde coger/dejar las imágenes utilizadas, que suele ser un directorio de red. Este directorio se puede montar de diversas maneras: NFS, samba, sshfs,... En mi caso utilizo sshfs por ser el sistema mas fácil y rápido de configurar.

Estos pasos se repiten en los menús del clonezilla cada vez que clonamos y restauramos. ¿No es mejor automatizarlos?. Dicho y hecho:

 root # cat clonezilla-mount.sh   
 #!/bin/sh  
 sshfs root@ip-del-servidor-de-imagenes:/datos/trastero/imagenes /home/partimag -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null  
 /opt/drbl/sbin/clonezilla -k  

El comando sshfs monta sobre /home/partimag, que es el directorio usado por Clonezilla el sistema de ficheros remoto mediante ssh. En mi caso accedo como root a la ip de dicho servidor y tengo las imágenes en la ruta /datos/trastero/imagenes.

Los parámetros

 .............. -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null   

son para evitar que sshfs nos importune con avisos de claves cada vez que se monta el directorio.

La línea:

  /opt/drbl/sbin/clonezilla -k  

Hace que se llame al script de clonezilla diciéndole que se salte los preliminares y asuma que ya está montado el directorio de imágenes.

De esta manera, al ejecutar el script nos pedirá la clave de root para montar el sistema de ficheros, lo montará y entrará directamente al proceso de elección de clonado/restauración de clonezilla.

3) Hacer funcionar una imagen de XP restaurada desde un hardware distinto.


Si GRUB lleva mal que lo cambiemos de hardware, el Windows XP es mucho peor. No solamente se queja de que los drivers ya no valen para la tarjeta de red, sonido, etc, (lo cual es normal, ya que el conjunto de drivers que trae Windows XP por defecto es mínimo), lo malo es que muchas veces se niega por completo a arrancar, dando un pantallazo azul y reiniciando.


Las causas principales de esto pueden ser dos:

a) Los drivers de la controladora de disco duro: Windows intenta montar el disco duro con los drivers de la controladora de la imagen original. Al no poder hacerlo, opta por dar un pantallazo azul con algo así como:
 0x0000007B INACCESSIBLE_BOOT_DEVICE
b) La capa HAL: Windows XP tiene 3 capas HAL distintas, guardadas en 3 versiones del fichero hal.dll, que es escogido durante la instalación de Windows XP. Si al arrancar en el nuevo equipo el fichero hal.dll de la imagen no es compatible con ese hardware, Windows entra en un bucle de reinicios.

Para resolver el problema de las controladora IDE hay un par de trucos, uno a priori y otro a posteriori. No siempre funcionan, pero si lo hacen salimos de un mal trago fácilmente.

El método "a priori" consiste en que antes de clonar la imagen de Windows XP se pegue un cambiazo a los drivers de la controladora de disco duro, poniendo unos genéricos que trae el propio Windows que luego nos permitirán arrancar en muchos hardwares distintos.

Aquí viene muy bien explicado:

http://www.solriche.co.uk/files/misc/move_xp.html

Consta un script batch de Windows a ejecutar inmediatamente antes de apagar el Windows para hacer la clonación y una serie de ficheros que serán los cambiados.  Ojo, si el Windows vuelve a arrancar normalmente antes de haberlo clonado, se volverán a instalar los drivers específicos para ese ordenador y la imagen ya no será tan genérica. En el primer arranque tras la restauración el propio Windows buscará los drivers mas adecuados, y si los encuentra reemplazará los genéricos.

El método "a posteriori" se basa en lo mismo, pero se ejecuta después de restaurada la imagen. Como desde Windows no se puede hacer, ya que no arranca, tenemos que ejecutarlo desde nuestro SystemRescueCD. El método está sacado de aquí:

http://blog.mcbachmann.de/linux/windows-bluescreen-0x0000007b-inaccessible_boot_device

Ambos métodos consisten en copiar estos ficheros:
atapi.sys
Intelide.sys
Pciide.sys
Pciidex.sys
extraidos del CD de instalación del Windows XP con service pack que usemos y meterlos dentro de c:\windows\system32. Además hay que hacer unos cambios en el registro de Windows para decir que use esos drivers y no los que se hayan elegido durante la configuración del Windows.

Para el método "a priori", en el enlace proporcionado viene todo lo necesario.

Para el método "a posterori"  tengo los siguientes ficheros:

 # cat mergeide.sh   
 #!/bin/bash  
 #Para ser ejecutado como root  
 #Parametros   
 #    $1 = ruta a la particion con Windows. Ej /dev/sda1  
 if [ $# -ne 1 ]  
 then  
   echo "Ejemplo uso: $0 /dev/sda1"  
   echo "    Siendo /dev/sda1: particion con Windows"  
   exit 1  
 fi  
 particion=$1  
 #Copiamos los ficheros .sys  
 mount $particion /mnt/windows  
 DEST=/mnt/windows/WINDOWS/system32  
 cp -f *.sys $DEST  
 cd $DEST/config  
 chntpw -u Administrador system < mergeide.chntpw  
 cd ~  
 umount /mnt/windows  

Cuidado: la ruta DEST=/mnt/windows/WINDOWS/system32 puede variar en función de la instalación de Windows.
El script mergeide.chnptw es un poco mas complicado, ya que son el conjunto de comandos para modificar el registro de Windows desde Linux:

 # cat mergeide.chntpw   
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk primary_ide_channel  
 cd primary_ide_channel  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 atapi  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk secondary_ide_channel  
 cd secondary_ide_channel  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 atapi  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk *pnp0600  
 cd *pnp0600  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 atapi  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk *azt0502  
 cd *azt0502  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 atapi  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk gendisk  
 cd gendisk  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E967-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 disk  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#cc_0101  
 cd pci#cc_0101  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_0e11&dev_ae33  
 cd pci#ven_0e11&dev_ae33  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_1039&dev_0601  
 cd pci#ven_1039&dev_0601  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_1039&dev_5513  
 cd pci#ven_1039&dev_5513  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_1042&dev_1000  
 cd pci#ven_1042&dev_1000  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_105a&dev_4d33  
 cd pci#ven_105a&dev_4d33  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_1095&dev_0640  
 cd pci#ven_1095&dev_0640  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_1095&dev_0646  
 cd pci#ven_1095&dev_0646  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_1095&dev_0646&REV_05  
 cd pci#ven_1095&dev_0646&REV_05  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_1095&dev_0646&REV_07  
 cd pci#ven_1095&dev_0646&REV_07  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_1095&dev_0648  
 cd pci#ven_1095&dev_0648  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_1095&dev_0649  
 cd pci#ven_1095&dev_0649  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_1097&dev_0038  
 cd pci#ven_1097&dev_0038  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_10ad&dev_0001  
 cd pci#ven_10ad&dev_0001  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_10ad&dev_0150  
 cd pci#ven_10ad&dev_0150  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_10b9&dev_5215  
 cd pci#ven_10b9&dev_5215  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_10b9&dev_5219  
 cd pci#ven_10b9&dev_5219  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_10b9&dev_5229  
 cd pci#ven_10b9&dev_5229  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 pciide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_1106&dev_0571  
 cd pci#ven_1106&dev_0571  
 nv 1 Service  
 ed Service  
 pciide  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_8086&dev_1222  
 cd pci#ven_8086&dev_1222  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 intelide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_8086&dev_1230  
 cd pci#ven_8086&dev_1230  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 intelide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_8086&dev_2411  
 cd pci#ven_8086&dev_2411  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 intelide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_8086&dev_2421  
 cd pci#ven_8086&dev_2421  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 intelide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_8086&dev_7010  
 cd pci#ven_8086&dev_7010  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 intelide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_8086&dev_7111  
 cd pci#ven_8086&dev_7111  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 intelide  
 cd \ControlSet001\Control\CriticalDeviceDatabase  
 nk pci#ven_8086&dev_7199  
 cd pci#ven_8086&dev_7199  
 nv 1 ClassGUID  
 ed ClassGUID  
 {4D36E96A-E325-11CE-BFC1-08002BE10318}  
 nv 1 Service  
 ed Service  
 intelide  
 cd \ControlSet001\Services  
 nk atapi  
 cd atapi  
 nv 4 ErrorControl  
 ed ErrorControl  
 1  
 nv 1 Group  
 ed Group  
 SCSI miniport  
 nv 4 Start  
 ed Start  
 0  
 nv 4 Tag  
 ed Tag  
 19  
 nv 4 Type  
 ed Type  
 1  
 nv 1 DisplayName  
 ed DisplayName  
 Standard IDE/ESDI Hard Disk Controller  
 nv 2 ImagePath  
 ed ImagePath  
 system32\DRIVERS\atapi.sys  
 cd \ControlSet001\Services  
 nk IntelIde  
 cd IntelIde  
 nv 4 ErrorControl  
 ed ErrorControl  
 1  
 nv 1 Group  
 ed Group  
 System Bus Extender  
 nv 4 Start  
 ed Start  
 0  
 nv 4 Tag  
 ed Tag  
 4  
 nv 4 Type  
 ed Type  
 1  
 nv 2 ImagePath  
 ed ImagePath  
 System32\DRIVERS\intelide.sys  
 cd \ControlSet001\Services  
 nk PCIIde  
 cd PCIIde  
 nv 4 ErrorControl  
 ed ErrorControl  
 1  
 nv 1 Group  
 ed Group  
 System Bus Extender  
 nv 4 Start  
 ed Start  
 0  
 nv 4 Tag  
 ed Tag  
 3  
 nv 4 Type  
 ed Type  
 1  
 nv 2 ImagePath  
 ed ImagePath  
 System32\DRIVERS\pciide.sys  
 q  
 y  

¡Toma ya regedit mediante consola!. ¿Quién dijo miedo?.

Para resolver el problema de la capa HAL hay que hacerlo también a posteriori: el truco está en meter los tres posibles ficheros HAL distintos en el directorio system32 de Windows y dar a elegir entre ellos en el menú de arranque de Windows. Probando uno tras otro al final daremos con el que funciona en nuestro sistema y podremos dejarlo como fijo para el arranque.

  # cat winxp-multihal.sh   
 #!/bin/bash  
 #Activa el menu de arranque windows para poder elegir entre varias HAL, para distintos hardwares.  
 #Para ser ejecutado como root  
 #Parametros   
 #    $1 = ruta a la particion con Windows. Ej /dev/sda1  
 if [ $# -ne 1 ]  
 then  
   echo "Ejemplo uso: $0 /dev/sda1"  
   echo "    Siendo /dev/sda1: particion con Windows"  
   exit 1  
 fi  
 particion=$1  
 mount $particion /mnt/windows  
 DEST=/mnt/windows  
 cp -f hal*.dll $DEST/WINDOWS/system32  
 cp -f boot.ini $DEST/boot.ini  
 cd ~  
 umount /mnt/windows  


  # cat boot.ini   
 [boot loader]  
 timeout=10  
 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS  
 [operating systems]  
 multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /NoExecute=OptIn  
 multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Standard PC" /fastdetect /hal=halstd.dll /NoExecute=OptIn  
 multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="ACPI PC" /fastdetect /hal=halacpi.dll /NoExecute=OptIn  
 multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="ACPI Uniprocessor PC (***Mas usual***)" /fastdetect /hal=halmacpi.dll /NoExecute=OptIn  

Los ficheros hal*.dll empleados han sido extraídos del CD original de Windows XP, de la misma manera que hicimos para los drivers genéricos de la controladora de disco. Adjunto aqui la lista de los que tengo yo y su tamaño en bytes, a modo indicativo:

 81280   halacpi.dll  
 105472  hal.dll  
 134400  halmacpi.dll  
 105472  halstd.dll  


4) Gestión de usuarios Windows.

Sería estupendo poder gestionar los usuarios locales de Windows desde SystemRescueCD, para por ejemplo poder realizar scripts de creacion y eliminación de usuarios, pero no he encontrado una herramienta que lo haga desde Linux.

Como consuelo adjunto un par de scripts que son útiles en algunas ocasiones:

Éste nos da una lista de usuarios locales que hay en la partición de Windows.

 # cat listarusuarios.sh   
 #!/bin/bash  
 #Para ser ejecutado como root  
 #Parametros   
 #    $1 = ruta a la particion con Windows. Ej /dev/sda1  
 if [ $# -ne 1 ]  
 then  
   echo "Ejemplo uso: $0 /dev/sda1"  
   echo "    Siendo /dev/sda1: particion con Windows"  
   exit 1  
 fi  
 particion=$1  
 mount $particion /mnt/windows  
 DEST=/mnt/windows/WINDOWS/system32/config  
 cd $DEST  
 chntpw SAM  
 cd ~  
 umount /mnt/windows  

Y éste nos permite editar el usuario indicado como parámetro y resetear su contraseña, si no la conocemos.

 # cat editarusuario.sh   
 #!/bin/bash  
 #Para ser ejecutado como root  
 #Parametros   
 #    $1 = ruta a la particion con Windows. Ej /dev/sda1  
 #    $2 = usuario windows  
 if [ $# -ne 2 ]  
 then  
   echo "Ejemplo uso: $0 /dev/sda1 Administrador"  
   echo "    Siendo /dev/sda1: particion con Windows"  
   exit 1  
 fi  
 particion=$1  
 usuario=$2  
 mount $particion /mnt/windows  
 DEST=/mnt/windows/WINDOWS/system32/config  
 cd $DEST  
 chntpw -u $usuario SAM  
 cd ~  
 umount /mnt/windows  

Bueno, pues con esto dentro de  SystemRescueCD-Clonezilla, tengo un CD bastante completo que me resuelve gran cantidad de problemas. 




No hay comentarios:

Publicar un comentario