NetWorker: Il backup del client NetWorker del contenitore Docker ha esito negativo con errore savefs: fail

Summary: NetWorker: Il backup del client NetWorker del contenitore Docker ha esito negativo con errore 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

Il software client NetWorker è installato all'interno di un container docker.
Il backup basato su client del client docker ha esito negativo con il seguente errore:

<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

I client NetWorker in esecuzione all'interno di container Docker non sono ufficialmente supportati nelle versioni correnti. Docker utilizza un file system overlay e non si basa su un layout disco tradizionale, pertanto percorsi come /etc/fstab non sono presenti.

Resolution

Attualmente non è supportato alcun metodo per eseguire il backup dei container Docker come client NetWorker. Se si desidera che questa funzionalità sia disponibile in NetWorker, contattare il proprio account Dell o il responsabile vendite in merito a una richiesta di miglioramento (RFE).

 

Per impedire a un client NetWorker di eseguire il backup dei dati Docker, è necessario usare le direttive skip sul client NetWorker per la struttura di file/cartelle Docker.

Esempio (modificare i percorsi e i processi in base alla configurazione di sistema e Docker):

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

Ulteriori informazioni sulle direttive NetWorker sono disponibili nella Guida all'amministrazione di NetWorker. La documentazione di NetWorker è disponibile tramite: Supporto per NetWorker | Manuali e documenti 

 

Per eseguire il backup dei dati del container Docker, utilizzare una delle seguenti soluzioni alternative:

Soluzione alternativa uno: 

  1. Accedere all'host docker tramite SSH.
  2. Dalla sessione SSH, connettersi al contenitore docker. La sintassi esatta utilizzata dipende dalla piattaforma del container:
  • Docker: docker exec -it CONTAINER_NAME sh
  • Podman: podman exec -it CONTAINER_NAME sh
  1. Creare un fstab utilizzando il metodo mtab del server NetWorker Management Console (NMC): cp /etc/mtab /etc/fstab
  2. Uscire dal container: exit
  3. Eseguire il backup del client container da NetWorker.

Soluzione alternativa due:

Creare "archivi" dei dati del container docker sull'host Docker, eseguire il backup dei dati come saveset del file system dall'host Docker. Questo approccio può richiedere alcune attività di scripting e l'utilizzo di cron Lavori.

AVVERTENZA: Il supporto di NetWorker non fornisce supporto per lo scripting o per problemi relativi agli script del sistema operativo. L'esempio riportato di seguito è solo a scopo di verifica di fattibilità. Lo script offre funzionalità di ottimizzazione generali e può soddisfare le esigenze dell'utente, ma utilizzarlo solo quando si comprende appieno il suo comportamento. È necessario coordinarsi con il System Administrator dell'host Docker per verificare se accetta questo approccio. Collaborare con il sistema e l'amministratore Docker per formulare uno script appropriato per le proprie esigenze utilizzando la panoramica della procedura generale descritta qui. Il supporto di NetWorker può essere di assistenza solo in caso di problemi generali di backup/restore NetWorker dei tarball di archiviazione sottoposti a backup da NetWorker.
  1. Creare uno script bash che esegua le seguenti operazioni:
    1. Arrestare temporaneamente il contenitore Docker. In questo modo è possibile garantire la coerenza del database nel container Docker.
    2. Comprimere il contenuto della cartella del contenitore Docker.
    3. Avviare il contenitore docker
    4. (opzionale) pulire gli archivi più vecchi di X giorni.
#!/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}"
Esempio di utilizzo degli 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

In alternativa, creare un cron job per lo script da eseguire quotidianamente, settimanalmente e così via (a discrezione dell'utente),

[root@rhel-client01 scripts]# ln -s /root/scripts/backup_npm.sh /etc/cron.daily/backup_npm
[root@rhel-client01 scripts]#
NOTA: Poiché lo script arresta il contenitore Docker, è importante pianificare lo script di archiviazione in un intervallo di tempo accettabile per il downtime momentaneo. Questa operazione deve essere coordinata con gli amministratori di sistema e docker.
  1. Creare un client NetWorker per il sistema che ospita i container docker. Il "Save set" è la directory utilizzata nella directory che contiene gli archivi del tarball docker:

Client Docker

  1. Eseguire i backup del client. Il documento NetWorker Administration Guide fornisce ulteriori informazioni sulla creazione di policy di backup e sulla pianificazione. La documentazione di NetWorker è disponibile tramite: Supporto per NetWorker | Manuali e documenti 

Il backup del client contiene i dati del tarball di archivio 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
I dati vengono conservati in base al periodo di retention impostato nell'azione di backup.

Un restore del client NetWorker viene utilizzato per ripristinare il tarball sul client NetWorker esistente (o alternativo). Il sistema e l'amministratore docker devono eseguire i passaggi successivi per riconfigurare il container docker utilizzando i dati ripristinati.

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.