"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. 




domingo, 23 de junio de 2013

Atar en corto nuestro amule

Como fan de las series americanas, en especial de las de HBO, estoy obligado a usar nuestra vieja pero aún operativa red emule para huir de la programación televisiva patria. El ordenador que uso para las descargas es relativamente potente, pero hay veces en que el amule se desboca (nunca mejor dicho) y empieza a consumir mucho procesador e I/O, como un top y un iotop me revelan.

En Linux existen dos programas maravillosos que permiten limitar cuanto procesador e I/O puede consumir un programa. Hablando en plata: permiten atar en corto a nuestra mula. Estos programas son nice e ionice.

Para ello tengo un script que arranca el amule haciendo uso de estos comandos. El script es éste:

 ~/scripts$ cat amule.sh   
 #!/bin/bash  
 nice -n19 ionice -c3 amule  

De esta forma, mi amule está controlado sin que se resienta la velocidad de las descargas. Ahora los niños ya me pueden poner al 100% el procesador con los juegos flash y el minecraft. ¿Existe algún nice para niños?.

sábado, 22 de junio de 2013

Como crear un CD con SystemRescueCD y Clonezilla juntos y revueltos.

Dos de las herramientas favoritas de los administradores Linux son SystemRescueCD y Clonezilla. Estas están construidas sobre dos sistemas distintos: la primera con Gentoo y la segunda con Ubuntu. Eso hace que no sea sencillo poder juntar ambas en una sola imagen de CD o pendrive pero, como veremos en esta entrada, no es tarea imposible.

Existe desde hace tiempo una solución parcial a este problema: el Clonezilla-SysRescCD, que lo que hace es meter en una imagen de CD un arranque dual, que nos permite seleccionar en el arranque entre SystemRescueCd y Clonezilla. Esa no es mi idea: yo quiero ambas utilidades dentro del mismo sistema, con una sola imagen de arranque.

Para ello tomaremos la imagen de SystemRescueCD, en la que integraremos, como si injertasemos un cerezo, los scripts que constituyen Clonezilla. Empezamos pues descargando dicha imagen (en mi caso, la version 3.7.0).

Asimismo necesitamos también la imagen de Clonezilla en su versión DRBL, en concreto drbl-live-xfce-2.1.0-12-i486.zip desde http://sourceforge.net/projects/drbl/files/drbl_live_stable

Una vez finalizadas las descargas, procedemos a extraer el contenido de los ficheros. No nos hace falta ninguna herramienta especializada para ello: el explorador de archivos de Gnome/MATE permite extraer el contenido de ficheros ISO como si fueran zip o tar.gz, eligiendo la opción "Extraer ..." en el menú contextual de ambos ficheros.

Dentro de la carpeta donde se ha extraído el SystemRescueCD encontramos el fichero sysrcd.dat, que contiene el sistema de archivos root del Linux. Este fichero contiene un sistema de ficheros en formato squashfs, en lugar de los mas usuales para nosotros ext3 o ext4. Al ser squashfs un sistema de ficheros de sólo lectura, no podemos montarlo directamente y operar sobre él. Los pasos a seguir son para poder trabajar con su contenido son:

1) Descomprimirlo y borrar el sysrcd.dat original. Esto lo hacemos con la utilidad unsquashfs, incluida en el paquete squashfs-tools. Aviso antes de nada de que todo esto debemos hacerlo como usuario root. Los comandos son:

 # mkdir ~/trabajo  
 # cp sysrcd.dat ~/trabajo  
 # cd ~/trabajo  
 # unsquashfs sysrcd.dat  
 # rm sysrcd.dat   

Esto creará un directorio squashfs-root con el contenido del fichero sysrcd.dat. La acción de borrar el sysrcd.dat es para evitar que al recomprimir el sistema de ficheros de nuevo esta operación nos dé errores, ya que intentaría crear el sistema nuevo agregando todo al antiguo.

2) Hacer los cambios, como veremos a continuación.

3) Recomprimirlo y recrear el fichero.

 # mksquashfs squasfs-root sysrcd.dat  
 # md5sum sysrcd.dat > sysrcd.md5  

Un vez hecho el paso 1, ya tenemos el directorio squashfs-root con el contenido de SystemRescueCD. Vamos ahora a meter dentro el Clonezilla, a ver que sale.

Primero tenemos que descomprimir el fichero de Clonezilla descargado y buscar su sistema de ficheros root. Se encuentra dentro del fichero filesystem.squashfs que, ¡oh, sorpresa! está también en formato squashfs. Bueno, ya hemos visto como descomprimirlo en el paso 1.

Si miramos dentro del sistema de ficheros de Clonezilla, vemos que es una estructura normal de sistema de ficheros Linux (sus directorios etc, bin, usr, ...) y la primera tentación es copiar todo esto dentro del sistema de ficheros de SystemRescueCD. El resultado sería catastrófico: mezclar por completo un Gentoo con un Ubuntu puede dar cualquier cosa, pero nunca será buena.

Hay que ser mas preciso e ir directamente a lo que hace a Clonezilla ser Clonezilla. Clonezilla está formado por un conjunto de utilidades estándar de Linux para trabajar con discos, particiones e imágenes de los mismos, y una serie de scripts que le dan coherencia al proceso. Nuestro objetivo son los scripts, ya que las utilidades en su mayor parte están ya dentro del SystemRescueCD.

¿Dónde están dichos scripts?. Pues dentro de Clonezilla, en las ruta /usr/share/drbl, /usr/sbin y alguna más. Tan solo debemos coger esos directorios y copiar lo que nos interese de ellos en la ruta /opt/drbl de la imagen de SystemRescueCD. Los pasos serían:

  # cd <directorio donde hemos descomprimido el squashfs de clonezilla>   
  # mkdir -p ~/trabajo/squashfs-root/opt   
  # cp -r usr/share/drbl ~/trabajo/squashfs-root/opt/  
  # cp usr/sbin/clonezilla ~/trabajo/squashfs-root/opt/drbl/sbin/clonezilla  
  # cp usr/sbin/drbl* ~/trabajo/squashfs-root/opt/drbl/sbin/  
  # cp -r etc/drbl ~/trabajo/squashfs-root/etc  

Bueno, si el mundo fuese perfecto ya estaría todo hecho. Solo habría que recrear el sysrcd.dat, quemar la imagen ISO nueva y arrancar con la flamante distribución híbrida. Pero no es tan fácil: Ubuntu y Gentoo tienen muchas herramientas en común, pero existen algunas diferencias en los nombres de los ejecutables y Clonezilla además usa algunos comandos que no vienen con SystemRescueCD.

¿Cómo he averiguado esto?. Pues con prueba y error: quemando la imagen en un pendrive, arrancando con ella e intentando hacer un ciclo completo de clonación-restauración. La imagen en cuestión era la mas variada que tenía a mano: un arranque dual con Windows XP en formato NTFS, Debian Squeeze en formato ext3 y una partición de swap. Los errores han empezado a cantar inmediatamente. Vamos a ver que nos hace falta para que nuestros scripts Clonezilla injertados en el SystemRescueCD se sientan como en casa.

No lo he dicho hasta ahora, pero antes de nada debemos tener claro como lanzar el script principal de Clonezilla una vez tenemos la imagen arrancada. Esto se hace con:

/opt/drbl/sbin/clonezilla  

Enumeremos la lista de problemas encontrados y las soluciones que les he ido dando:

1) Nada mas arrancar, el script de Clonezilla intenta configurar la red. Hagamos lo que hagamos (dhcp, dirección estática, etc), el script se queda colgado, dejando noqueado el sistema operativo. Que raro. Bueno, puede tener su explicación en que el sistema de configuración de la red en un Gentoo y en un Ubuntu son bastante diferentes. Podríamos modificar los scripts para que Clonezilla intente configurar la red con los comandos de Gentoo, pero...¿para que carajo queremos que Clonezilla configure la red si SystemRescueCD ya la tiene configurada desde el arranque?. Lo lógico sería forzar a Clonezilla a saltarse esa tarea ya realizada.

¿Y dónde configura Clonezilla la red?. Pues en opt/drbl/sbin/ocs-functions, en concreto dentro de la función network_config_if_necessary() , que quedaremos vacía editando dicho script, tal que así:

 network_config_if_necessary() {  
 }   

Lo cual hacemos con:

nano ~/trabajo/squashfs-root/opt/drb/sbin/ocs-functions

Con esto, Clonezilla no intentará configurar nuestra red y asumirá que ya está configurada, lo cual es cierto.

2) Durante la restauración de las imágenes Linux, se producen errores indicando que no existe partclone.ext3. Si husmeamos con find | grep en SystemRescueCD vemos que tiene un partclone.extfs, pero no partclone.ext3. Mirando en Clonezilla, en su directorio usr/sbin vemos:

 partclone.ext2 -> partclone.extfs  
 partclone.ext3 -> partclone.extfs  
 partclone.ext4 -> partclone.extfs  
 partclone.ext4dev -> partclone.extfs  
 partclone.extfs  

Vamos, que Clonezilla tiene partclones variados, pero todos acaban apuntando a partclone.extfs. Lo único que hay que hacer en SystemRescueCD es imitar esta estructura:

 # cd ~/trabajo/squasfhs-root  
 # cd usr/sbin
 # ln -sf partclone.extfs partclone.ext2  
 # ln -sf partclone.extfs partclone.ext3  
 # ln -sf partclone.extfs partclone.ext4  
 # ln -sf partclone.extfs partclone.ext4dev  

3) Clonezilla necesita un directorio /home/partimag como punto de montaje para las imágenes. El SystemRescueCD no lo tiene, asi que hay que crearlo a mano:


 # mkdir ~/trabajo/squashfs-root/home/partimag



4) Por último, también nos da problemas la restauración de imágenes Linux al intentar utilizar el comando mkswap-uuid para restaurar la partición de swap. Si buscamos este comando en SystemRescueCD vemos que no existe. ¿Qué hacemos?. Pues copiarlo de Clonezilla a SystemRescueCD, así, tal cual.

 # cd <directorio donde hemos descomprimido el squashfs de clonezilla>  
 # cp -r sbin/mkswap-uuid ~/trabajo/squashfs-root/sbin/mkswap-uuid  

Con estos problemas resueltos, ya podemos regenerar el sysrcd.dat como expliqué mas arriba en el paso 3, crear el sysrcd.md5 correspondiente y meter ambos dentro de la ISO de SystemRescueCD, borrando previamente los sysrcd.* originales.

¿Y cómo metemos ficheros dentro de una imagen ISO?. Pues con ISO Master. Una vez generada la ISO, tenemos tres opciones:

1) Quemarla a un CD. Vaya desperdicio.

2) Copiarla a un pendrive para arrancar desde él. Aquí explican como.

3) Meterla en un servidor de arranque PXE, para arrancarla por red y no tener que usar varios pendrives si queremos restaurar múltiples equipos a la vez. Estos dos enlaces explican las ideas generales:
  • Aquí viene como arrancar SystemRescueCD por PXE. En especial me gusta el arranque montando el sistema root sobre NBD, mas rápido y apto para equipos antiguos o con poca memoria que el basado en NFS o en enviar la imagen del sistema de ficheros completa por TFTP o HTTP.
  • Si estamos en un entorno donde la configuración DHCP está almacenada en un árbol Ldap y no podemos trastear mucho con ella, como sucede en los IES de Extremadura, este enlace explica como montar un servidor TFTP integrado en nuestro DHCP y Ldap. Es para Clonezilla, pero adaptarlo a SystemRescueCD es trivial.

NOTA FINAL: aquí están enumerados y resueltos los problemas que he encontrado con las imágenes que uso habitualmente: arranques duales con NTFS y ext3. Si encuentras otros problemas al clonar-restaurar, házmelo saber y nos ponemos manos a la obra para arreglarlos.

DESCARGAR: desde este enlace se puede descargar la imagen ISO realizada según las instrucciones de esta entrada del blog.