NetWorker: Docker-Container NetWorker-Clientbackup schlägt mit Fehler "savefs: fail" fehl

Summary: NetWorker: Docker-Container NetWorker-Clientbackup schlägt mit Fehler "savefs: fail" fehl

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

Die NetWorker-Clientsoftware wird in einem Docker-Container installiert.
Das clientbasierte Backup des Docker-Clients schlägt mit dem folgenden Fehler fehl:

<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

NetWorker-Clients, die in Docker-Containern ausgeführt werden, werden in aktuellen Versionen nicht offiziell unterstützt. Docker verwendet ein Overlay-Dateisystem und ist nicht auf ein herkömmliches Festplattenlayout angewiesen, sodass Pfade wie /etc/fstab nicht vorhanden sind.

Resolution

Es gibt derzeit keine unterstützte Methode zum Sichern von Docker-Containern als NetWorker-Clients. Wenn diese Funktion in NetWorker vorhanden sein soll, wenden Sie sich bezüglich einer Verbesserungsanfrage (RFE) an Ihren Dell Account oder Vertriebsmitarbeiter.

 

Um zu verhindern, dass ein NetWorker-Client Docker-Daten sichert, müssen Sie auf dem NetWorker-Client Richtlinien zum Überspringen für die Docker-Datei-/Ordnerstruktur verwenden.

Beispiel (ändern Sie die Pfade und Prozesse gemäß Ihrem System und Ihrer Docker-Konfiguration):

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

Weitere Informationen zu NetWorker-Richtlinien finden Sie im NetWorker Administration Guide. Die NetWorker-Dokumentation ist verfügbar unter: Support für NetWorker | Handbücher und Dokumente 

 

Verwenden Sie einen der folgenden Workarounds, um Docker-Containerdaten zu sichern:

Problemumgehung eins: 

  1. Greifen Sie über SSH auf den Docker-Host zu.
  2. Stellen Sie in der SSH-Sitzung eine Verbindung zum Docker-Container her. Die genaue verwendete Syntax hängt von der Containerplattform ab:
  • Docker: docker exec -it CONTAINER_NAME sh
  • Podman: podman exec -it CONTAINER_NAME sh
  1. Erstellen einer fstab Datei mit dem mtab Datei: cp /etc/mtab /etc/fstab
  2. Beenden Sie den Container: exit
  3. Sichern Sie den Containerclient von NetWorker.

Problemumgehung 2:

Erstellen Sie "Archive" der Docker-Containerdaten auf dem Docker-Host und sichern Sie die Daten als Dateisystem-Saveset vom Docker-Host. Dieser Ansatz erfordert möglicherweise Skripterstellung und die Verwendung von cron Jobs.

WARNUNG: Der NetWorker-Support bietet keine Scripting-Unterstützung oder Unterstützung für BS-Skript-bezogene Probleme. Das folgende Beispiel dient nur der Machbarkeitsstudie. Das Skript bietet allgemeine Tuningfunktionen und erfüllt möglicherweise Ihre Anforderungen, verwenden Sie es jedoch nur, wenn Sie sein Verhalten vollständig verstehen. Sie müssen sich mit dem Systemadministrator des Docker-Hosts abstimmen, um festzustellen, ob er diesen Ansatz akzeptiert. Arbeiten Sie mit dem System- und Docker-Administrator zusammen, um ein geeignetes Skript für Ihre Anforderungen zu formulieren. Verwenden Sie dazu die hier beschriebene allgemeine Verfahrensübersicht. Der NetWorker-Support kann nur bei allgemeinen Problemen mit NetWorker-Backups/-Wiederherstellungen der von NetWorker gesicherten "Archiv"-Tarballs helfen.
  1. Erstellen Sie ein Bash-Skript, das die folgenden Vorgänge ausführt:
    1. Beenden Sie den Docker-Container vorübergehend. Dadurch wird die Datenbankkonsistenz im Docker-Container sichergestellt.
    2. Komprimieren Sie den Ordnerinhalt des Docker-Containers.
    3. Starten des Docker-Containers
    4. (optional) Bereinigen von Archiven, die älter als X Tage sind.
#!/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}"
Beispiel für die Skriptverwendung:
[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

Alternativ können Sie einen Cronjob erstellen, damit das Skript täglich, wöchentlich usw. ausgeführt wird (je nach Ermessen).

[root@rhel-client01 scripts]# ln -s /root/scripts/backup_npm.sh /etc/cron.daily/backup_npm
[root@rhel-client01 scripts]#
HINWEIS: Da das Skript den Docker-Container beendet, ist es wichtig, das Archivierungsskript für einen Zeitraum zu planen, der für eine vorübergehende Ausfallzeit akzeptabel ist. Dies muss mit den System- und Docker-Administratoren abgestimmt werden.
  1. Erstellen Sie einen NetWorker-Client für das System, auf dem die Docker-Container gehostet werden. Das "Saveset" ist das Verzeichnis, das als Verzeichnis verwendet wird, das die Docker-Tarball-Archive enthält:

Docker-Client

  1. Durchführen von Backups des Clients Weitere Informationen zum Erstellen von Backup-Policies und zur Planung finden Sie im NetWorker-Administrationshandbuch . Die NetWorker-Dokumentation ist verfügbar unter: Support für NetWorker | Handbücher und Dokumente 

Das Client-Backup enthält die Docker-Archiv-Tarball-Daten:

[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
Die Daten werden gemäß der Aufbewahrungsfrist aufbewahrt, die in der Backupaktion festgelegt wurde.

Eine NetWorker-Clientwiederherstellung wird verwendet, um den Tarball auf dem vorhandenen (oder alternativen) NetWorker-Client wiederherzustellen. Der System- und Docker-Administrator müssen die nachfolgenden Schritte ausführen, um den Docker-Container mit den wiederhergestellten Daten neu zu konfigurieren.

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.