Copias de seguridad

restic check no detecta un paquete corrupto si no usas --read-data

Publicado el 29 de octubre de 2026Última revisión: 29 de octubre de 20262 min de lectura

Resultado de la prueba

con un byte cambiado en un pack de 5 MiB, restic check devolvió "no errors were found" (exit 0); check --read-data detectó "Pack ID does not match" (exit 1); restore falló con exit 1 y restauró 3,948 de 5,000 MiB.

Contenido

Este artículo no contiene enlaces de afiliado.

Un restic check programado que dice "no errors were found" no garantiza que los datos estén sanos. Se corrompió a propósito un byte de un fichero de datos del repositorio para ver qué modo de comprobación lo detecta.

Condiciones: restic 0.16.4 en Linux arm64, repositorio local, un fichero aleatorio de 5 MiB, contraseña desechable. Se cambió un byte (posición 1000) del pack más grande. No se probó con repositorios remotos ni con corrupción en otras partes del repositorio. Script completo al final.

Resultado

Comando Salida Exit
restic check "no errors were found" 0
restic check --read-data "Pack ID does not match ..." y "repository contains errors" 1
restic restore latest restaura 3,948 de 5,000 MiB, "There were 1 errors" 1

El fichero restaurado difería del original (cmp encontró diferencias).

Qué significa

El check normal verifica la estructura (índices, snapshots, árboles) pero no lee el contenido de los packs, por eso no vio el byte cambiado. Solo --read-data los lee y comprueba su hash. Es lento en repositorios grandes; una opción es --read-data-subset, explicada en comprobar una parte con --read-data-subset.

Para una copia que te importa: programa el check rápido a menudo, --read-data-subset en rotación y haz de vez en cuando una restauración de prueba (restaurar para comprobar). Nota de la prueba: en el repositorio de la prueba los packs eran de solo lectura; hubo que dar permiso de escritura para corromperlos, lo que no ocurre en un fallo real de disco.

Script completo

#!/bin/bash
# Flip one byte inside a pack file: which restic check mode notices? Usage: test-restic-corruption.sh WORKDIR
W=$1; rm -rf "$W"; mkdir -p "$W/datos"
export RESTIC_PASSWORD=prueba-desechable
R="$W/repo"; restic init -r "$R" >/dev/null
head -c 5M /dev/urandom > "$W/datos/f.bin"
restic -r "$R" backup "$W/datos" --quiet
P=$(find "$R/data" -type f -printf "%s %p\n" | sort -n | tail -1 | cut -d" " -f2)
echo "pack: $(stat -c %s "$P") bytes"
chmod u+w "$P"; printf "\xff" | dd of="$P" bs=1 seek=1000 conv=notrunc 2>/dev/null; echo "dd exit=${PIPESTATUS[1]}"
echo "== 1) restic check (sin --read-data)"; restic -r "$R" check 2>&1 | tail -3; echo "exit=${PIPESTATUS[0]}"
echo "== 2) restic check --read-data"; restic -r "$R" check --read-data 2>&1 | tail -6; echo "exit=${PIPESTATUS[0]}"
echo "== 3) restore del snapshot"; restic -r "$R" restore latest --target "$W/out" 2>&1 | tail -3; echo "exit=${PIPESTATUS[0]}"
echo "== 4) comparar contenido"; cmp "$W/datos/f.bin" "$W/out$W/datos/f.bin" && echo igual