ssh와 rsync를 이용한 백업

리눅스 시스템 사이에서 백업을 해야 할일이 생겨서 이것저것 찾아 보다가..
rsync를 사용하기로 했습니다.

우선 ssh를 통해서 rsync 백업을 할려고 하면, password를 묻습니다.
한번씩 할 때는 패스워드를 치면 상관없지만, crontab을 사용해서 주기적으로 할려고 하면 문제가 발생합니다.

해결하는 방법을 이것저것 찾았는데 2가지 정도가 나오네요.

첫번째는 ssh-keygen을 통해서 패스워드를 묻지 않게 하는 방법 입니다.

ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): <ENTER>
Enter passphrase (empty for no passphrase): <ENTER>
Enter same passphrase again:  <ENTER>
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:
58:bd:ef:fd:3b:62:79:2e:ea:de:c4:73:2d:7d:11:2b root@web-tl
The key's randomart image is:
+--[ DSA 1024]----+
|                 |
|         .       |
|        . .    . |
|       o   .    o|
|      . S .  E o |
|           .. ..o|
|            .+o.+|
|           .o*o+.|
|          o++.*++|
+-----------------+
cat ~/.ssh/id_dsa.pub | ssh [
원격ID]@[원격HOST] "cat >> .ssh/authorized_keys"
password:
암호입력<ENTER>
# _


이렇게 설정을 해 두면, 해당 원격 서버에 접속할때 암호를 전혀 묻지 않게 됩니다.

# rsync -avzP -e ssh [원격HOST]:/home/source /home/target



이런식으로 백업 하시면 됩니다.

하지만, 뭔가 찝찔하죠..
누구나 이 자리에 앉으면 패스워드를 몰라도 원격 호스트에 접근을 할 수 있게 되죠...


두번째는 sshpass를 사용해서 접근하는 방법니다.
CentOS나 fedora에서는 기본 yum해서는 들어 있지 않습니다.
아래와 같이 epel을 통해서 받습니다.

# sudo su -
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
# yum update
# yum -y install sshpass


이렇게 설치해 주시면 됩니다. 
Ubuntu를 쓰시는 분들은 apt-get으로 받으세요.

# sudo apt-get install sshpass


sshpass을 사용법을 알아보면..  아래와 같습니다.

sshpass -p '[
암호]' ssh [원격ID]@[원격HOST]

# sshpass -p 'myPassword' ssh username@server.example.com


이런식이죠...

그러면, 이걸로 rsync를 해 봐야 겠죠?

# rsync --rsh="sshpass -p myPassword ssh -l username" server.example.com:/var/www/html/ /backup/


이렇게 하시면 됩니다.

쉽죠?

여기서 주기적으로 백업을 하고 싶다면..

# crontab -e


이렇게 뛰우시고 내용을 수정하시면 됩니다.

*/5 * * * * rsync --rsh="sshpass -p myPassword ssh -l username" server.example.com:/var/www/html/ /backup/


이렇게 두면 5 주기로 백업이 진행 됩니다.

 

출처 - http://gyuha.tistory.com/445







 

Linux 에서는 rsync 라는 훌륭한 명령어가 있다.

 

rsync 는 UNIX 에서 파일 전송에 사용하는 명령어이다.  rsync 는 "rsync" 라는 알고리즘을 사용하여 아주 빠른 속도로 원격에 있는 파일을 가져와서 동기화 시킨다. rsync 는 파일들의 다른 부분만 전송을 하여 이러한 일을 수행한다.

 

회사에서 혹은 집에서 Linux Server 가 있다면, rsync 를 이용하여 자신의 중요한 자료를 백업할 수 있다.

 

백업서버에 설치되어야 할 프로그램은 rsync, ssh server 이다.

 

백업서버를 위한 운영체제는 Ubuntu 혹은  Debian 이라고 가정한다.

여기서 Debian 을 중심으로 설명을 하겠다. :) (Ubuntu 에서는 sudo 혹은 root 권한을 획득하여 프로그램을 설치 하도록 한다.)

 

백업서버를 설정하는 방법은 총 3단계로 나눌 수 있다.

  1. openssh 설치, ssh 로 접속시 암호를 묻지 않고 접속하기 위한 authorized_keys 등록
  2. rsync 설치, rsync daemon 설정
  3. 백업 script 작성

 

1. openssh 설치

 

● 백업서버에 openssh 를 설치한다.

 root@outland:/home/starbloood/# apt-get install ssh

 

● 백업서버에 백업할 사용자의 홈 디렉토리에 .ssh 디렉토리를 생성한다.

 starblood@outland:~$ mkdir .ssh

 

● 클라이언트 PC 에서 아래와 같은 명령어로 public key 를 발급받는다.

 starblood@northrend:~$ ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/home/starblood/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/starblood/.ssh/id_rsa.
Your public key has been saved in /home/starblood/.ssh/id_rsa.pub.
The key fingerprint is:
cb:17:d8:17:b3:ff:9f:b5:a1:c6<wbr style="font-family: Verdana; line-height: normal; background-color: rgb(255, 255, 255); font-size:10pt; " />:1c:cb:4f:ba:5e:7f starblood@northrend

 

● 클라이언트의 public key 를 백업 서버로 전송한다. (public key 파일을 authorized_keys 파일로 이름을 바꾼다.)

 starblood@northrend:~$ scp .ssh/id_rsa.pub starblood@outland:~/.ssh/authorized_keys

 

2. rsync 설치, rsync daemon 설정

 

● rsync 설치

 root@outland:/home/starblood# apt-get install rsync

 

● rsync daemon 설정

 root@outland:/home/starblood# vi /etc/default/rsync

 

 # defaults file for rsync daemon mode

 

# start rsync in daemon mode from init.d script?

#  only allowed values are "true", "false", and "inetd"

#  Use "inetd" if you want to start the rsyncd from inetd,

#  all this does is prevent the init.d script from printing a message

#  about not starting rsyncd (you still need to modify inetd's config yourself).

RSYNC_ENABLE=false <= 이부분을 true 로 바꾸어 준다.

 

# which file should be used as the configuration file for rsync.

# This file is used instead of the default /etc/rsyncd.conf

# Warning: This option has no effect if the daemon is accessed

#          using a remote shell. When using a different file for

#          rsync you might want to symlink /etc/rsyncd.conf to

#          that file.

# RSYNC_CONFIG_FILE=

 

:wq (저장하고 빠져 나온다)

 

● rsync daemon 을 재시작한다.

 root@outland:/home/starblood# /etc/init.d/rsync restart

 

 

3. 백업 script 작성

 

● 에디터로 아래와 같은 스크립트를 작성한다.

 starblood@northrend:~$ vi backup.sh

 

 #!/bin/bash

# Backup my precious documents my Backup Server(Debian)

# Backup documents

rsync -a -e ssh --delete documents/ starblood@outland:~/backup/Users/starblood/documents/

 

● 스크립트 파일에 실행 권한을 준다.

 starblood@northrend:~$ chmod +x backup.sh

 

 

마지막으로 백업을 수행한다.

 starblood@northrend:~$ ./backup.sh

 

백업 스크립트는 자신의 환경에 맞게 알맞게 수정하여 사용하면 된다. :)

 

출처 - http://blog.naver.com/johnforstar?Redirect=Log&logNo=30129627928

 





 

rsync3 고속으로 diff 백업

rsync --link-dest --rsync-path

<cite style="font-weight: bold; font-style: normal; ">hkataoka 대충쓴 일기</cite>

 

결국 이렇게 되었다(현 단계에서 메모)

CMD=/usr/local/bin/rsync

STRAGE=/var/backup

OLDEST=`date --date '7 days ago' +%Y%m%d`
											

LATEST=`date --date '1 days ago' +%Y%m%d`
											

 

for HOST in
								`ls $STRAGE`;
												

do
					


					if
							[
									-f
											$STRAGE/$HOST
															]
																	;
																			then
																				


					continue
						


					fi
						

 


					HOSTNAME=`cat $STRAGE/$HOST/hostname.txt`
								


					echo
							"backup start : $HOSTNAME"
											

 


					if
							[
									-d
											$STRAGE/$HOST/$OLDEST
																	]
																			;
																					then
																						


					rm -fr $STRAGE/$HOST/$OLDEST
												


					fi
						

 


					if
							[
									-d
											$STRAGE/$HOST/current ]
																	;
																			then
																				


					mv
							$STRAGE/$HOST/current $STRAGE/$HOST/$LATEST
																


					fi
						

 


					$CMD -az --delete \

  --link-dest="../$LATEST/" \

  --rsync-path="sudo $CMD" \

  --exclude-from=$STRAGE/$HOST/excludes.txt \

  backup@$HOST:/ $STRAGE/$HOST/current/

 

done;
					

로칼IP 동일한 명칭으로 디렉토리를 작성하면 백업 대상으로소 등록 되는 구조

아래는 초기설정, 타겟마다 설정

#-------------------------
					

# 초기설정
					

#-------------------------
					

scp backup.sh root@192.168.1.177:

ssh root@192.168.1.177
												

ssh-keygen -t rsa

useradd -G wheel backup

passwd backup

 

# rsync3 인스톨
					

cd /usr/local/src/

wget http://rsync.samba.org/ftp/rsync/rsync-3.0.7.tar.gz

tar xzfv rsync-3.0.7.tar.gz 

cd rsync-3.0.7
											

./configure

make

make install
						

 

#-------------------------
					

# 타겟마다 설정
					

#-------------------------
					

ssh work@192.168.1.172
												

su -

 

# rsync3 인스톨
					

cd /usr/local/src/

wget http://rsync.samba.org/ftp/rsync/rsync-3.0.7.tar.gz

tar xzfv rsync-3.0.7.tar.gz 

cd rsync-3.0.7
											

./configure

make

make install
						

 

# 백업유저 추가, sudo설정
					

useradd backup

visudo

backup ALL= NOPASSWD:/usr/local/bin/rsync

 

# 필요에 따라 공개키인증을 유효화 한다
					

vi /etc/ssh/sshd_config

RSAAuthentication yes

PubkeyAuthentication yes

AuthorizedKeysFile .ssh/authorized_keys

 

# 백업 서버로 부터 공개키인증으로 로그인이 가능하도록 한다.
					

su - backup

vi ~backup/.ssh/authorized_keys

 

출처 - http://blog.naver.com/parkjy76?Redirect=Log&logNo=30135329075

 





 


리눅스 서버는 별도의 건물에 있고, 각종 외장 하드는 책상 주변에 있으니, 윈도우 데스크탑에서 리눅스 서버의 자료를 백업할 방법을 효과적인 방안을 모색해야 한다. ftp로 접속하여 파일을 가져오는 것은 대단히 미련하다. 항상 "전체 백업"만 해야 되기 때문이다. 리눅스쪽의 하드 디스크 드라이브를 samba를 이용하여 윈도우쪽에 연결한 뒤 SyncBack으로 백업하는 방법도 생각해 보았다. 그러나 samba 설정이 생각보다 어렵다. 분명히 대학원 시절에는 성공했었던 것 같은데, 보안 설정이 예전보다 까다로워진 모양일까, 잘 안된다.

   

그러면 반대의 방법으로 윈도우쪽 백업 매체를 공유로 설정한 뒤 리눅스에서 마운트한 다음 rsync로 백업하는 방법도 있다. 최종적으로 성공한 방법은 이것이다. 다음의 절차에 따르도록 한다.

   

  1. 탐색기->폴더옵션->보기->고급 설정에서 "모든 사용자에게 동일한 폴더 공유 권한을 지정(권장)"이 해제되어 있는지 확인한다.
  2. 제어판->관리 도구->컴퓨터 관리->로컬 사용자 및 그룹->사용자에서 오른쪽 마우스 버튼을 눌러 "새 사용자"를 연다. 새 사용자를 등록하되 "다음 로그온할 때 반드시 암호 변경"을 해제하고 "암호 사용 기간 제한 없음"을 설정한다.
  3. 백업 매체가 될 폴더의 공유를 설정한다. 공유 이름(share name)을 잘 기억해 둔다.  사용자 이름에서 Everyone은 제거하고, 새로 추가한 사용자를 넣되 모든 권한을 준다.
  4. 이제 리눅스쪽에서 다음과 같이 입력하여 마운트한다.

mount -t cifs -o username=<user_name>,passwd=<password> //<IP address>/<share_name> <mount할 위치>

   

CIFS(Common Internet File System)는 처음 접하는 파일 시스템 타입이다.

   

마운트가 끝났으면 rsync를 이용하여 작업하면 된다. 마치 리눅스 머신 안에서 파일들을 옮기는 것과 다를 바가 없으므로, rsync 서버의 설정은 필요 없이 오직 client만으로 작동할 수 있다.

   

rsync -avz src/bar    /mnt/win/backup

   

이렇게 하면 목적지인 /mnt/win/backup 아래에 bar라는 디렉토리가 생기면서 옮겨지게 된다.

   

rsync -avz src/bar/ /mnt/win/backup

   

원본 디렉토리 뒤에 슬래쉬를 붙이면 결과가 달라진다. /mnt/win/backup 아래에 bar 디렉토리를 만들지 않고, 대신 bar 디렉토리의 내용물을 옮기게 된다.

   

만일 원본에 더 이상 존재하지 않는 파일을 타겟에서도 제거하려면 다음과 같이 한다. 일종의 동기화인 셈이다.

   

rsync -avz --delete src/bar /mnt/win/backup

   

경험상 원본 파일을 tar로 묶어 버린 뒤 ftp로 옮겨 버리는 것이 가장 쉽고도 빠른 방법이었다. 그러나 이 방법은 원본이 변경된 경우 전체 백업을 새로 해야 하므로 백업 유지가 매우 불리해진다. rsync를 이용하면 파일과 디렉토리 구조에 전혀 신경을 쓰지 않아도 되는 장점이 있으나, 원본과 타겟을 스캔하고 파일 하나씩을 옮기는 데 시간이 좀 걸린다. 특히 phd file과 같이 한 디렉토리 안에 많은 수의 파일이 있을 때에는 스캔과 복사에 상당한 시간이 소요된다.

   

생산된지 오래 되어 잘 쓰지 않게 된 파일은 묶어 두고, 작업 중인 자료들은 폴더 구조를 유지한 채 rsync로 정기적 백업을 하는 것이 가장 적당할 듯.

 

[출처] 리눅스쪽의 자료 백업하기(윈도우 공유 폴더와 rsync 이용)|작성자 따봐

 

 

 

Posted by linuxism

댓글을 달아 주세요