Rsync 02 – Migrando de un HDD a un SSD sin reinstalar

Estas navidades me regalaron un disco duro SSD Kingston Savage de 120GB. ¡Todo un regalazo!. Y como ya tenía mi sistema configurado a mi gusto y dejé atrás hace un tiempo la vena distrohopper, sinceramente, me daba mucha pereza reinstalarlo todo y tener que configurar otra vez todos los programas que uso, tema, iconos, etcétera. Así que empecé a pensar como podría trasladar mi sistema tal cual lo tengo de un disco duro a otro.
En un principio pensé en usar herramientas de clonado como Clonezilla o DD, pero como evidentemente mi nuevo disco sólido es de mucho menos capacidad que mi viejo HDD y por otro lado quería dejar la partición /home en el disco mecánico, tenía que pensar en particionarlo de otra manera y las particiones no serían del mismo tamaño así que empecé a darle vueltas al coco para hacerlo de otra forma.

Una de las características de un sistema GNU/Linux es que todo son archivos desde el punto de vista del sistema. Esto es una gran ventaja a la hora de migrar el sistema de un disco a otro, ya que si copiamos todos los archivos a otro medio respetando sus características (sistema de archivos, jerarquía, propietario, permisos, grupos, etc) el sistema seguirá funcionando tal y como lo hacía antes pero en el disco nuevo. ¡Tal y como os lo cuento!. ¿Y con que programa podemos hacer copias exactas de los archivos?… efectivamente, con Rsync.

La ventaja de usar Rsync es que es muy rápido ya que sólo va a copiar los archivos, no copiará la partición como haría Clonezilla y no copiará los espacios vacíos como haría DD. Rsync sólo copiará los archivos existentes minimizando el tamaño de la copia a sólo el tamaño del contenido de la partición y no al tamaño de la partición en sí.
En mi caso por ejemplo de 25GB que tenía mi partición para el sistema sólo tuve que copiar 9GB que es lo que ocupa mi sistema completo. ¿Qué maravilla verdad?

Para entender mejor como funciona Rsync podéis leer mi post anterior sobre Rsync: Rsync 01 – Hablemos de Rsync.

Bien, vamos al lio:

 

Copiar el sistema

IMPORTANTE: Antes de hacer nada recomiendo tener copia de los archivos importantes por si algo saliese mal. Aunque ya que no vamos a tocar nada en nuestro disco duro viejo este seguirá arrancando si lo ponemos de nuevo, pero más vale prevenir.

Lo primero que hice fue instalar mi nuevo SSD en la torre de mi sobremesa y arrancar el sistema.
También podemos arrancar con una distro live si queremos más seguridad y quizá sea la opción más recomendable, pero como no tenía ninguna a mano y aquí hacemos las cosas así sin anestesia yo lo hice con mi sistema corriendo, lo que vendría a ser “en caliente”.
No hay problema de hacerlo así, aunque luego explicaré que sí hay que tomar algunas precauciones para no liarla.

Al arrancar mi sistema me reconoció mis disco duro actual como sda y el nuevo SSD como sdb

En el disco duro mecánico tengo 3 particiones: /, /home y swap respectivamente

 

 

Lo primero que hice en el SDD fue crear una tabla de particiones con GParted. En mi caso la hice MBR (msdos en GParted) ya que mi equipo es viejo y no soporta GPT

 

 

La idea era copiar al SSD sólo la partición del sistema / y dejar el home y la swap en el disco duro mecánico. Pero ¿para que iba a copiar un bloque de 25GB pudiendo copiar sólo 9GB que es lo que está ocupado?

Nota: Antes de nada instalé Windows en una primera partición de 50GB ya que lo necesito por tema laboral. Pero este paso no se tendrá en cuenta.

Lo siguiente que hice fue crear una partición en ext4 para el sistema de tamaño al gusto. En mi caso fueron 30GB

De esta manera el disco nuevo sdb quedó:

sdb1: 50GB (NTFS)
sdb2: 30GB (ext4)
Y el resto sin particionar

Lo siguiente fue copiar con Rsync el contenido de sda1 (donde está el sistema) a sdb2 (nueva partición para el sistema en el SSD)

Los siguientes pasos se harán como root. Yo para esto hago sudo -i y ya desde ahí empiezo a trabajar.

Lo primero es montar la partición sdb2. Yo lo hice en mnt así:

mount /dev/sdb2 /mnt

Después pasamos a copiar con rsync todo el contenido de / pero excluyendo el contenido de las carpetas de dispositivos, procesos, temporales y demás. También excluí el home ya que no quería copiarlo. Pero si lo queréis copiar también no lo excluyáis.

rsync -aAX --info=progress2 --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/home/*"} / /mnt

Nota: Es importante que no haya espacio después de las “,” para el exclude.

Paso a explicar la línea de arriba:

  • -a es el modo archivo. Es recursivo y copia usuario, permisos, grupos, fecha y hora, enlaces simbólicos, dispositivos y no copia los hard links
  • -A copia los ACLs
  • -X copia los permisos especiales
  • –info=progress2 Muestra el porcentaje de progreso con la velocidad de transferencia y el tiempo. Se puede sustituir con -v si queremos ver archivo por archivo
  • Excluyo el contenido de las carpetas dev, proc, sys, tmp, run, media y en mi caso home (por eso pongo * al final). Y digo el contenido porque las carpetas se crearán ya que deben existir en el sistema pero estarán vacías ya que estas carpetas tendrán contenido sólo cuando el sistema esté arrancado. También excluyo el contenido de mnt lógicamente para no entrar en un bucle ya que es mi carpeta de destino pero igualmente se creará una carpeta mnt vacía. Excluyo lost+found por completo para que no se cree esta carpeta.

Nota: Si hemos arrancado con una distro live. Habrá que montar tanto sda1 como sdb2 y no hará falta excluir nada salvo que queramos excluir el home. Ya que todas las carpetas citadas arriba estarán vacías.

Desde Live CD sería:

rsync -aAX --info=progress2 --exclude={"/home/*"} /punto_montaje_sda1/ /punto_montaje_sdb2

Más opciones:

  • Si usamos mucho los Hard Links hay que añadir -H
  • Si tenemos archivos dispersos como discos virtuales o imágenes de Docker tenemos que añadir -S
  • Si vamos a lanzar la copia sobre una partición que ya tiene datos de una copia anterior deberíamos usar –delete para eliminar todo lo que no esté en el sistema actual que estamos copiando

Tras esto ya tendremos copiado todo el sistema en nuestro nuevo disco SSD. Lo siguiente que haremos será modificar el archivo /mnt/etc/fstab para decirle cual será nuestra nueva partición de arranque.

Primero necesitamos saber el UUID de nuestra nueva partición. lo sabremos así:

blkid

El resultado será:

/dev/sda1: UUID="4a493e16-2661-4fdb-b5bd-a0fdf1fe381c" TYPE="ext4" PARTUUID="5710966d-01"
/dev/sda2: UUID="3ga234sd-1125-4jhg-gd3b-ads3c345dsadb" TYPE="ext4" PARTUUID="5710966d-02"
/dev/sda3: UUID="a982951d-3932-43fc-8635-5b41aea692d8" TYPE="swap" PARTUUID="5710966d-03"
/dev/sdb1: UUID="09F719DC0C2B6D8A" TYPE="ntfs" PARTUUID="231a36b0-01"
/dev/sdb2: UUID="1153f24b-15ea-476a-b1b2-347ea920d721" TYPE="ext4" PARTUUID="231a36b0-02"

Editamos ahora el archivo /mnt/etc/fstab y cambiamos la parte del UUID de la partición sda1 en este caso por el UUID de la partición sdb2 que será la nueva raíz. Las particiones para home y swap en mi caso no las toco ya que se quedarán en el disco duro viejo. Pero si vais a pasar más particiones al SSD debéis cambiar el fstab de la misma forma para cada partición nueva o no encontrará esos puntos de montaje y dará error.

nano /mnt/etc/fstab

Muy importante: Hay que editar el fstab que está en /mnt que es el disco SSD ya que si no estaríamos editando el del disco duro viejo.

Mi /mnt/etc/fstab ya modificado sería:

01 # /etc/fstab: static file system information.
02 #
03 # Use 'blkid' to print the universally unique identifier for a
04 # device; this may be used with UUID= as a more robust way to name devices
05 # that works even if disks are added and removed. See fstab(5).
06 #
07 # <file system> <mount point>   <type>  <options>       <dump>  <pass>
08 # / was on /dev/sda1 during installation
09 UUID=1153f24b-15ea-476a-b1b2-347ea920d721 /               ext4    errors=remount-ro 0       1
10 # /home was on /dev/sda2 during installation
11 UUID=3ga234sd-1125-4jhg-gd3b-ads3c345dsadb /home           ext4    defaults            0       2
12 # swap was on /dev/sda3 during installation
13 UUID=a982951d-3932-43fc-8635-5b41aea692d8 none            swap    sw                  0       0
14 /dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0

Lo siguiente será instalar GRUB en nuestro nuevo disco. Para ello seguiré la guía que hice en otro artículo (Reinstalando Grub de forma indolora):

Montamos los dispositivos de la siguiente forma:

mount -t proc /proc /mnt/proc/
mount --rbind /dev /mnt/dev/
mount --rbind /sys /mnt/sys/

Hacemos chroot en /mnt e instalamos Grub

chroot /mnt
grub-install /dev/sdb

Ya tenemos instalado GRUB pero esto no basta para arrancar ya que el archivo /boot/grub/grub.cfg contiene el UUID de la partición antigua. Esto lo podemos comprobar con:

grep UUID= /boot/grub/grub.cfg

Si os fijáis en la primera linea el UUID es el antiguo.
En este caso no hace falta poner /mnt delante ya que estamos dentro del chroot y nuestra raíz ya es /mnt.

Para solucionar esto hay que re-configurar el archivo grub.cfg así:

grub-mkconfig -o /boot/grub/grub.cfg

Si ahora repetimos el grep anterior veremos que en la primera linea aparece el nuevo UUID.

Ya podemos salir de chroot con exit y reiniciar.

Indicaremos en la BIOS que el nuevo SSD sea el disco de arranque como es mi caso antes de arrancar, o si por el contrario pasamos todo al disco SSD quitaremos el disco viejo antes de iniciar o si lo queremos dejar para almacenar datos tendremos que asegurarnos que en fstab hemos cambiado todos los UUIDs de las particiones que hemos pasamos al SSD.

Para saber más sobre este proceso recomiendo la lectura del post en el que me he basado para hacerlo yo y contároslo a vosotros:
Full system backup with rsync

 

Optimizando el SSD

Una vez que tenemos nuestro sistema funcionando en el nuevo SSD vamos a hacer algunas modificaciones para intentar alargar la vida de nuestro SSD y no mermar su rendimiento reduciendo el número de lecturas/escrituras todo lo posible. Siempre hasta un punto razonable, que he visto por ahí configuraciones muy extremas y ha día de hoy los SSD no son como hace unos años por lo que cada vez es menos necesario configurar tantas cosas.

Lo primero que hice fue añadir la orden noatime al fstab para que el sistema no guarde ningún registro con la hora de acceso a los archivos, ya que es un dato que no se suele utilizar en un sistema de escritorio. ¡Ojo! esto no es lo mismo que la fecha de modificación de los archivos que sí se guardará.

Mi fstab quedó así:

07 # <file system> <mount point>   <type>  <options>       <dump>  <pass>
08 # / was on /dev/sda2 during installation
09 UUID=1153f24b-15ea-476a-b1b2-347ea920d721 /               ext4    noatime,errors=remount-ro 0       1

No utilizo la opción discard ya que me parece excesiva y a la larga puede reducir el rendimiento del disco.

Otra cosa que hice fue habilitar la función TRIM. Para saber más sobre TRIM podemos leer esto.

Primero debemos averiguar si nuestro disco es compatible con TRIM. Para ello ejecutamos:

sudo hdparm -I /dev/sda | grep "TRIM supported"

El resultado será del estilo a esto:

*	Data Set Management TRIM supported (limit 8 blocks)

Podemos ejecutar TRIM de forma manual así:

sudo fstrim -av

La opción -a hará que trim se ejecute para todas las particiones soportadas y -v es el modo verbose.

Lo más indicado para no tener que acordarnos de hacer esto es programarlo. Yo habilité TRIM para que se ejecute una vez por semana.

Creamos un archivo llamado trim con la siguiente linea:

sudo nano /etc/cron.weekly/trim

y añadimos dentro:

#!/bin/sh
fstrim -a

Le damos permisos de ejecución:

sudo chmod +x /etc/cron.weekly/trim

Otras cosas que se pueden hacer:

  • Si tenemos mucha RAM podemos montar los temporales (/tmp) en la memoria RAM. Yo no lo hice porque no tengo tanta, en mi caso los monté en una partición de mi disco mecánico.
  • Si hemos puesto la swap en el SSD reducir el swappines.
  • Reducir el número de chequeos del sistema de ficheros
  • Reducir o desactivar la caché del navegador (Firefox, Chrome,…) si tenemos el /home en el SSD,

Dejo algunos enlaces interesantes sobre todas estas configuraciones:
Recomendaciones para el uso de un ssd en gnulinux
SSD: how to optimize your Solid State Drive for Linux Mint 18.1, Ubuntu 16.04 and Debian
How to tweak and optimize SSD for Ubuntu, Linux Mint

 

Esto ha sido todo por hoy. Nos vemos en el próximo post.

Saludos linuxeros.

 


Serie Rsync:

Rsync 01 – Hablemos de Rsync
Rsync 02 – Migrando de un HDD a un SSD sin reinstalar

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *