NetWorker: Docker 컨테이너 NetWorker 클라이언트 백업이 savefs 오류와 함께 실패함: 실패

Summary: NetWorker: Docker 컨테이너 NetWorker 클라이언트 백업이 savefs 오류와 함께 실패함: 실패

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

NetWorker Client 소프트웨어는 Docker 컨테이너 내부에 설치됩니다.
Docker 클라이언트의 클라이언트 기반 백업이 실패하고 다음 오류가 발생합니다.

<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

Docker 컨테이너 내에서 실행되는 NetWorker Client는 현재 릴리즈에서 공식적으로 지원되지 않습니다. Docker는 오버레이 파일 시스템을 사용하고 기존 디스크 레이아웃에 의존하지 않으므로 /etc/fstab과 같은 경로가 없습니다.

Resolution

현재 NetWorker Client로 Docker 컨테이너를 백업하는 방법은 지원되지 않습니다. 이 기능을 NetWorker에 포함하려면 Dell 계정 또는 영업 담당자에게 RFE(Request For Enhancement)에 관해 문의하십시오.

 

NetWorker Client가 Docker 데이터를 백업하지 못하도록 하려면 NetWorker Client에서 Docker 파일/폴더 구조에 대해 건너뛰기 지시문을 사용해야 합니다.

예(시스템 및 Docker 구성에 따라 경로 및 프로세스 수정):

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

NetWorker 보호 지침에 대한 자세한 내용은 NetWorker Administration Guide를 참조하십시오. NetWorker 설명서는 다음을 통해 제공됩니다. NetWorker 지원 | 매뉴얼 및 문서 

 

Docker 컨테이너 데이터를 백업하려면 다음 해결 방법 중 하나를 사용합니다.

해결 방법 1: 

  1. SSH를 통해 Docker 호스트에 액세스합니다.
  2. SSH 세션에서 Docker 컨테이너에 연결합니다. 사용되는 정확한 구문은 컨테이너 플랫폼에 따라 다릅니다.
  • 도커: docker exec -it CONTAINER_NAME sh
  • 포드맨: podman exec -it CONTAINER_NAME sh
  1. 생성 fstab 를 사용하는 파일 mtab 파일에 식별되어 있습니다. cp /etc/mtab /etc/fstab
  2. 컨테이너를 종료합니다. exit
  3. NetWorker에서 컨테이너 클라이언트를 백업합니다.

해결 방법 2:

Docker 호스트에 Docker 컨테이너 데이터의 "아카이브"를 생성하고 Docker 호스트에서 파일 시스템 세이브 세트로 데이터를 백업합니다. 이 접근 방식에는 약간의 스크립팅 및 cron 작업.

경고: NetWorker 지원 서비스는 스크립팅 지원 또는 OS 스크립트 관련 문제에 대한 지원을 제공하지 않습니다. 아래 예는 개념 증명만을 위한 것입니다. 스크립트는 일반적인 튜닝 기능을 제공하며 요구 사항을 충족할 수 있지만 해당 동작을 완전히 이해하는 경우에만 사용합니다. Docker 호스트의 시스템 관리자와 협력하여 이 접근 방식을 허용하는지 확인해야 합니다. 시스템 및 Docker 관리자와 협력하여 여기에 설명된 일반 절차 개요를 사용하여 요구 사항에 적합한 스크립트를 작성합니다. NetWorker 지원은 NetWorker에서 백업한 "아카이브" tarball의 일반적인 NetWorker 백업/복원 문제만 지원할 수 있습니다.
  1. 다음 작업을 수행하는 bash 스크립트를 생성합니다.
    1. Docker 컨테이너를 일시적으로 중지합니다. 이는 Docker 컨테이너의 데이터베이스 일관성을 보장하기 위한 것입니다.
    2. Docker 컨테이너의 폴더 내용을 압축합니다.
    3. Docker 컨테이너 시작
    4. (선택 사항) X일보다 오래된 아카이브를 정리합니다.
#!/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}"
스크립트 사용 예:
[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

또는 스크립트가 매일, 매주 등을 실행할 수 있도록 cron 작업을 만듭니다(재량에 따라).

[root@rhel-client01 scripts]# ln -s /root/scripts/backup_npm.sh /etc/cron.daily/backup_npm
[root@rhel-client01 scripts]#
참고: 스크립트가 Docker 컨테이너를 중지하므로 일시적인 다운타임이 허용될 수 있는 시간 프레임 동안 아카이브 스크립트를 예약하는 것이 중요합니다. 이 작업은 시스템 및 Docker 관리자와 조정해야 합니다.
  1. Docker 컨테이너를 호스팅하는 시스템에 대해 NetWorker Client를 생성합니다. "세이브 세트"는 Docker tarball 아카이브가 포함된 디렉토리에 사용되는 디렉토리입니다.

Docker 클라이언트

  1. 클라이언트의 백업을 수행합니다. 백업 정책 및 스케줄링 생성에 대한 자세한 내용은 NetWorker Administration Guide 를 참조하십시오. NetWorker 설명서는 다음을 통해 제공됩니다. NetWorker 지원 | 매뉴얼 및 문서 

클라이언트 백업에는 Docker archive-tarball 데이터가 포함됩니다.

[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
데이터는 백업 작업에 설정된 보존 기간에 따라 보존됩니다.

NetWorker Client 복원은 기존(또는 대체) NetWorker Client로 tarball을 복구하는 데 사용됩니다. 시스템 및 Docker 관리자는 복구된 데이터를 사용하여 Docker 컨테이너를 재구성하기 위한 후속 단계를 수행해야 합니다.

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.