[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
그럼 다시 동일한 명령으로 백업을 수행한다.
~# 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
다시, 백업하고, 그 결과를 확인해 보자.
~# 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
이제 백업을 시도해본다.
~# 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 명령이 필요할지 모른다.
'Research > Ubuntu' 카테고리의 다른 글
[Linux/Ubuntu process 관리] ps, top을 이용하여 프로세스(process) 관리하기 (0) | 2013.12.24 |
---|---|
[Linux/Ubuntu Backup] 매체로 백업하기 (mkisofs, cdrecord). cd 굽기(cd burn) (0) | 2013.12.23 |
[Linux/Ubuntu Backup][01] tar, gzip, bzip2 사용하기 (0) | 2013.12.19 |
[Linux/Ubuntu 파일 시스템 관리] linux LVM (Logical volume manager) 관리하기 (0) | 2013.12.19 |
[Linux/Ubuntu 파일 시스템 관리] file system 사용량 측정하기 (df, du) (0) | 2013.12.18 |