jueves, 3 de enero de 2008

Consejos al migrar GNU/Linux a otro disco duro

Fuente: SigT

Después de años con un disco duro de 40GB para el sistema operativo y luego otro de 120GB conectado por USB (en realidad primero el de 40GB, luego uno de 80GB y vuelta al de 40GB para usar el de 80GB en otro sitio) me he pillado un disco duro de 320GB y, una vez más, toca migrar…

Si bien se dice que “GNU/Linux no se formatea jamás” y se asocia a su seguridad, estabilidad y/o que siempre hay una solución que evita el borrado yo creo que los tiros van por otros lados: puedes llegar a personalizarlo tanto que si bien formatear y reinstalar son 20 minutos, luego el dejarlo “como estaba” es mucho más largo.

Por ello lo que se suele hacer es seguir una misma lógica de particiones y/o sistema de ficheros para copiar los ficheros (no hay “ficheros bloqueados”) de un disco duro a otro, reinstalar el cargador de sistemas operativos (normalmente GRUB) y adelante.

Preparándolo todo

Lo primero de todo es tener los dos discos duros funcionando, el “nuevo” puede ser conectado con una caja USB pero esto luego puede crearnos alguna pequeña complicación.

Una buena idea es perder diez minutos en hacer limpieza del sistema para ahorrar tiempo luego al copiar ficheros.

Podemos eliminar con apt-get remove –purge todos los kernels (linux-image-*) y sus kbuild (linux-kbuild-*) salvo los que utilices tú o sean dependencias de otros programas. Lo mismo con sus cabeceras (linux-headers-*).

Lo mismo con los programas que no sean utilizados, además con dpkg -l | grep ^rc podemos ver los programas desinstalados pero que todavía dejan restos (y con dpkg --purge eliminar los restos).

Con deborphan podemos ver bibliotecas “huerfanas”: bibliotecas que no son utilizadas por ningún programa. Es recomendable ejecutar antes ldconfig para evitar “falsos positivos” y revisar que con el borrado no se vaya a borrar realmente algo que utilicemos.

Algunos sitios más donde mirar si “sobran” ficheros:

  • /usr/share/doc (si no necesitas “documentación”).
  • /usr/src (¿código compilado por ti?).
  • Y obviamente… tu $HOME.

Por último podemos usar apt-get clean para eliminar todo el repositorio local (los paquetes que nos hemos bajado para posteriormente ser instalados).

Particionando

Veamos el esquema del disco duro viejo (40GB) y el nuevo:

HD viejo                  HD nuevo
hda1 100MB ext2 /boot hda1 200MB ext2 /boot
hda2 5GB ext3 / hda2 2GB swap
hda3 resto ext3 /home hda3 10GB ext3 /
hda4 resto ext3 /home

Primera sorpresa: ¿dónde c*ño esta la swap? Resulta que en la última repartición me olvide ^_^U. Lo gracioso es pensar que he estado codificando vídeo, viendo varias docenas de pestañas y reproduciendo vídeo o música… todo a la vez y sin swap, sólo con los 512MB de RAM de mi equipo (sí, se me va quedando anticuado xD).

Para crear las particiones utilizo cfdisk, todas las particiones son primarias (no me han gustado nunca las extendidas), de “Tipo de partición” elijo 83 (Linux) para todas menos la segunda que es 82 (Linux swap / Solaris).

Una vez hecho, toca darles formato (presupongo que el disco es hda por concordancia con lo anterior):

mkfs.ext2 /dev/hda1 -L "/boot"
mkswap /dev/hda2
mks.ext3 /dev/hda3 -L "/"
mks.ext3 /dev/hda4 -L "/home" -m 2

El parametro “-m” sirve para poner un % de la partición reservada al administrador distinto del por defecto (5%), en el ejemplo lo bajo a 2% ya que al ser datos de usuario sobra…

Copiándolo todo

Primero montamos las nuevas particiones en /media:

cd /media
mkdir {hda1,hda3,hda4}
mount -t ext2 /dev/hda1 hda1
mount -t ext3 /dev/hda3 hda3
mount -t ext3 /dev/hda4 hda4

Luego copiamos todo el /boot y el /home:

cp -v /boot/* media/hda1 -rfp
cp -v /home/* media/hda4 -rfp

El -v para hacernos una idea de cómo anda el asunto y la “p” final para preservar los permisos por lo que es sumamente importante.

¿Por qué no hago lo mismo con el sistema de ficheros raíz? En el sistema de ficheros raíz se crean ficheros “dinámicos” de proceso (en /proc) y de sistema (en /sys) así que no es buena idea copiar sin más.

cd hda3/
mkdir {boot,home,proc,sys,tmp}
cp -v /bin /dev /etc /initrd.img /lib /media /mnt /root \
/sbin /usr /var /vmlinuz . -rfp

Algunos detalles…

Como hemos cambiado de particiones tocar hacer un pequeño cambio en los ficheros del nuevo disco duro. En /etc/fstab toca cambiar raíz y home (hda2 y hda3) por hda3 y hda4. De la misma forma en /boot/grub/menu.lst hay que cambiar root=/dev/hda2 por root=/dev/hda3.

Grub

Por último falta instalar GRUB en el nuevo disco duro, en principio con un “grub-install /dev/hda” sobra pero esto no será posible si el dispositivo es vía USB.

En tal caso o lo metemos de una vez en el ordenador (vía IDE o SATA) y arrancamos desde el viejo primero o, si no tenemos espacio como es el caso, “jugamos” un poco:

  1. Sustituimos el disco duro viejo por el nuevo
  2. Arrancamos un LiveCD cualquiera (Ubuntu mismo).
  3. Montamos el /boot del disco duro en /media/hda1.
  4. grub-install /dev/hda --root-directory=/media/hda1.

Por último se puede dar el caso al arrancar desde disco duro (me ha pasado sólo 2 veces, supongo que depende del grub a instalar) que no coja el menu.lst y suelte un grub> a pelo esperando comandos.

root (hd0,0)
cat /boot/grub/menu.lst

# Copia las líneas del menu.lst, por ejemplo:
kernel /vmlinuz-2.6.23 root=/dev/hda3 ro vga=791
initrd /initrd.img
boot

Lo único que cambia es que en el menu.lst pone “savedefault” en lugar del boot (no lo necesita). Una vez arrancado desde nuestro sistema operativo se instalará correctamente el grub:

grub-install /dev/hda
update-grub

Conclusión

Requiere poco tiempo aunque parezca complejo. En realidad he tardado más en escribirlo que en hacerlo. Pero el tiempo que me ahorro en lugar de instalar un S.O nuevo y configurarlo (+ personalizarlo) es mucho, pero que mucho mayor.

No hay comentarios: