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í:
Ambos métodos consisten en copiar estos ficheros:
atapi.sysIntelide.sysPciide.sysPciidex.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:
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