리눅스
rsync 하기
MadDog
2011. 1. 6. 14:13
반응형
보통 rsync는 원격지의 파일을 현재 로컬 내 PC로 땡겨오는대 주로 많이 쓰입니다.
rsync의 작동원리는 정확히 모릅니다.
하지만 rsync를 알게되고 부터는 원격지에서 서버의 데이터를 백업받을 때 사용하고 있습니다.
실제 서비스되고 있는 NewAL.NET 서버와 가상의 경우를 예로 들어봅시다.
NewAL.NET 서버는 IDC 구석에 꼴아박혀 불쌍하게도 나홀로 24시간 돌고 있습니다.
/home 디렉토리에는 여러 계정이 있고, 그 계정들은 계속 파일들이 갱신되거나 추가, 혹은 삭제되곤 합니다.
만약 /home 디렉토리에 대해 백업을 해야한다고 합시다.
가장 좋은건 NewAL.NET 서버에 /home 디렉토리를 통째로 압축해서 /root 안에 둔다거나할 수 있겠죠.
하지만 하드가 맛이 갔다면? 이런 쒯입니다.
기껏 백업받은게 전혀 필요가 없게됐죠.
하지만 전 ein1.com 이라는 백업서버를 두고 NewAL.NET의 모든 자료를 백업받고 있습니다.
NewAL.NET 서버는 페도라6 / ein1.com은 CentOS 6 입니다.
즉, NewAL.NET 서버가 폭파해도 ein1.com에 백업받은 데이터는 살아있게 되는 것이죠.
이것을 서버관리자가 생각날 때 마다 일일이 /home 압축해서 ein1.com에 업로드하고 이런 젠장 너무 짜증납니다. 용량도 지랄 맞습니다.. (전 무려 38GB나 되네요..)
이런 경우가 발생했을 때, 가장 쉽고 빠르게 대처할 수 있는 것이 바로 rsync 입니다.
이제부터 rsync를 통한 백업에 대해 설명해 보고자 합니다. 기억해 둡시다.
ein1.com은 백업서버, NewAL.NET은 실제 서비스 되는 서버입니다.
ein1.com / NewAL.NET 서버에 rsync를 설치합니다.
일단 ein1.com / NewAL.NET 둘다 rsync가 설치되어 있어야합니다.
# rsync 패키지 설치여부 확인
rsync의 작동원리는 정확히 모릅니다.
하지만 rsync를 알게되고 부터는 원격지에서 서버의 데이터를 백업받을 때 사용하고 있습니다.
실제 서비스되고 있는 NewAL.NET 서버와 가상의 경우를 예로 들어봅시다.
NewAL.NET 서버는 IDC 구석에 꼴아박혀 불쌍하게도 나홀로 24시간 돌고 있습니다.
/home 디렉토리에는 여러 계정이 있고, 그 계정들은 계속 파일들이 갱신되거나 추가, 혹은 삭제되곤 합니다.
만약 /home 디렉토리에 대해 백업을 해야한다고 합시다.
가장 좋은건 NewAL.NET 서버에 /home 디렉토리를 통째로 압축해서 /root 안에 둔다거나할 수 있겠죠.
하지만 하드가 맛이 갔다면? 이런 쒯입니다.
기껏 백업받은게 전혀 필요가 없게됐죠.
하지만 전 ein1.com 이라는 백업서버를 두고 NewAL.NET의 모든 자료를 백업받고 있습니다.
NewAL.NET 서버는 페도라6 / ein1.com은 CentOS 6 입니다.
즉, NewAL.NET 서버가 폭파해도 ein1.com에 백업받은 데이터는 살아있게 되는 것이죠.
이것을 서버관리자가 생각날 때 마다 일일이 /home 압축해서 ein1.com에 업로드하고 이런 젠장 너무 짜증납니다. 용량도 지랄 맞습니다.. (전 무려 38GB나 되네요..)
이런 경우가 발생했을 때, 가장 쉽고 빠르게 대처할 수 있는 것이 바로 rsync 입니다.
이제부터 rsync를 통한 백업에 대해 설명해 보고자 합니다. 기억해 둡시다.
ein1.com은 백업서버, NewAL.NET은 실제 서비스 되는 서버입니다.
ein1.com / NewAL.NET 서버에 rsync를 설치합니다.
일단 ein1.com / NewAL.NET 둘다 rsync가 설치되어 있어야합니다.
# rsync 패키지 설치여부 확인
[root@newal ~]# rpm -qa |grep rsync
rsync-2.6.9-2.fc6
[root@newal ~]#
rsync-2.6.9-2.fc6
[root@newal ~]#
#만약 rsync가 안나온다면 yum을 이용해 설치합니다.
[root@newal ~]# yum -y install rsync openssh*
-y 옵션은 무조건 yum 실행 후 나오는 선택문 (y,n) 에서 무조건 yes한다는 뜻입니다.두대의 서버에 모두 rsync를 설치했다면 이제 SSH 설정을 해야합니다.
ein1.com 서버에서는 rsync를 통해 NewAL.NET 서버에 접근하여 /home 디렉토리를 그대로 땡겨와야 합니다.
즉, ein1.com 서버가 => NewAL.NET 서버로 접속한다는 뜻이죠.
하지만, ein1.com 서버와 NewAL.NET 서버는 서로 신뢰하는 서버가 아닙니다.
즉, 두 서버는 완전히 다른 서버라는 뜻이고 서로 경계하고 있다고 봐야합니다.
아무것도 없이 ein1.com 서버가 NewAL.NET 서버에가서..
'야 거기 NewAL.NET. 나 ein1.com 인데 니 /home 디렉토리 아래 있는 모든파일 내놔'
이게 과연 될까요? 전혀 불가능한 예깁니다. 미쳤다고 누가 줍니까.. -_-
이것이 가능하기 위해서는 무언가 두 서버간에 서로 약속된 키(열쇠)가 있어야합니다.
그래야만 열쇠로 문을열고 서로의 서버 안으로 접근할 수 있게 되겠죠.
그 열쇠가 바로 SSH 키입니다.
이제 이 SSH 키를 생성해야 합니다.
자 그럼 키는 누가 만들어야하는가..
ein1.com => NewAL.NET 이렇게 접속해야합니다.
그러니 키를 NewAL.NET이 만들어서 ein1.com 한테 줘야하나요?
그렇게 생각하셨겠지만 틀렸습니다. 이는 보안 문제가 엄청 심각해집니다.
즉 키하나 유출되면 서버가 끝장이죠..
그로인해 ein1.com이 키를 만들어 NewAL.NET에 심어두는 거죠..
이렇게되면 NewAL.NET은 ein1.com에서 생성한 키가 내 PC에 있는지 확인하고 있다면 ein1.com의 접근을 허락하게 됩니다.
# ein1.com에서의 SSH 키 생성
[root@ein1 ~]# ssh-keygen -d
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): [엔터]
Enter passphrase (empty for no passphrase): [엔터]
Enter same passphrase again: [엔터]
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
.................................................................. root@ein1.com
[root@ein1~]#
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): [엔터]
Enter passphrase (empty for no passphrase): [엔터]
Enter same passphrase again: [엔터]
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
.................................................................. root@ein1.com
[root@ein1~]#
마지막 줄은 보안상 ....... 처리했습니다.
Enter passphrase (empty for no passphrase): [엔터]
이부분에에 비밀번호를 입력할 수 있습니다.
하지만 비밀번호 없이 rsync를 바로 땡겨쓰기 위해서는 엔터 공란으로 가야합니다.
# 공용키 /root/.ssh/id_dsa.pub 파일을 NewAL.NET 서버에 올려야합니다.
우선 NewAL.NET 서버에 .ssh 폴더를 생성합니다.
ssh-keygen을 실행하여 키를 생성하면 .ssh 폴더가 자동 생성되지만 한번도 안해봤다면 수동으로 생성합니다. 퍼미션은 아무도 접근못하게 700으로 줘야합니다.
[root@newal ~]# cd ~
[root@newal ~]# mkdir .ssh
[root@newal ~]# chmod 700 .ssh
[root@newal ~]# mkdir .ssh
[root@newal ~]# chmod 700 .ssh
이제 ein1.com 서버에서 아래 명령을 실행합니다.
# scp -p ~/.ssh/id_dsa.pub root@222.237.78.65:~/.ssh/authorized_keys2
NewAL.NET 서버의 root 계정의 비밀번호를 입력하면 NewAL.NET 서버의 위에 생성한 /root/.ssh/ 디렉토리 아래 authorized_keys2 파일을 생성하게 됩니다.
이렇게 함으로써 이젠 ein1.com 서버가 NewAL.NET 서버에 아무런 제약 없이 바로 키를 가지고 내부로 접근할 수 있게 됩니다.
이제 모든게 끝났습니다.
ein1.com에 /backup 디렉토리를 만들고 아래 명령을 실행하여 NewAL.NET의 /home 디렉토리를 땡겨와 봅시다.
# rsync를 통해 NewAL.NET 서버의 /home 디렉토리 전체를 땡겨옵니다.
# mkdir /backup
# rsync -avzP -e ssh 222.237.78.65:/home/ /backup/
# rsync -avzP -e ssh 222.237.78.65:/home/ /backup/
이로써 ein1.com 서버의 /backup 디렉토리에는 NewAL.NET의 /home 디렉토리 아래 모든 하위 디렉토리 포함 파일을 퍼미션 정보와 함께 그대로 땡겨와서 저장하게 됩니다.
처음 실행 시에는 조금 시간이 오래 걸립니다.
하지만, 처음 실행 이후에는 rsync의 최대 장점인 변경된 파일에 대해서만 땡겨오게 됩니다.
그로인해 NewAL.NET의 /home 디렉토리와 ein1.com의 /backup 디렉토리를 서로 동기화가 되는 것이죠.
이제 이놈을 Cron(크론)에 올려놓으면 금상첨화겠네요.
# touch /etc/cron.daily/rsync
# vi /etc/cron.daily/rsync
========================= // rsync 파일 내용은 아래와 같이 하고 저장합니다.
#!/bin/sh
rsync -avzP -e ssh 222.237.78.65:/backup/ /backup/
# vi /etc/cron.daily/rsync
========================= // rsync 파일 내용은 아래와 같이 하고 저장합니다.
#!/bin/sh
rsync -avzP -e ssh 222.237.78.65:/backup/ /backup/
페도라의 경우 cronttab에 /etc/cron.daily 디렉토리 안에 있는 모든 파일이 매일 실행됩니다.
/etc/cronttab 파일을 열어보면 아래와 같이 되어 있을 겁니다.
02 4 * * * root run-parts /etc/cron.daily
<출처 : http://newal.net/tag/rsync>
반응형