그래서 난 팔로우 중이야이 튜토리얼내 Debian 인스턴스 백업
스크립트를 실행한 후 홈 디렉터리만 백업하도록 설정되어 있음을 확인했습니다. 루트 디렉터리에 있는 모든 것을 NAS의 디렉터리에 백업하고 싶습니다. 그래서 스크립트를 다음과 같이 수정했습니다.
#!/bin/bash
# A script to perform incremental backups using rsync
set -o errexit
set -o nounset
set -o pipefail
readonly SOURCE_DIR="/"
readonly BACKUP_DIR="/link/to/my/nas/Server Backups"
readonly DATETIME="$(date '+%Y-%m-%d_%H:%M:%S')"
readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}"
readonly EXCLUDE="/link/to/my/nas/
readonly LATEST_LINK="${BACKUP_DIR}/latest"
mkdir -p "${BACKUP_DIR}"
rsync -av --delete \
"${SOURCE_DIR}/" \
--link-dest "${LATEST_LINK}" \
--exclude=".cache" \
"${BACKUP_PATH}" \
"${EXCLUDE}"
rm -rf "${LATEST_LINK}"
ln -s "${BACKUP_PATH}" "${LATEST_LINK}"
내 NAS에 있는 거의 모든 것이 삭제되었습니다! 나는 이것을 취소할 방법이 없다고 가정하고 있습니다. 백업이 있다고 해서 세상이 끝나는 것은 아닙니다. 그런데 여기서 정확히 무슨 일이 일어나고 있는 걸까요? ? ? 예상대로 백업되지 않는 이유는 무엇이며 LATEST_LINK 아래의 파일만 삭제하는 이유는 무엇입니까?
실행 스크립트 로그:
root:/utils# ./backup-script.sh
sending incremental file list
rsync: [sender] link_stat "/link/to/my/nas/Server Backups/2023-01-07_15:58:36" failed: No such file or directory (2)
--link-dest arg does not exist: /link/to/my/nas/Server Backups/latest
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(713) [sender=3.2.7]
rsync error: received SIGUSR1 (code 19) at main.c(1613) [generator=3.2.7]
답변1
rsync가 예상하지 못한 작업을 수행하는 이유를 설명해 보겠습니다.
이는 명령 옵션이 첫 번째이고 경로가 끝에 오도록 표준 순서로 다시 작성된 명령입니다. 이는 의미를 바꾸지는 않지만 효과를 설명하는 데 도움이 됩니다.
rsync
-av # Archive mode, verbosely
--delete # Delete in destination if not in source
--link-dest "$LATEST_LINK" # Link unchanged files to a match by name
--exclude ".cache" # Exclude file/directory
"$SOURCE_DIR/" # Source 1
"$BACKUP_PATH" # Source 2
"$EXCLUDE" # Destination
분명히 당신은 --exclude "${EXCLUDE}"
단지 쓰기가 아니라 쓰기를 의미합니다 "${EXCLUDE}"
. 불행히도 당신이 작성하고 실행하는 것은 $EXCLUDE
존재하지 않는 모든 것을 삭제하거나 다운로드하는 효과를 갖습니다 .$SOURCE_DIR
$BACKUP_PATH
다음은 올바르게 작성된 명령입니다.
rsync \
-av \
--delete \
--link-dest "$LATEST_LINK" \
--exclude ".cache" \
--exclude "$EXCLUDE" \
"$SOURCE_DIR/" \
"$BACKUP_PATH"
지금은 도움이 되지 않지만 나중에 참고할 수 있도록 되돌릴 수 없는 다른 작업을 적용하거나 수행하려는 경우 --dry-run
() 플래그를 사용하는 것이 좋습니다. 자주 이용해요!-n
--delete