Rsync(Remote Sync) 는 원격에 있는 파일과 디렉토리를 복사하고 동기화 하기 위해서 사용하는 툴이며 네트워크 프로토콜이다.
리눅스와 유닉스에서는 백업용도로 가장 널리 사용하는 툴이다. 여기서는 centos repository 서버를 가져올 것이다.
Rsync는 CLI툴로 커맨드 라인의 옵션들을 이용해 배치 프로그램을 개발하기 쉽다는 장점이 있다.
cron 등을 이용해 간단하게 백업/미러(mirror) 시스템을 구축할 수 있다.
# Rsync의 장점
# 원격 시스템으로부터 파일을 효율적으로 복사하거나 동기화 할 수 있다.
# link, device, file의 소유자와 그룹 권한등 파일의 부가정보도 복사할 수 있다.
# scp보다 빠르다.
# remote-update 프로토콜을 이용해 차이가 있는 파일만 복사한다. (처음에는 모든 파일과 디렉토리를 복사하지만, 다음부터는 차이가 있는 파일만 복사하여 더 빠르고 효율적으로 작동한다.)
# 데이터를 압축해서 송/수신하기 때문에 더 적은 대역폭을 사용한다.
# Rsync의 동기화 알고리즘
# 파일 전송 결정
기본적으로 rsync는 파일의 크기와 수정 시간(modification)을 비교하는 것으로 파일을 전송하지 말지를 결정한다.
이 방법은 아주 작은 cpu 자원을 소모하지만 실수가 발생할 수 있다. 일반적으로 파일의 내용을 변경하면 크기와 수정시간이 변하지만 항상 그렇다고 단정할 수 없기 때문이다.
--checksum 옵션을 이용하면 비교 방법을 개선할 수 있다. 이 옵션을 켜면, 파일의 checksum을 비교한다.
크기/시간을 이용한 비교보다 안전하지만 더 느리고 더 많은 자원을 사용한다.
# 전송할 파일 부분의 결정
파일 전송을 결정했다고 가정하에, 파일을 전송하기 위한 간단한 방법은 "전체 파일을 그대로 복사" 해버리는 것이다. 쉬운 방법이지만 효율적이지는 않다. 1GB 크기의 파일이 있다고 가정해보자. 여기에는 바뀐 부분이 1k 라고 할 때, 1k 때문에 1GB를 복사하게 될 것이다.
Rsync는 파일의 변경된 부분만 효과적으로 복사하기 위한 알고리즘을 가지고 있다.
Rsync는 파일을 고정 크기를 가지는 청크(chunk)로 나눈 다음에 checksum을 계산한다. 이 checksum을 서로 계산해서 다를 경우 해당 부분의 청크만을 복사한다.
# 기본 사용법
# rsync options source destination
# 주요 옵션들
# -v : verbose
# -r : recursive 데이터 복사
# -a : archive mode. 이 모드를 이용하면 심볼릭 링크, 파일 유저/그룹 권한, timestamp도 복사한다.
# -z : 파일 데이터 압축하여 대역폭수와 시간을 절약할 수 있다.
# --exclude=PATTERN : exclude files matching pattern. 패턴과 매칭되는 파일이나 디렉토리는 제외하는 옵션이다.
ex) rsync -av --exclude"tmp" /home/ /backup
# --delete : delete files that don't exist on sender
# Rsync 설치
# yum install xinetd rsync
# vim /etc/xinetd.d/rsync
# /etc/rc.d/init.d/xinetd start
# chkconfig xinetd on
# vim /etc/rsyncd.conf
# vim /etc/rsync_exclude.lst
싱크에 제외시킬 파일이나 디렉토리를 여기에 적어 놓으면 된다.
# vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 873 -j ACCEPT
# service iptables restart
ex) rsync -avz --delete --exclude-from=/etc/rsync_exclude.lst /var/www/html/ 10.0.0.30::website
# Add in cron if you'd like to run reguraly
# crontab -e
# run at 2:00 AM in a day
00 02 * * * rsync -avz --delete --exclude-from=/etc/rsync_exclude.lst /var/www/html/ 10.0.0.30::website
# 로컬 컴퓨터에서 디렉토리 복사 및 동기화
# 디렉토리를 로컬의 다른 위치로 복사할 수 있다. tmp 디렉토리를 /tmp/backups 디렉토리로 복사.
# rsync -avzh tmp/ /tmp/backups/
만약, tmp/ 에 파일을 하나 추가하고 다시 위의 명령을 내리면 추가된 파일만 복사된다.
또한 그 파일의 내용이 변경되어도 그 파일만 복사된다.
# 서버로부터 파일과 디렉토리를 복사 혹은 동기화
# 로컬 서버에서 원격 서버로 디렉토리 복사
# rsync -avz tmp/ lnx@111.111.11.111:/home/lll/backups
# 원격 서버의 디렉토리를 로컬 서버로 복사
# rsync -avzh lnx#111.111.11.111:/home/lll/backups ./
# ssh 위에서 rsync 사용
rsync는 -e 옵션을 이용하여 ssh, rsh와 같은 remote shell 프로그램을 선택할 수 있다. 보통 안전한 통신을 보장해주는 ssh를 이용한다. -e 옵션이 없다면 ssh를 사용한다.
# rsync server 모드로 사용
# rsync daemon 프로그램 설정
--daemon 옵션을 이용, 서버모드로 작동할 수 있다. xinetd를 이용하여 시스템 서비스로 등록한다.
/etc/xinetd.d/rsync 설정 파일 생성
rsync 설정 파일은 /etc/rsyncd.comf 이다. 설정파일이 없는 경우 직접 만들어줘야 한다.
max connections = 2
log file = /var/log/rsync.log
timeout = 300
[share]
comment = public share
path = /home/lnx -> 복사 디렉토리로 /home/lnx를 선택했다.
read only = no -> 읽기/쓰기 모두 가능하게 했다.
list = yes
uid = nobody -> 디렉토리에 대한 소유자는 nobody.nogroup으로 했다. /home/share 소유자를 nobody.nogroup으로 변경한다.
gid = nogroup
auth users = username -> 접속 허용 유저로 username을 추가했다.
secrets file = /etc/rsyncd.secrets -> auth users에 대한 설정파일은 /etc/rsyncd.secrets에 저장한다.
# /etc/rsyncd.secrets 파일에 접속유저 이름과 패스워드를 지정할 수 있다. 패스워드는 plain/text 이다.
username:mypassword
읽기 테스트
# rsync username@111.111.11.111::lnx
쓰기 테스트
# rsync -avz helloWorld username@111.111.11.111::share
# 데이터 복사 진행 상황 확인
--progress 옵션을 주면, 진행 정도를 화면에 출력한다.
# rsync -avzh --progress username@111.111.11.111:/home/lnx/backups ./
# include, exclude 옵션
include와 exclude 옵션을 이용하여 복사할 파일을 추가하거나 제외시킬 수 있다.
ex) data 디렉토리를 복사에서 제외한다.
# rsync -avz --exclude "data" username@111.111.11.111:/home/lnx/backups ./
# rsync -avz --exclude "*.bak" username@111.111.11.111:/home/lnx/backups ./
# delete 옵션
rsync는 파일이나 디렉토리가 없으면 새로 만든다. 그러나 파일이나 디렉토리가 존재할 경우 삭제하고 싶을 때도 있을 것이다.
이럴 경우 --delete 옵션을 사용한다.
ex) 로컬 서버에 "text.txt"파일이 있으면 삭제한 후 복사
# touch text.txt
# rsync -avz --delete username@111.111.11.111:/home/lnx/backups ./
text.txt가 지워진다.
# 전송할 파일의 최대 크기 정하기
--max-size 옵션을 이용하여 전송할 파일의 최대 크기를 정할 수 있다. 아래는 10k 이내의 파일만 복사하는 예제이다.
# rsync -avz --max-size="10k" username@111.111.11.111:/home/lnx/backups ./
# 성공적으로 전송한 후 원본파일 지우기
--remove-source-files 를 이용하면 전송이 끝난 후 원본 파일을 삭제한다.
# rsync --remove-source-files -zvh backup.tar /tmp/backups/
# Bandwidth 제한 설정
--bwlimit 옵션을 이용하여 파일 전송에 사용할 네크워크 대역폭을 제한할 수 있다. 인터넷 서비스중인 서버에서, 다른 서비스에 영향을 주기 않는 범위내에서 파일 복사를 원할 경우 유용하게 사용할 수 있다.
bwlimit를 사용하여 대역폭을 제한하는 예제이다.
# rsync --bwlimit=100 -avzhe ssh /var/lib/rpm/ root@111.111.11.111:/root/tmprpm/
yum 저장소를 local 머신으로 복사
# mkdir -p /home/lnx/repos/centos/6/7
# yum update && yum install createrepo
# createrepo /home/lnx/repos/centos/6/7
이렇게하면 repomd.xml 파일이 생성된다. 이 메타데이터는 새로운 저장소를 만든다.
# centos 미러링 사이트로 https://www.centos.org/download/mirrors/ 이동하여 rsync 주소를 복사한다.
# rsync -avz --exclude "isos" rsync://ftp.kaist.ac.kr/centos/6.7 /home/lnx/repos/centos/6/7/
iso 파일은 필요없어서 제외시켰다.
이 명령이 끝나니 내 로컬머신에는 37GB의 파일이 복사되어왔다.
# 외장하드를 로컬머신에 마운트시키기
# mkdir /screpo
# fdisk -l -> 외장하드가 어떤 것인지 확인. 여기 올라와있어야 마운트가 가능하다.
# mount -t cifs /dev/외장하드(ex: sdd1) /screpo
# vim /etc/yum.repo.d/seongcheol.repo
만약, yum update 명령을 내렸을 때,
warning: rpmts_HdrFromFdno: Header V4 RSA/SHA1 Signature, key ID 61e8806c: NOKEY
Retrieving key from file:///screpo/centos6_repos/centos/RPM-GPG-KEY-CentOS-6
The GPG keys listed for the "seongcheol centOS6.7 repo. version 1.0" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.
위의 메시지가 보이며 진행이 안된다면...
seongcheol.repo 의 gpgcheck=0 으로 한다. 즉, 1을 0으로 바꾼것이다.
gpg 키를 체크하면서 발생하는 것 같아 0으로 주었더니 잘 되었다.