2013. 12. 23. 10:17

[Linux/Ubuntu Backup] network, internet, tcp/ip로 백업하기 (ssh, tar, rsync)

[Research/Ubuntu] - [Linux/Ubuntu Backup][01] tar, gzip, bzip2 사용하기 에서 local 파일로 백업하는 과정을 확인하였다. openssh는 원격 로그인, 원격 실행, 그리고 원격 파일 복사를 안전하게 인터넷으로 실행하는 도구를 제공한다.


ssh와 tar로 백업하기


linux 시스템에서는 OpenSSH 명령으로 여러대의 client pc로 부터 백업 정보를 모울 수 있다. 다음은 remote site에 tar 명령을 실행한다. (우선, 테스를 위해 ubuntu desktop과 ubuntu server(ssh-server 설치)를 준비한다. desktop은 검은색 배경을, server는 회색 배경으로 표기한다. server ip는 192.168.182.162로 가정한다.)


우선 서버에 있는 파일을 client로 가져오는 것을 테스트해 보자.

greenfish@ubuntu:~$ mkdir server_data

greenfish@ubuntu:~$ cd server_data

greenfish@ubuntu:~/server_data$ vi server_file_001.txt

greenfish@ubuntu:~/server_data$ vi server_file_002.txt

greenfish@ubuntu:~/server_data$ ls -la

total 16

drwxr-xr-x 2 greenfish greenfish 4096 2013-12-20 13:19 .

drwxr-xr-x 4 greenfish greenfish 4096 2013-12-20 13:19 ..

-dw-r--r-- 1 greenfish greenfish   15 2013-12-20 13:19 server_file_001.txt

-dw-r--r-- 1 greenfish greenfish   15 2013-12-20 13:19 server_file_002.txt

greenfish@ubuntu:~/server_data$

즉, server에는 server_data 경로에 server_file_*.txt 파일 2개가 존재한다.

아래와 같이 client에 명령을 전달하면, server로 부터 파일을 백업하여 가져온다.

~$ mkdir backup_000 ; cd backup_000

~/backup_000$ ssh 192.168.182.162 'tar cf - server_data/*.*' | tar xvf -

greenfish@192.168.182.162's password: 

server_data/server_file_001.txt

server_data/server_file_002.txt

~/backup_000$ ls -la

total 12

drwxr-xr-x  3 greenfish greenfish 4096 2013-12-20 13:22 .

drwxr-xr-x 25 greenfish greenfish 4096 2013-12-20 13:21 ..

drwxr-xr-x  2 greenfish greenfish 4096 2013-12-20 13:22 server_data

~/backup_000$ cd server_data

~/backup_000/server_data$ ls -la

total 16

drwxr-xr-x 2 greenfish greenfish 4096 2013-12-20 13:22 .

drwxr-xr-x 3 greenfish greenfish 4096 2013-12-20 13:22 ..

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 13:19 server_file_001.txt

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 13:19 server_file_002.txt

~/backup_000/server_data$


아래와 같이 server에 client 파일을 받을 경로를 생성한다.

greenfish@ubuntu:~$ mkdir client_data

greenfish@ubuntu:~$ cd client_data

greenfish@ubuntu:~/client_data$ ls -la

total 8

drwxr-xr-x 2 greenfish greenfish 4096 2013-12-20 13:29 .

drwxr-xr-x 4 greenfish greenfish 4096 2013-12-20 13:29 ..

greenfish@ubuntu:~/client_data$


그럼 아래와 같이 client 파일들을 server로 전송한다.

~$ cd poem

~/poem$ ls -la

total 24

drwxr-xr-x  2 greenfish greenfish 4096 2013-12-20 13:30 .

drwxr-xr-x 27 greenfish greenfish 4096 2013-12-20 13:30 ..

-rw-r--r--  1 greenfish greenfish 1221 2013-12-19 17:10 AcrossTheUniverse.txt

-rw-r--r--  1 greenfish greenfish 1476 2013-12-19 16:38 AnnabelLee.txt

-rw-r--r--  1 greenfish greenfish  895 2013-12-19 15:51 BlowingInTheWind.txt

-rw-r--r--  1 greenfish greenfish 1506 2013-12-19 15:45 StillFallsTheRain.txt

~/poem$ tar cf - *.* | ssh 192.168.182.162 'cd client_data ; tar xvf -'

greenfish@192.168.182.162's password: 

AcrossTheUniverse.txt

AnnabelLee.txt

BlowingInTheWind.txt

StillFallsTheRain.txt

~/poem$


그럼 아래와 같이 server에 해당 파일이 복사되어 들어감이 확인된다.

greenfish@ubuntu:~/client_data$ ls -la

total 24

drwxr-xr-x 2 greenfish greenfish 4096 2013-12-20 13:35 .

drwxr-xr-x 4 greenfish greenfish 4096 2013-12-20 13:29 ..

-rw-r--r-- 1 greenfish greenfish 1221 2013-12-19 17:10 AcrossTheUniverse.txt

-rw-r--r-- 1 greenfish greenfish 1476 2013-12-19 16:38 AnnabelLee.txt

-rw-r--r-- 1 greenfish greenfish  895 2013-12-19 15:51 BlowingInTheWind.txt

-rw-r--r-- 1 greenfish greenfish 1506 2013-12-19 15:45 StillFallsTheRain.txt

greenfish@ubuntu:~/client_data$


rsync로 백업하기


rsync로 보다 다양한 기능의 백업을 수행할 수 있다. 로컬과 원격지 파일의 checksum을 비교하는 알고리즘을 사용하고, 다른 부분만 전송하는 기능을 가진다.


rsync 명령은 원격 shell에서 작동하거나, server의 rsyncd daemon에서 동작하기도 한다. 다음은 directory를 mirror하는 예제이다.

~$ cd temp

~/temp$ touch dummy.txt

~/temp$ ls -la

total 8

drwxr-xr-x  2 greenfish greenfish 4096 2013-12-20 15:11 .

drwxr-xr-x 27 greenfish greenfish 4096 2013-12-20 13:30 ..

-rw-r--r--  1 greenfish greenfish    0 2013-12-20 15:11 dummy.txt

~/temp$ rsync -avz --delete 192.168.182.162:/home/greenfish/server_data/server_file_00*.* ./

greenfish@192.168.182.162's password: 

receiving incremental file list

server_file_001.txt

server_file_002.txt


sent 49 bytes  received 191 bytes  68.57 bytes/sec

total size is 30  speedup is 0.12

~/temp$ ls -la

total 16

drwxr-xr-x  2 greenfish greenfish 4096 2013-12-20 15:12 .

drwxr-xr-x 27 greenfish greenfish 4096 2013-12-20 13:30 ..

-rw-r--r--  1 greenfish greenfish    0 2013-12-20 15:11 dummy.txt

-rw-r--r--  1 greenfish greenfish   15 2013-12-20 13:19 server_file_001.txt

-rw-r--r--  1 greenfish greenfish   15 2013-12-20 13:19 server_file_002.txt

~/temp$

-a 옵션은 아카이브 모드(원격지 directory를 recursive학게 복사), -z 옵션은 압축, 그리고 -v는 자세한 정보를 표시해주라는 옵션이다. --delete는 로컬 시스템에 불필요한 파일을 삭제한다는 뜻으로, 원격지에 존재하지 않는 파일을 삭제하라는 뜻이다. 위 예에서는 wild card가 포함되어 있어, delete가 작동하지 않았다. 즉, dummy.txt가 rsync 명령에도 남아 있다. 다만, 아래와 같이 wild card가 없는 경우, delete가 작동하여 dummy.txt가 삭제됨이 확인된다.

~$ cd temp

~/temp$ touch dummy.txt

~/temp$ ls -la

total 8

drwxr-xr-x  2 greenfish greenfish 4096 2013-12-20 15:13 .

drwxr-xr-x 27 greenfish greenfish 4096 2013-12-20 13:30 ..

-rw-r--r--  1 greenfish greenfish    0 2013-12-20 15:13 dummy.txt

~/temp$ rsync -avz --delete 192.168.182.162:/home/greenfish/server_data/ ./greenfish@192.168.182.162's password: 

receiving incremental file list

deleting dummy.txt

./

server_file_001.txt

server_file_002.txt

server_file_010.txt


sent 71 bytes  received 283 bytes  141.60 bytes/sec

total size is 45  speedup is 0.13

~/temp$ ls -la

total 20

drwxr-xr-x  2 greenfish greenfish 4096 2013-12-20 15:00 .

drwxr-xr-x 27 greenfish greenfish 4096 2013-12-20 13:30 ..

-rw-r--r--  1 greenfish greenfish   15 2013-12-20 13:19 server_file_001.txt

-rw-r--r--  1 greenfish greenfish   15 2013-12-20 13:19 server_file_002.txt

-rw-r--r--  1 greenfish greenfish   15 2013-12-20 15:00 server_file_010.txt

~/temp$

이제 보다 좀 복잡한 백업을 다뤄보도록 한다. 우선, 원격지의 directory를 백업을 하되, 일주일간의 증분(incremental)을 보관하는 것을 테스트해 보자. 앞선 예와 마찬가지로, server는 회색 배경으로 표시한다.


greenfish@ubuntu:~/server_data$ ls -la

total 20

drwxr-xr-x 2 greenfish greenfish 4096 2013-12-20 15:31 .

drwxr-xr-x 5 greenfish greenfish 4096 2013-12-20 15:31 ..

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 15:31 server_file_001.txt

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 15:19 server_file_002.txt

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 15:00 server_file_010.txt

greenfish@ubuntu:~/server_data$ cat server_file_001.txt

i'm server....

greenfish@ubuntu:~/server_data$

와 같이 서버가 세팅되어 있다고 가정한다.

그럼 아래를 실행하여 최초 백업을 수행한다. (참고로, 이후 backup 경로를 /var 이하로 만들어, root 계정으로 접근하도록 했는데, 이전 예제와 같이 /home/ 이후의 사용자 계정으로 진행해도 문제는 없다. 보다 일반적인 백업 과정으로 설명하고자 /var/ 이후로 설명한다.)

~$ sudo -i

~# mkdir /var/backup_server

~# rsync --delete --backup --backup-dir=/var/backup_server/`date +%A` -avz greenfish@192.168.182.162:/home/greenfish/server_data/ /var/backup_server/last_backup/

The authenticity of host '192.168.182.162 (192.168.182.162)' can't be established.

ECDSA key fingerprint is 0c:88:20:d7:9a:14:91:8e:a6:a9:b4:33:8a:87:69:67.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.182.162' (ECDSA) to the list of known hosts.

greenfish@192.168.182.162's password: 

receiving incremental file list

created directory /var/backup_server/last_backup

./

server_file_001.txt

server_file_002.txt

server_file_010.txt


sent 71 bytes  received 279 bytes  63.64 bytes/sec

total size is 45  speedup is 0.13

~#

그리고 다음과 같이 백업 결과를 검토한다.

~$ ls -laR /var/backup_server/

/var/backup_server/:

total 12

drwxr-xr-x  3 root      root      4096 2013-12-20 15:51 .

drwxr-xr-x 16 root      root      4096 2013-12-20 15:49 ..

drwxr-xr-x  2 greenfish greenfish 4096 2013-12-20 15:31 last_backup


/var/backup_server/last_backup:

total 20

drwxr-xr-x 2 greenfish greenfish 4096 2013-12-20 15:31 .

drwxr-xr-x 3 root      root      4096 2013-12-20 15:51 ..

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 15:31 server_file_001.txt

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 13:19 server_file_002.txt

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 15:00 server_file_010.txt

~$ cat /var/backup_server/last_backup/server_file_001.txt 

i'm server....

~$

이제 아래와 같이 서버의 파일을 수정하자.

greenfish@ubuntu:~/server_data$ cat server_file_001.txt

i'm server....

greenfish@ubuntu:~/server_data$ echo 'modified !!!' >> server_file_001.txt

greenfish@ubuntu:~/server_data$ cat server_file_001.txt
i'm server....
modified !!!
greenfish@ubuntu:~/server_data$

그럼 다시 동일한 명령으로 백업을 수행한다.

~# rsync --delete --backup --backup-dir=/var/backup_server/`date +%A` -avz greenfish@192.168.182.162:/home/greenfish/server_data/ /var/backup_server/last_backup/

greenfish@192.168.182.162's password: 

receiving incremental file list

server_file_001.txt


sent 36 bytes  received 185 bytes  88.40 bytes/sec

total size is 58  speedup is 0.26

~#

server_file_001.txt만 적용됨이 확인된다.

그럼, 적용된 결과를 확인해 보자.

~$ ls -laR /var/backup_server/

/var/backup_server/:

total 16

drwxr-xr-x  4 root      root      4096 2013-12-20 17:28 .

drwxr-xr-x 16 root      root      4096 2013-12-20 15:49 ..

drwxr-xr-x  2 root      root      4096 2013-12-20 17:28 Friday

drwxr-xr-x  2 greenfish greenfish 4096 2013-12-20 15:31 last_backup


/var/backup_server/Friday:

total 12

drwxr-xr-x 2 root      root      4096 2013-12-20 17:28 .

drwxr-xr-x 4 root      root      4096 2013-12-20 17:28 ..

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 15:31 server_file_001.txt


/var/backup_server/last_backup:

total 20

drwxr-xr-x 2 greenfish greenfish 4096 2013-12-20 15:31 .

drwxr-xr-x 4 root      root      4096 2013-12-20 17:28 ..

-rw-r--r-- 1 greenfish greenfish   28 2013-12-20 17:26 server_file_001.txt

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 13:19 server_file_002.txt

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 15:00 server_file_010.txt

~$

Friday라는 경로가 하나 생성됨이 확인된다.

각각의 파일 내용은 다음과 같다.

~$ cat /var/backup_server/last_backup/server_file_001.txt

i'm server....

modified !!!

~$ cat /var/backup_server/Friday/server_file_001.txt 

i'm server....

~$

즉, last_backup은 현재의 백업된 결과가, 그리고, Friday는 직전의 결과, 즉, 수정이 발생하기 직전의 파일이 들어감이 확인된다.

그럼 다시, 다음과 같이 서버 파일을 수정해 본다.

greenfish@ubuntu:~/server_data$ echo 'modified, again !!!' >> server_file_001.txt

greenfish@ubuntu:~/server_data$ cat server_file_001.txt
i'm server....
modified !!!
modified, again !!!
greenfish@ubuntu:~/server_data$

다시, 백업하고, 그 결과를 확인해 보자.

~# rsync --delete --backup --backup-dir=/var/backup_server/`date +%A` -avz greenfish@192.168.182.162:/home/greenfish/server_data/ /var/backup_server/last_backup/

greenfish@192.168.182.162's password: 

receiving incremental file list

server_file_001.txt


sent 36 bytes  received 194 bytes  92.00 bytes/sec

total size is 78  speedup is 0.34

~$ cat /var/backup_server/last_backup/server_file_001.txt

i'm server....

modified !!!

modified, again !!!

~$ cat /var/backup_server/Friday/server_file_001.txt 

i'm server....

modified !!!

~$

역시 예상대로, last_backup에는 현재의 마지막 백업 상태가, Friday에는 오늘, 다시말해, 금요일의 마지막 백업의 직전 상태가 들어가는 것으로 이해할 수 있다.

이제 날자를 아래와 같이 변경하고 백업해 본다.

~# sudo date 122117372013

Sat Dec 21 17:37:00 KST 2013

~# rsync --delete --backup --backup-dir=/var/backup_server/`date +%A` -avz greenfish@192.168.182.162:/home/greenfish/server_data/ /var/backup_server/last_backup/

greenfish@192.168.182.162's password: 

receiving incremental file list


sent 11 bytes  received 118 bytes  36.86 bytes/sec

total size is 78  speedup is 0.60

~#

서버쪽 변경된 파일이 없으므로, 특별한 메시지는 없다.

~$ ls -laR /var/backup_server/

/var/backup_server/:

total 16

drwxr-xr-x  4 root      root      4096 2013-12-20 17:28 .

drwxr-xr-x 16 root      root      4096 2013-12-20 15:49 ..

drwxr-xr-x  2 root      root      4096 2013-12-20 17:33 Friday

drwxr-xr-x  2 greenfish greenfish 4096 2013-12-20 15:31 last_backup


/var/backup_server/Friday:

total 12

drwxr-xr-x 2 root      root      4096 2013-12-20 17:33 .

drwxr-xr-x 4 root      root      4096 2013-12-20 17:28 ..

-rw-r--r-- 1 greenfish greenfish   28 2013-12-20 17:26 server_file_001.txt


/var/backup_server/last_backup:

total 20

drwxr-xr-x 2 greenfish greenfish 4096 2013-12-20 15:31 .

drwxr-xr-x 4 root      root      4096 2013-12-20 17:28 ..

-rw-r--r-- 1 greenfish greenfish   48 2013-12-20 17:33 server_file_001.txt

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 13:19 server_file_002.txt

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 15:00 server_file_010.txt

~$

Saturday 같은 폴더는 생성되지 않았다.

다시 아래와 같이 서버 파일을 수정한다.

greenfish@ubuntu:~/server_data$ echo 'modified, again, TGIF !!!' >> server_file_001.txt

greenfish@ubuntu:~/server_data$ cat server_file_001.txt
i'm server....
modified !!!
modified, again !!!
modified, again, TGIF !!!
greenfish@ubuntu:~/server_data$

이제 백업을 시도해본다.

~# rsync --delete --backup --backup-dir=/var/backup_server/`date +%A` -avz greenfish@192.168.182.162:/home/greenfish/server_data/ /var/backup_server/last_backup/

greenfish@192.168.182.162's password: 

receiving incremental file list

server_file_001.txt


sent 36 bytes  received 202 bytes  95.20 bytes/sec

total size is 104  speedup is 0.44

~#

그리고, 아래와 같이 Saturday가 추가됨이 확인된다.

~$ ls -laR /var/backup_server/

/var/backup_server/:

total 20

drwxr-xr-x  5 root      root      4096 2013-12-21 17:41 .

drwxr-xr-x 16 root      root      4096 2013-12-20 15:49 ..

drwxr-xr-x  2 root      root      4096 2013-12-20 17:33 Friday

drwxr-xr-x  2 greenfish greenfish 4096 2013-12-20 15:31 last_backup

drwxr-xr-x  2 root      root      4096 2013-12-21 17:41 Saturday


/var/backup_server/Friday:

total 12

drwxr-xr-x 2 root      root      4096 2013-12-20 17:33 .

drwxr-xr-x 5 root      root      4096 2013-12-21 17:41 ..

-rw-r--r-- 1 greenfish greenfish   28 2013-12-20 17:26 server_file_001.txt


/var/backup_server/last_backup:

total 20

drwxr-xr-x 2 greenfish greenfish 4096 2013-12-20 15:31 .

drwxr-xr-x 5 root      root      4096 2013-12-21 17:41 ..

-rw-r--r-- 1 greenfish greenfish   74 2013-12-20 17:41 server_file_001.txt

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 13:19 server_file_002.txt

-rw-r--r-- 1 greenfish greenfish   15 2013-12-20 15:00 server_file_010.txt


/var/backup_server/Saturday:

total 12

drwxr-xr-x 2 root      root      4096 2013-12-21 17:41 .

drwxr-xr-x 5 root      root      4096 2013-12-21 17:41 ..

-rw-r--r-- 1 greenfish greenfish   48 2013-12-20 17:33 server_file_001.txt

~$

각 경로의 server_file_001.txt는 다음과 같다.

~$ cat /var/backup_server/last_backup/server_file_001.txt

i'm server....

modified !!!

modified, again !!!

modified, again, TGIF !!!

~$ cat /var/backup_server/Friday/server_file_001.txt

i'm server....

modified !!!

~$ cat /var/backup_server/Saturday/server_file_001.txt

i'm server....

modified !!!

modified, again !!!

~$

역시, last_backup은 가장 최근의 백업된 full set이 들어감이 확인된다. Friday는 금요일에 마지막 변경되기 직전의 상태가 들어갔다. Saturday도 토요일 마지막 변경되기 직전의 상태가 들어갔다.


이러한 백업 방법을 보통 rotated backup이라고 하는데, 또다른 방법으로 다중(multiple) copy 대신 hard link를 이용하는 방법이 있다.

~$ sudo -i

~# mkdir /var/backup_hardlink

~# rsync --delete --link-dest=/var/backup_hardlink/backup_old -avz greenfish@192.168.182.162:/home/greenfish/server_data/ /var/backup_hardlink/backup_last

greenfish@192.168.182.162's password: 

receiving incremental file list

created directory /var/backup_hardlink/backup_last

--link-dest arg does not exist: /var/backup_hardlink/backup_old

./

server_file_001.txt

server_file_002.txt

server_file_010.txt


sent 71 bytes  received 359 bytes  172.00 bytes/sec

total size is 247  speedup is 0.57

~# mv /var/backup_hardlink/backup_last/ /var/backup_hardlink/backup_old

~# rsync --delete --link-dest=/var/backup_hardlink/backup_old -avz greenfish@192.168.182.162:/home/greenfish/server_data/ /var/backup_hardlink/backup_last

greenfish@192.168.182.162's password: 

receiving incremental file list

created directory /var/backup_hardlink/backup_last


sent 11 bytes  received 118 bytes  51.60 bytes/sec

total size is 247  speedup is 1.91

~# ls -i /var/backup_hardlink/backup*

/var/backup_hardlink/backup_last:

1575618 server_file_001.txt  1575909 server_file_010.txt

1575619 server_file_002.txt


/var/backup_hardlink/backup_old:

1575618 server_file_001.txt  1575909 server_file_010.txt

1575619 server_file_002.txt

~#

처음 백업(backup_last)를 만든 다음 mv를 이용하여 backup_old로 이동하였다. 그리고 다시 백업을 수행하면 backup_last에 파일이 들어가는데, backup_last와 backup_old가 같은 inode를 공유하게 된다. 물론, 백업의 변동사항이 없기 때문이다. 앞선, Monday, ~ 로 구별하던것과는 사뭇 다른데, 이미 old와 last가 동일한 file set을 가지게 됨으로, 향후에 발생할 merge 작업이 필요없을 수 있다.

만일, 다음과 같이 서버의 파일 내용이 변경된다면,

greenfish@ubuntu:~/server_data$ echo 'test_hardlink !' >> server_file_001.txt

greenfish@ubuntu:~/server_data$

다음과 같이 백업이 이뤄질 수 있다.

~# rsync --delete --link-dest=/var/backup_hardlink/backup_old -avz greenfish@192.168.182.162:/home/greenfish/server_data/ /var/backup_hardlink/backup_last

greenfish@192.168.182.162's password: 

receiving incremental file list

server_file_001.txt


sent 36 bytes  received 218 bytes  72.57 bytes/sec

total size is 263  speedup is 1.04

~# ls -i /var/backup_hardlink/backup*

/var/backup_hardlink/backup_last:

1575911 server_file_001.txt  1575909 server_file_010.txt

1575619 server_file_002.txt


/var/backup_hardlink/backup_old:

1575618 server_file_001.txt  1575909 server_file_010.txt

1575619 server_file_002.txt

~#

즉, 변경된 server_file_001.txt를 제외하고 inode가 동일함이 확인된다. 그렇기 때문에 디스크의 공간을 절약할 수 있다. 다만, backup_old는 변함없기 때문에 주기적인 snapshot을 위해서는 mv 명령이 필요할지 모른다.