Copia del sistema Linux en un disco externo USB arrancable

Publicado
Comentarios:  Ninguno

En este post explico la forma en la que hago backups de mi sistema. El objetivo es tener una copia idéntica del sistema en un disco duro usb externo de forma que podamos iniciar el PC desde el disco duro USB. De esta forma, si el disco duro se estropea (algo más habitual de lo que parece) tardaríamos lo que lleve un reinicio el PC en poder continuar con nuestras actividades informáticas.

La idea general es:

  1. creamos en el disco duro externo unas particiones con el mismo tipo de sistema de archivos que los que tenemos creados en nuestro ordenador
  2. usando el comando rsync, que copiará sólo aquellos archivos que hayan sido modificados entre los directorios de origen y destino, y un pequeño script hacemos un backup de nuestro disco duro interno en el USB (un buen tutorial sobre el comando lo puedes encontrar en el blog de Vicente Navarro)
  3. Modificamos el sistema de arranque del disco USB para permitir arrancar desde él, sin usar las particiones del sistema original

De esta forma, si procuramos ir haciendo backups de vez en cuando nos aseguraremos poder continuar trabajando en caso de desastre. Lo bueno del comando rsync es que permite sincronizar directorios copiando únicamente las diferencias entre ellos, con lo que una vez realizado el primer backup los sucesivos serán muy rápidos.

Lo ideal sería utilizar un sistema de archivos ZFS, sistema de archivos super avanzado, que permite, entre otras cosas, sincronizar discos duros y mantener versiones de nuestros archivos. Pero bueno, lo dejo en mi lista de tareas pendientes

Particiones del sistema

Mi sistema Linux está dividido en varias particiones, cuatro para el sistema y una para datos

Tipo Tamaño Sistema de archivos Dispositivo Directorio Descripción
Sistema 200 Mb Ext2 sda2 /boot Arranque del sistema (núcleo)
20 Gb Ext4 sda5 / Partición raíz
10 Gb Ext4 sda6 /usr/portage Sistema de paquetes de Funtoo Linux
5 Gb Swap sda3 Partición de intercambio
Datos 120 Gb XFS sda7 /home Mis cosas

Crearemos las mismas particiones con el mismo sistema de archivos en nuestro flamante disco duro externo. En mi caso se crearo las particiones sdd1, sdd2, sdd3, sdd5 y sdd6 en el disco duro externo y los comandos que ejecuté han sido:

mkfs.ext2 /dev/sdd1
mkfs.ext4 /dev/sdd2
mkswap /dev/sdd3
mkfs.ext4 /dev/sdd5
mkfs.xfs /dev/sdd6

Identificando las particiones por UUID

La idea es ir montando en bucle una partición del disco de origen y otra del destino e ir ejecutando un comando rsync que copie el contenido.

Para evitar confusiones (y previsibles catástrofes) en vez de usar como nombre de las distintas particines /dev/sda1, /dev/sda2, /dev/sdb1 usaremos el UUID, un identificador númerico único que nos permitirá identificar cada sistema de archivos sin confusión posible

Para conocer que UUID corresponde a cada partición de nuestro discos duros podemos ejecutar el comando blkid

# blkid
/dev/sda2: UUID="c3ea95c6-fa6e-405e-a41a-18fe9ed85021" TYPE="ext2"
/dev/sda3: UUID="4def1b86-5f75-407a-bf78-81eac154834f" TYPE="swap"
/dev/sda5: UUID="198222fe-c454-4683-b9e4-ed71986bcc91" TYPE="ext4"
/dev/sda6: UUID="a58c85bf-9293-4182-9772-12de0a9402fd" TYPE="ext4"
/dev/sda7: UUID="b240d821-368d-439f-a8a6-fe6d082b4540" TYPE="xfs"
/dev/sdd1: UUID="819d37a6-5515-4021-9b9d-f1b32b7ab31d" TYPE="ext2"
/dev/sdd2: UUID="9029cb3a-a69c-4665-bf7c-edb1627a8950" TYPE="ext4"
/dev/sdd3: UUID="c76d9f4b-b8c8-459c-9d1a-57bbe7bd099a" TYPE="swap"
/dev/sdd5: UUID="90d00089-90d4-41e0-891f-73b8025675e4" TYPE="ext4"
/dev/sdd6: UUID="a690854b-9a4e-4967-8a61-5605f08e7c4f" TYPE="xfs"

Script de backup

El script de backup se compone de tres ficheros:

  • config: archivo de configuración, en el que indico los UUIDs de las particiones y las opciones para el comando rsync

# Particiones del disco duro de origen
declare -a ORIGEN
ORIGEN[1]="819d37a6-5515-4021-9b9d-f1b32b7ab31d"    # /boot
ORIGEN[2]="9029cb3a-a69c-4665-bf7c-edb1627a8950"    # /
ORIGEN[3]="90d00089-90d4-41e0-891f-73b8025675e4"    # /usr/portage
ORIGEN[4]="a690854b-9a4e-4967-8a61-5605f08e7c4f"    # /home


# Particiones del disco duro externo USB
declare -a DESTINO
DESTINO[1]="28a9c4f4-ff8b-4328-812c-6adaa9195afb"    # /boot
DESTINO[2]="f6efae0d-36f8-4442-b2b5-72602101e24c"    # /
DESTINO[3]="6bd14c9f-a56f-4660-8417-d4db317747a2"    # /usr/portage
DESTINO[4]="785df737-5128-4588-a1f1-6db08ca8dacf"    # /home

# Opciones para RSYNC
RSYNC_OPTIONS="-avb --exclude-from=/usr/local/sbin/exclude"

  • exclude: lista de archivos que no se van a copiar (la configuración de las particiones y del arranque, /etc/fstab y /boot/grub/grub.cfg, ya que son particulares para cada disco, las películas y la música)

etc/fstab
grub/grub.cfg
pub/Música
pub/Películas y series

  • backup_linux.sh: el script de la shell con el código que ejecuta el backup. Acepta un parámetro, que será el nombre del archivo de configuración, config por defecto. El código (simplificado) sería la siguiente:

#!/bin/sh
# Carpetas temporales
temp_origen="/tmp/particion_origen"
temp_destino="/tmp/particion_destino"

# El primer parámetro es el archivo de configuración
if [ -z "$1" ]; then
    config_file="`dirname $0`/config"
else
    config_file="$1"
fi;
source "$config_file"

mkdir "$temp_origen"
mkdir "$temp_destino"

for i in `seq 1 ${#ORIGEN[*]}`; do
    printf "Copiando dispositivo %s a %s ....\n" ${ORIGEN[$i]} ${DESTINO[$i]}
    mount /dev/disk/by-uuid/${ORIGEN[$i]} "$temp_origen"
    mount /dev/disk/by-uuid/${DESTINO[$i]} "$temp_destino"
    rsync $RSYNC_OPTIONS "$temp_origen/" "$temp_destino"
    umount "$temp_origen"
    umount "$temp_destino"
done;

rmdir "$temp_origen"
rmdir "$temp_destino"

Configurando el arranque desde el USB

Ahora nos queda modificar los ficheros /etc/fstab y el arranque con el Grub para que podamos reiniciar y arrancar desde la copia en el USB

Para ello lo más práctico será acceder al entorno Linux de backup usando un entorno chroot. Para crear el entorno bajo /tmp/copia los comandos serían:

# Montamos los sistemas de archivos bajo /tmp/copia
cd /tmp
mkdir copia
mount /dev/sdd2 copia
mount /dev/sdd1 copia/boot
mount /dev/sdd5 copia/usr/portage
mount /dev/sdd6 copia/home
mount --bind /dev copia/dev
mount --bind /proc copia/proc
# Accedemos al entorno
chroot copia /bin/bash
su -

En el /etc/fstab habrá que reemplazar los enlaces a las particiones por la dirección de las particiones del disco duro externo.

Como ejemplo, en mi caso es:

/etc/fstab

# <fs>      <mountpoint>  <type>    <opts>    <dump/pass>
/dev/disk/by-uuid/819d37a6-5515-4021-9b9d-f1b32b7ab31d    /boot       ext2    noatime     1 2
/dev/disk/by-uuid/c76d9f4b-b8c8-459c-9d1a-57bbe7bd099a    none        swap    sw      0 0
/dev/disk/by-uuid/9029cb3a-a69c-4665-bf7c-edb1627a8950    /           ext4    noatime     0 1
/dev/disk/by-uuid/90d00089-90d4-41e0-891f-73b8025675e4    /usr/portage  ext4    noatime     0 1
/dev/disk/by-uuid/a690854b-9a4e-4967-8a61-5605f08e7c4f    /home       xfs       defaults,noatime  0 1
none                                                  /dev/shm      tmpfs   nodev,nosuid,noexec 0 0

/boot/grub/grub.cfg

set timeout=0
set default=0

menuentry "Funtoo Linux" {
  set root=(hd0,1)
  linux /vmlinuz-3.7.1-tuxonice root=UUID=9029cb3a-a69c-4665-bf7c-edb1627a8950 rootdelay=5 video=intelfb quiet splash
  initrd /initramfs.cpio.gz
}

Y después instalamos GRUB en el sector de arranque del disco duro externo:

grub-install /dev/sdd

Hemos tenido que añadir el parámetro rootdelay al kernel para indicarle que espere unos segundos antes de cargar la partición raíz del disco ya que el disco externo USB tarda un ratillo en ser convenientemente detectado

De aquí hay que destacar:

  • El kernel tiene que tener soporte para USB compilado en el kerne, no como módulos separados
  • En el arranque hay que pasarle el parámetro rootdelay indicando que queremos esperar unos segundos, 10 por ejemplo, para dar tiempo al kernel a detectar las particiones del disco.
  • Es siempre preferible utilizar UUID’s para referirse a las particiones

Y alehop! Un reinicio y lista nuestra copia para poder ser usada en caso de necesidad.


Etiquetas: , , ,

Comentarios

Actualmente no hay comentarios a este artículo.

Añadir comentarios ...

Escribe debajo tu comentario. Los campos marcados con * son obligatorios. Tienes que previsualizar tu comentario antes de enviarlo definitivamente.