NetWorker: Docker-container Back-up van NetWorker-client mislukt met fout savefs: fail

Samenvatting: NetWorker: Docker-container Back-up van NetWorker-client mislukt met fout savefs: fail

Dit artikel is van toepassing op Dit artikel is niet van toepassing op Dit artikel is niet gebonden aan een specifiek product. Niet alle productversies worden in dit artikel vermeld.

Symptomen

De NetWorker-clientsoftware wordt geïnstalleerd in een dockercontainer.
De clientgebaseerde back-up van de docker-client mislukt met de volgende fout:

<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

Oorzaak

NetWorker-clients die in Docker-containers worden uitgevoerd, worden niet officieel ondersteund in de huidige releases. Docker maakt gebruik van een overlay-bestandssysteem en is niet afhankelijk van een traditionele schijflay-out, dus paden zoals /etc/fstab zijn niet aanwezig.

Oplossing

Er is momenteel geen ondersteunde methode voor het maken van back-ups van docker-containers als NetWorker-clients. Als u wilt dat deze functionaliteit bestaat in NetWorker, neemt u contact op met uw Dell account of verkoopvertegenwoordiger over een Request For Enhancement (RFE).

 

Als u wilt voorkomen dat een NetWorker-client een back-up van Docker-data maakt, moet u voor de Docker-bestands-/mappenstructuur instructies voor overslaan op de NetWorker-client gebruiken.

Voorbeeld (wijzig de paden en processen volgens uw systeem- en Docker-configuratie):

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

Meer informatie over NetWorker-richtlijnen vindt u in de NetWorker-beheerhandleiding. NetWorker-documentatie is beschikbaar via: Support voor NetWorker | Handleidingen en documenten 

 

Gebruik een van de volgende tijdelijke oplossingen om een back-up te maken van docker-containerdata:

Tijdelijke oplossing één: 

  1. Toegang tot de dockerhost via SSH.
  2. Maak vanuit de SSH-sessie verbinding met de docker-container. De exacte syntaxis die wordt gebruikt, is afhankelijk van het containerplatform:
  • Docker: docker exec -it CONTAINER_NAME sh
  • Podman: podman exec -it CONTAINER_NAME sh
  1. Maak een fstab bestand met behulp van de mtab Bestand: cp /etc/mtab /etc/fstab
  2. Verlaat de container: exit
  3. Maak een back-up van de containerclient vanuit NetWorker.

Tijdelijke oplossing twee:

Maak "archieven" van de docker-containerdata op de docker-host en maak een back-up van de data als een opslagset voor het bestandssysteem vanaf de docker-host. Voor deze aanpak kan enige scripting en het gebruik van cron Banen.

WAARSCHUWING: NetWorker-support biedt geen scriptondersteuning of ondersteuning voor problemen met besturingssysteemscripts. Het onderstaande voorbeeld is alleen voor proof of concept. Het script biedt algemene afstemmingsmogelijkheden en kan aan uw behoeften voldoen, maar gebruik het alleen als u het gedrag ervan volledig begrijpt. U moet coördineren met de systeembeheerder van de docker-host om te zien of deze aanpak accepteert. Werk samen met de systeem- en Docker-beheerder om een script te formuleren dat geschikt is voor uw behoeften met behulp van het algemene procedureoverzicht dat hier wordt beschreven. NetWorker-ondersteuning kan alleen helpen bij algemene NetWorker-back-up/herstelproblemen van de "archief"-tarballs waarvan een back-up is gemaakt door NetWorker.
  1. Maak een bashscript dat de volgende bewerkingen uitvoert:
    1. Stop de docker-container tijdelijk. Dit is om databaseconsistentie in de docker-container te garanderen.
    2. Zip de inhoud van de map van de dockercontainer.
    3. Start de docker-container
    4. (optioneel) archieven ouder dan X dagen opschonen.
#!/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}"
Voorbeeld van scriptgebruik:
[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

U kunt ook een cron-taak maken die het script dagelijks, wekelijks, enzovoort uitvoert (naar eigen goeddunken),

[root@rhel-client01 scripts]# ln -s /root/scripts/backup_npm.sh /etc/cron.daily/backup_npm
[root@rhel-client01 scripts]#
OPMERKING: Aangezien het script de docker-container stopt, is het belangrijk om het archiefscript te plannen gedurende een tijdsbestek dat acceptabel is voor tijdelijke downtime. Dit moet worden gecoördineerd met de systeem- en dockerbeheerders.
  1. Maak een NetWorker-client voor het systeem dat als host voor de docker-containers fungeert. De "Save set" is de directory die gebruikt wordt om de docker tarball archieven te bevatten:

Docker-client

  1. Back-ups van de client maken. De NetWorker Administration Guide bevat meer informatie over het maken van back-upbeleid en planning. NetWorker-documentatie is beschikbaar via: Support voor NetWorker | Handleidingen en documenten 

De back-up van de client bevat de docker archive-tarball data:

[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
De data worden bewaard volgens de bewaarperiode die is ingesteld in de back-upactie.

Een NetWorker-clientherstel wordt gebruikt om de tarball terug te zetten naar de bestaande (of alternatieve) NetWorker-client. De systeem- en dockerbeheerder moeten de volgende stappen uitvoeren om de docker-container opnieuw te configureren met behulp van de herstelde data.

Getroffen producten

NetWorker

Producten

NetWorker
Artikeleigenschappen
Artikelnummer: 000071581
Artikeltype: Solution
Laatst aangepast: 18 apr. 2026
Versie:  8
Vind antwoorden op uw vragen via andere Dell gebruikers
Support Services
Controleer of uw apparaat wordt gedekt door Support Services.