NetWorker: Kontejner Dockeru Zálohování klienta NetWorker selže s chybou savefs: fail

Summary: NetWorker: Kontejner Dockeru Zálohování klienta NetWorker selže s chybou 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

Klientský software NetWorker je nainstalován uvnitř kontejneru dockeru.
Zálohování klienta Dockeru na bázi klienta selže s následující chybou:

<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

Klienti NetWorker spuštění v kontejnerech Dockeru nejsou v aktuálních verzích oficiálně podporováni. Docker používá překryvný souborový systém a nespoléhá se na tradiční rozložení disku, takže cesty jako /etc/fstab nejsou k dispozici.

Resolution

V současné době neexistuje žádná podporovaná metoda zálohování kontejnerů dockeru jako klientů NetWorker. Chcete-li, aby tato funkce existovala v nástroji NetWorker, obraťte se na obchodní zástupce společnosti Dell ohledně požadavku na vylepšení (RFE).

 

Pokud chcete klientovi NetWorker zabránit v zálohování dat Dockeru, je nutné použít direktivy skip v klientovi NetWorker pro strukturu souborů/složek Dockeru.

Příklad (upravte cesty a procesy podle konfigurace vašeho systému a Dockeru):

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

Další informace o direktivách NetWorker se nacházejí v NetWorker Administration Guide. Dokumentace k nástroji NetWorker je k dispozici prostřednictvím: Podpora pro NetWorker | Příručky a dokumenty 

 

Pokud chcete zálohovat data kontejneru Dockeru, použijte jedno z následujících alternativních řešení:

První alternativní řešení: 

  1. Získejte přístup k hostiteli dockeru přes SSH.
  2. V relaci SSH se připojte ke kontejneru dockeru. Přesná použitá syntaxe závisí na platformě kontejneru:
  • Ukotvitelný nástroj: docker exec -it CONTAINER_NAME sh
  • Podman: podman exec -it CONTAINER_NAME sh
  1. Vytvořte fstab pomocí mtab : cp /etc/mtab /etc/fstab
  2. Ukončení kontejneru: exit
  3. Zálohujte klienta kontejneru z NetWorker.

Druhé řešení:

Vytvořte "archivy" dat kontejneru dockeru na hostiteli dockeru a zálohujte data jako sadu uložení systému souborů z hostitele dockeru. Tento přístup může vyžadovat určité skriptování a použití cron Úlohy.

VÝSTRAHA: Podpora NetWorker neposkytuje podporu skriptování ani podporu při problémech se skripty operačního systému. Níže uvedený příklad slouží pouze k ověření koncepce. Skript nabízí obecné možnosti ladění a může vyhovovat vašim potřebám, ale použijte ho jenom v případě, že plně rozumíte jeho chování. Musíte se koordinovat se správcem systému hostitele dockeru a zjistit, jestli tento přístup přijímá. Spolupracujte se správcem systému a dockeru a vytvořte skript vhodný pro vaše potřeby pomocí zde popsaného obecného přehledu postupů. Podpora NetWorker může pomoci pouze s obecnými problémy se zálohováním/obnovením NetWorker u archivních tarballů zálohovaných nástrojem NetWorker.
  1. Vytvořte skript Bash, který provede následující operace:
    1. Dočasně zastavte kontejner dockeru. To má zajistit konzistenci databáze v kontejneru dockeru.
    2. Komprimujte obsah složky kontejneru dockeru.
    3. Spuštění kontejneru Dockeru
    4. (volitelné) vyčištění archivů starších než X dní.
#!/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}"
Příklad použití skriptu:
[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

Případně vytvořte úlohu cron, aby se skript spouštěl denně, týdně atd. (podle vašeho uvážení),

[root@rhel-client01 scripts]# ln -s /root/scripts/backup_npm.sh /etc/cron.daily/backup_npm
[root@rhel-client01 scripts]#
POZNÁMKA: Vzhledem k tomu, že skript zastaví kontejner dockeru, je důležité naplánovat archivační skript během časového rámce, který je přijatelný pro momentální výpadky. To je nutné koordinovat se správci systému a dockeru.
  1. Vytvořte klienta NetWorker pro systém, který je hostitelem kontejnerů dockeru. "Save set" je adresář, který obsahuje archivy tarballu dockeru:

Klient Dockeru

  1. Proveďte zálohování klienta. Průvodce správou NetWorker obsahuje další informace o vytváření zásad zálohování a plánování. Dokumentace k nástroji NetWorker je k dispozici prostřednictvím: Podpora pro NetWorker | Příručky a dokumenty 

Záloha klienta obsahuje data archivu dockeru:

[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
Data se uchovávají podle doby uchování nastavené v akci zálohování.

Obnovení klienta NetWorker se používá k obnovení tarballu zpět do stávajícího (nebo alternativního) klienta NetWorker. Správce systému a dockeru musí provést následující kroky k opětovné konfiguraci kontejneru dockeru pomocí obnovených dat.

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.