NetWorker: El respaldo del cliente de NetWorker del contenedor de Docker falla con el error savefs: fail

Summary: NetWorker: El respaldo del cliente de NetWorker del contenedor de Docker falla con el error savefs: fail

This article applies to This article does not apply to This article is not tied to any specific product. Not all product versions are identified in this article.

Symptoms

El software cliente de NetWorker se instala dentro de un contenedor Docker.
El respaldo basado en cliente del cliente Docker falla con el siguiente error:

<client name>:savefs failed.
<client name>:savefs See the file '/nsr/logs/policy/<policy>/<workflow/backup_<jobid>_logs/<jobid>.log' for command output.
Stopped processing of the save set <cleint name>:<save set> because the savefs job job terminated with an error.
Job <jobid> host: <client name> savepoint: <save set> had ERROR indication(s) at completion
<client name>:<save set> abandoned.
Client '<client name>' is being skipped because no savesets of this client have been backed up as part of the backup action.
Action backup traditional 'backup' with job id <job id> is exiting with status 'failed', exit code 1

Cause

Los clientes de NetWorker que se ejecutan dentro de contenedores Docker no son oficialmente compatibles con las versiones actuales. Docker utiliza un sistema de archivos superpuesto y no se basa en un diseño de disco tradicional, por lo que las rutas como /etc/fstab no están presentes.

Resolution

Actualmente, no hay ningún método compatible para respaldar contenedores Docker como clientes de NetWorker. Si desea que esta funcionalidad exista en NetWorker, comuníquese con su representante de cuentas o de ventas de Dell con respecto a una solicitud de mejora (RFE).

 

Para evitar que un cliente de NetWorker respalde datos de Docker, debe usar directivas de omisión en el cliente de NetWorker para la estructura de archivos/carpetas de Docker.

Ejemplo (modifique las rutas y los procesos según el sistema y la configuración de Docker):

<< /var/lib/docker >>
skip: *
<< /var/lib/containers >>
skip: *
<< /run >>
skip: docker docker.sock containers podman crun

Encontrará más información sobre las directivas de NetWorker en la Guía de administración de NetWorker. La documentación de NetWorker está disponible a través de: Compatibilidad con NetWorker | Manuales y documentos 

 

Para respaldar los datos del contenedor de Docker, utilice una de las siguientes soluciones alternativas:

Solución alternativa uno: 

  1. Acceda al host de Docker a través de SSH.
  2. En la sesión de SSH, conéctese al contenedor de Docker. La sintaxis exacta utilizada depende de la plataforma del contenedor:
  • Docker: docker exec -it CONTAINER_NAME sh
  • Hombre de la vaina: podman exec -it CONTAINER_NAME sh
  1. Cree un fstab usando el archivo mtab archivo: cp /etc/mtab /etc/fstab
  2. Salga del contenedor: exit
  3. Respalde el cliente de contenedor desde NetWorker.

Solución alternativa dos:

Cree "archivos" de los datos del contenedor de Docker en el host de Docker, respalde los datos como un saveset del sistema de archivos desde el host de Docker. Este enfoque puede requerir algunos scripts y el uso de cron puestos de trabajo.

PRECAUCIÓN: La compatibilidad con NetWorker no proporciona compatibilidad con scripts ni soporte para problemas relacionados con scripts del SO. El siguiente ejemplo es solo para prueba de concepto. El script ofrece capacidades generales de ajuste y puede satisfacer sus necesidades, pero úselo solo cuando comprenda completamente su comportamiento. Debe coordinar con el administrador del sistema del host de Docker para ver si acepta este enfoque. Trabaje con el administrador del sistema y de Docker para formular un script adecuado para sus necesidades mediante la descripción general del procedimiento general que se describe aquí. El soporte de NetWorker solo puede ayudar con problemas generales de respaldo/restauración de NetWorker de los tarballs de "archivo" respaldados por NetWorker.
  1. Cree un script bash que realice las siguientes operaciones:
    1. Detenga el contenedor de Docker temporalmente. Esto es para garantizar la coherencia de la base de datos en el contenedor Docker.
    2. Comprima el contenido de la carpeta del contenedor de Docker.
    3. Iniciar el contenedor Docker
    4. (opcional) limpie archivos de más de X días.
#!/usr/bin/env bash
set -euo pipefail
# ===== Config (tunable) =====
CONTAINER_TOOL="podman"                  # container platform (podman or docker)
CONTAINER_NAME="npm"                     # the container name to verify after restart
COMPOSE_DIR="/root/docker/nginx"         # directory containing docker-compose.yaml/podman-compose.yaml
BACKUP_ROOT="/root/docker/backups"       # where backups are stored on the host
RETENTION_DAYS=3                         # delete archives older than N days
TIMESTAMP="$(date +%F_%H%M%S)"
ARCHIVE="${BACKUP_ROOT}/${CONTAINER_NAME}-backup-${TIMESTAMP}.tar.gz"
LOCK_FILE="/var/lock/${CONTAINER_NAME}_backup.lock"
# ========================================
mkdir -p "$BACKUP_ROOT" /var/lock
# --- Handle stale lock files (if previous run crashed) ---
if [[ -f "$LOCK_FILE" ]]; then
  # Try to find an owning process; if none, remove the stale lock
  LOCK_FD_OWNER="$(lsof -t -- "$LOCK_FILE" 2>/dev/null || true)"
  if [[ -z "$LOCK_FD_OWNER" || ! -d "/proc/$LOCK_FD_OWNER" ]]; then
    echo "[INFO] Removing stale lock file: $LOCK_FILE"
    rm -f "$LOCK_FILE"
  fi
fi
# --- Simple lock to avoid overlapping runs ---
exec 9>"$LOCK_FILE"
if ! flock -n 9; then
  echo "[INFO] Another backup is running. Exiting."
  exit 0
fi
# --- Safety checks ---
if [[ ! -d "$COMPOSE_DIR" ]]; then
  echo "[ERROR] Compose directory not found: $COMPOSE_DIR" >&2
  exit 1
fi
if [[ ! -f "${COMPOSE_DIR}/docker-compose.yaml" && ! -f "${COMPOSE_DIR}/podman-compose.yaml" ]]; then
  echo "[ERROR] No compose file found in ${COMPOSE_DIR}" >&2
  exit 1
fi
# --- Functions ---
prune_backups() {
  local root="$1" days="$2"
  echo "[INFO] Pruning backups older than ${days} days in ${root}..."
  find "$root" -maxdepth 1 -type f -name "${CONTAINER_NAME}-backup-*.tar.gz" -mtime +"$days" -print -delete || true
}
verify_running() {
  # Expect container named "${CONTAINER_NAME}" to be running again
  if ${CONTAINER_TOOL} ps --format '{{.Names}}' | grep -qx "${CONTAINER_NAME}"; then
    echo "[INFO] Container '${CONTAINER_NAME}' is running."
  else
    echo "[WARN] Container '${CONTAINER_NAME}' not found in '${CONTAINER_TOOL} ps'. Check '${CONTAINER_TOOL} ps -a' and logs."
  fi
}
# --- Stop stack cleanly using *-compose in its directory ---
echo "[INFO] Bringing down stack (${CONTAINER_TOOL}-compose down) in ${COMPOSE_DIR}..."
(
  cd "$COMPOSE_DIR"
  # Do NOT pass -p; let the project default to the directory name
  ${CONTAINER_TOOL}-compose down || {
    echo "[WARN] ${CONTAINER_TOOL}-compose down returned non-zero. Continuing (stack may not have been up)."
  }
)
# --- Create archive (compose dir: data, letsencrypt, compose file, etc.) ---
echo "[INFO] Archiving ${COMPOSE_DIR} to ${ARCHIVE}..."
# Preserve SELinux/xattrs and ownership; exclude the backups dir if it's under same parent
tar -C "$(dirname "$COMPOSE_DIR")" \
  --xattrs --selinux --same-owner --numeric-owner \
  --exclude "$(basename "$BACKUP_ROOT")" \
  -czf "$ARCHIVE" "$(basename "$COMPOSE_DIR")"
# Optional integrity checksum
sha256sum "$ARCHIVE" > "${ARCHIVE}.sha256"
# --- Start stack back up ---
echo "[INFO] Starting stack (${CONTAINER_TOOL}-compose up -d)..."
(
  cd "$COMPOSE_DIR"
  ${CONTAINER_TOOL}-compose up -d
)
# --- Verify expected container is running ---
verify_running
# --- Prune according to retention ---
prune_backups "$BACKUP_ROOT" "$RETENTION_DAYS"
echo "[OK] Backup completed: ${ARCHIVE}"
Ejemplo de uso de script:
[root@rhel-client01 scripts]# ./backup_npm.sh
[INFO] Removing stale lock file: /var/lock/npm_backup.lock
[INFO] Bringing down stack (podman-compose down) in /root/docker/nginx...
npm
npm
14dc3c3871a7a9716142a1011f1039258d330be1ddb49543eb7a8e257256239a
nginx_default
[INFO] Archiving /root/docker/nginx to /root/docker/backups/npm-backup-2026-02-10_155107.tar.gz...
[INFO] Starting stack (podman-compose up -d)...
be491bf43aa17f1a767075ed8b2cd55d93cdf4581ad04abe66a58f3bce0b5e74
e677dbedd5fdd92a440896dc4cae22165cb34ce704ec3ed8f7620ce243183585
npm
[INFO] Container 'npm' is running.
[INFO] Pruning backups older than 3 days in /root/docker/backups...
[OK] Backup completed: /root/docker/backups/npm-backup-2026-02-10_155107.tar.gz
[root@rhel-client01 scripts]#
[root@rhel-client01 scripts]# ls -ltr /root/docker/backups/
total 8
-rw-r--r--. 1 root root 638 Feb 10 15:51 npm-backup-2026-02-10_155107.tar.gz
-rw-r--r--. 1 root root 123 Feb 10 15:51 npm-backup-2026-02-10_155107.tar.gz.sha256

Alternativamente, cree un trabajo cron para que el script se ejecute diariamente, semanalmente, etc. (según su discreción),

[root@rhel-client01 scripts]# ln -s /root/scripts/backup_npm.sh /etc/cron.daily/backup_npm
[root@rhel-client01 scripts]#
NOTA: Dado que el script detiene el contenedor Docker, es importante programar el script de archivo durante un intervalo de tiempo que sea aceptable para el tiempo de inactividad momentáneo. Esto se debe coordinar con los administradores del sistema y Docker.
  1. Cree un cliente de NetWorker para el sistema que aloja los contenedores de Docker. El "Saveset" es el directorio que se utiliza para el directorio que contiene los archivos tarball de Docker:

Cliente Docker

  1. Realice respaldos del cliente. En la Guía de administración de NetWorker , se proporciona más información sobre la creación de políticas de respaldo y la programación. La documentación de NetWorker está disponible a través de: Compatibilidad con NetWorker | Manuales y documentos 

El respaldo del cliente contiene los datos de archivo comprimido de Docker:

[root@nsr ~]# mminfo -avot -q client=rhel-client01.amer.lan -r "nsavetime,savetime(20),name,sumflags,ssretent"
  save time    date     time   name                           fl  retent
...
 1770757763    02/10/2026 16:09 /root/docker/backups          cb 03/10/2026

[root@nsr ~]# nsrinfo -t 1770757763 rhel-client01.amer.lan
scanning client `rhel-client01.amer.lan' for savetime 1770757763(Tue 10 Feb 2026 04:09:23 PM EST) from the backup namespace
/root/docker/backups/npm-backup-2026-02-10_155107.tar.gz
/root/docker/backups/npm-backup-2026-02-10_155107.tar.gz.sha256
/root/docker/backups/
/root/docker/
/root/
/
6 objects found
Los datos se conservan según el período de retención establecido en la acción de respaldo.

Se utiliza una restauración de cliente de NetWorker para recuperar el tarball en el cliente de NetWorker existente (o alternativo). El administrador del sistema y Docker debe realizar los pasos siguientes para volver a configurar el contenedor de Docker con los datos recuperados.

Affected Products

NetWorker

Products

NetWorker
Article Properties
Article Number: 000071581
Article Type: Solution
Last Modified: 18 Apr 2026
Version:  8
Find answers to your questions from other Dell users
Support Services
Check if your device is covered by Support Services.