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:
- creamos en el disco duro externo unas particiones con el mismo tipo de sistema de archivos que los que tenemos creados en nuestro ordenador
- 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)
- 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.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
/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
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)
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:
# 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:
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
/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 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.
Comentarios
Actualmente no hay comentarios a este artículo.
Añadir comentarios ...