본문 바로가기
IT/Linux

디렉터리 백업 (복사)에 rsync 를 사용하자

by blogger 2021. 3. 31.

rsync란 무엇인가

rsync는 컴퓨터 시스템 상에서 파일을 효율적으로 전송하고 동기화하기 위한 유틸리티의 하나로, 파일의 타임스탬프와 크기를 검사함으로써 이루어진다. wikipedia

홈페이지 : https://rsync.samba.org

그러니까 왜 써야 하는거지?

파일을 복사할 때 어떤 방법을 사용하고 있나요?

(1) GUI 사용 : 마우스 우클릭 메뉴의 복사/붙여넣기
(2) 단축키 : Ctrl + C / Ctrl + V

(3) cp 명령어

## cp 를 사용할 경우, 가급적이면 -p 옵션을 사용하도록 하자.
## -p --preserve  원본 파일의 권한, 소유주, 시간 정보등을 그대로 보존
cp -ap $from $to

사실 하고 싶은 얘기는 cp로 파일복사를 하는 경우 진행상태에 대한 정보가 부족해서 언제까지 기다려야 하는지 알 수 없는 답답함에 있었다. 단순히 사이즈가 작은 파일 몇개를 복사하는 경우에는 별다른 차이를 느끼지 못할 수 있다. 하지만 복사할 파일의 수가 많거나 (

예를 들면 레포지터리를 그냥 복사한다던지

), 파일의 크기가 큰 경우에는 rsync 를 사용하는게 보다 유용할 수 있을 것이다.

사용방법

rsync 명령어에는 많은 옵션들이 있다. 복사 대상을 외부 저장소로 지정하는 등 수많은 옵션이 지원되지만 로컬에서 로컬로 복사하는 경우에는 다음과 같이 하면 된다.
--delete 옵션을 통해 목적지에 파일이 존재하는 경우 지우고 복사한다. 불필요한 경우 빼고 사용하면 된다.

rsync -azvhP --delete from to

cp랑 뭐가 다른거지?
--progress (-P) 이거 하나만으로도 사용할 명분은 충분한 듯 하다.

이제 주기적으로 특정 디렉터리를 백업해야 하는 경우 crontab을 활용하여 다음과 같이 간단하게 설정할 수 있다.
crontab에 설정할 경우 불필요하게 progress를 보여줄 필요는 없으므로 -P (--progress) 옵션은 빼도 된다.

0 3 * * * rsync -azvh --delete $from $to

rsync option

Options
 -v, --verbose increase verbosity
     --info=FLAGS fine-grained informational verbosity
     --debug=FLAGS fine-grained debug verbosity
     --msgs2stderr special output handling for debugging
 -q, --quiet suppress non-error messages
     --no-motd suppress daemon-mode MOTD (see manpage caveat)
 -c, --checksum skip based on checksum, not mod-time & size
 -a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
     --no-OPTION turn off an implied OPTION (e.g. --no-D)
 -r, --recursive recurse into directories
 -R, --relative use relative path names
     --no-implied-dirs don't send implied dirs with --relative
 -b, --backup make backups (see --suffix & --backup-dir)
     --backup-dir=DIR make backups into hierarchy based in DIR
     --suffix=SUFFIX set backup suffix (default ~ w/o --backup-dir)
 -u, --update skip files that are newer on the receiver
     --inplace update destination files in-place (SEE MAN PAGE)
     --append append data onto shorter files
     --append-verify like --append, but with old data in file checksum
 -d, --dirs transfer directories without recursing
 -l, --links copy symlinks as symlinks
 -L, --copy-links transform symlink into referent file/dir
     --copy-unsafe-links only "unsafe" symlinks are transformed
     --safe-links ignore symlinks that point outside the source tree
     --munge-links munge symlinks to make them safer (but unusable)
 -k, --copy-dirlinks transform symlink to a dir into referent dir
 -K, --keep-dirlinks treat symlinked dir on receiver as dir
 -H, --hard-links preserve hard links
 -p, --perms preserve permissions
 -E, --executability preserve the file's executability
     --chmod=CHMOD affect file and/or directory permissions
 -A, --acls preserve ACLs (implies --perms)
 -X, --xattrs preserve extended attributes
 -o, --owner preserve owner (super-user only)
 -g, --group preserve group
     --devices preserve device files (super-user only)
     --copy-devices copy device contents as regular file
     --specials preserve special files
 -D same as --devices --specials
 -t, --times preserve modification times
 -O, --omit-dir-times omit directories from --times
 -J, --omit-link-times omit symlinks from --times
     --super receiver attempts super-user activities
     --fake-super store/recover privileged attrs using xattrs
 -S, --sparse handle sparse files efficiently
     --preallocate allocate dest files before writing them
 -n, --dry-run perform a trial run with no changes made
 -W, --whole-file copy files whole (without delta-xfer algorithm)
 -x, --one-file-system don't cross filesystem boundaries
 -B, --block-size=SIZE force a fixed checksum block-size
 -e, --rsh=COMMAND specify the remote shell to use
     --rsync-path=PROGRAM specify the rsync to run on the remote machine
     --existing skip creating new files on receiver
     --ignore-existing skip updating files that already exist on receiver
     --remove-source-files sender removes synchronized files (non-dirs)
     --del an alias for --delete-during
     --delete delete extraneous files from destination dirs
     --delete-before receiver deletes before transfer, not during
     --delete-during receiver deletes during the transfer
     --delete-delay find deletions during, delete after
     --delete-after receiver deletes after transfer, not during
     --delete-excluded also delete excluded files from destination dirs
     --ignore-missing-args ignore missing source args without error
     --delete-missing-args delete missing source args from destination
     --ignore-errors delete even if there are I/O errors
     --force force deletion of directories even if not empty
     --max-delete=NUM don't delete more than NUM files
     --max-size=SIZE don't transfer any file larger than SIZE
     --min-size=SIZE don't transfer any file smaller than SIZE
     --partial keep partially transferred files
     --partial-dir=DIR put a partially transferred file into DIR
     --delay-updates put all updated files into place at transfer's end
 -m, --prune-empty-dirs prune empty directory chains from the file-list
     --numeric-ids don't map uid/gid values by user/group name
     --usermap=STRING custom username mapping
     --groupmap=STRING custom groupname mapping
     --chown=USER:GROUP simple username/groupname mapping
     --timeout=SECONDS set I/O timeout in seconds
     --contimeout=SECONDS set daemon connection timeout in seconds
 -I, --ignore-times don't skip files that match in size and mod-time
 -M, --remote-option=OPTION send OPTION to the remote side only
     --size-only skip files that match in size
     --modify-window=NUM compare mod-times with reduced accuracy
 -T, --temp-dir=DIR create temporary files in directory DIR
 -y, --fuzzy find similar file for basis if no dest file
     --compare-dest=DIR also compare destination files relative to DIR
     --copy-dest=DIR ... and include copies of unchanged files
     --link-dest=DIR hardlink to files in DIR when unchanged
 -z, --compress compress file data during the transfer
     --compress-level=NUM explicitly set compression level
     --skip-compress=LIST skip compressing files with a suffix in LIST
 -C, --cvs-exclude auto-ignore files the same way CVS does
 -f, --filter=RULE add a file-filtering RULE
 -F same as --filter='dir-merge /.rsync-filter'
                             repeated: --filter='- .rsync-filter'
     --exclude=PATTERN exclude files matching PATTERN
     --exclude-from=FILE read exclude patterns from FILE
     --include=PATTERN don't exclude files matching PATTERN
     --include-from=FILE read include patterns from FILE
     --files-from=FILE read list of source-file names from FILE
 -0, --from0 all *-from/filter files are delimited by 0s
 -s, --protect-args no space-splitting; only wildcard special-chars
     --address=ADDRESS bind address for outgoing socket to daemon
     --port=PORT specify double-colon alternate port number
     --sockopts=OPTIONS specify custom TCP options
     --blocking-io use blocking I/O for the remote shell
     --stats give some file-transfer stats
 -8, --8-bit-output leave high-bit chars unescaped in output
 -h, --human-readable output numbers in a human-readable format
     --progress show progress during transfer
 -P same as --partial --progress
 -i, --itemize-changes output a change-summary for all updates
     --out-format=FORMAT output updates using the specified FORMAT
     --log-file=FILE log what we're doing to the specified FILE
     --log-file-format=FMT log updates using the specified FMT
     --password-file=FILE read daemon-access password from FILE
     --list-only list the files instead of copying them
     --bwlimit=RATE limit socket I/O bandwidth
     --outbuf=N|L|B set output buffering to None, Line, or Block
     --write-batch=FILE write a batched update to FILE
     --only-write-batch=FILE like --write-batch but w/o updating destination
     --read-batch=FILE read a batched update from FILE
     --protocol=NUM force an older protocol version to be used
     --iconv=CONVERT_SPEC request charset conversion of filenames
     --checksum-seed=NUM set block/file checksum seed (advanced)
 -4, --ipv4 prefer IPv4
 -6, --ipv6 prefer IPv6
     --version print version number
(-h) --help show this help (-h is --help only if used alone)

'IT > Linux' 카테고리의 다른 글

Linux 사용시 유용한 환경 변수와 프로필 구성  (0) 2024.08.12