이번 편에서는 복원에 대해서 알아보자.  방법 자체는 백업과 크게 다르진 않은데, DIR에 Job으로 정의해놓을 경우 지정된 시간에 지정된 복원을 수행하는 것이 가능하다.  예를 들자면, 매일 같은 상태로 복원되어야만 하는 컴퓨터들이 여러대 혹은 수십 수백대가 있다면 이것들을 일괄처리할 수 있다는 장점이 있다.  설정은 전부 다 같고 Job {} 섹션에서 Type = Backup을 Type = Restore로 넣어주기만 하면 되니까 이것의 실습은 생략하고, bconsole을 이용한 복원을 실습해보도록 한다.

일단 Bacula는 최소 하나 이상의 복원 Job을 정의해야만 수동 복원작업이 작동가능하도록 되어있다.  /etc/bacula/bacula-dir.conf 파일을 열어서 최소한의 설정만 넣어주면 되므로, 다음의 내용을 삽입하고 데몬을 재시작해주자.

Job {
  Name = "Restore"
  Type = Restore
  Messages = Standard
  Pool = Server
  Client = "DBServer"
  FileSet = "Full Set"
}

sudo service bacula-director restart

 

위에 정의해놓은대로만 복원작업이 작동되는건 아니다.   bconsole을 이용하여 원하는 클라이언트에 원하는 파일을 복원할 수 있다.  Bacula의 복원은 원하는 파일을 원하는 위치에 꽂아넣을 수 있다는 장점이 있다.  bconsole에서 restore를 입력해보자.  

*restore
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"

First you select one or more JobIds that contain files
to be restored. You will be presented several methods
of specifying the JobIds. Then you will be allowed to
select which files from those JobIds are to be restored.

To select the JobIds, you have the following choices:
1: List last 20 Jobs run
2: List Jobs where a given File is saved
3: Enter list of comma separated JobIds to select
4: Enter SQL list command
5: Select the most recent backup for a client
6: Select backup for a client before a specified time
7: Enter a list of files to restore
8: Enter a list of files to restore before a specified time
9: Find the JobIds of the most recent backup for a client
10: Find the JobIds for a backup for a client before a specified time
11: Enter a list of directories to restore for found JobIds
12: Select full restore to a specified Job date
13: Cancel
Select item: (1-13):

차례대로 보자.

1. 마지막 20개 작업 나열
2. 파일이 백업된 장소로 작업 나열
3. 작업별 ID 번호를 콤마 기호로 나열하여 입력
4. SQL 쿼리를 사용한 목록 나열
5. 클라이언트의 가장 최근 작업을 선택 => 가장 많이 쓰인다.
6. 클라이언트의 특정 시간대 이전 작업 선택
7. 복원할 파일명을 직접 입력
8. 특정 시간대 이전에 백업된 파일 중 복원할 파일명을 직접 입력
9. 클라이언트의 가장 최근 백업 ID 찾기
10. 특정 시간대 이전 클라이언트의 가장 최근 백업 ID 찾기
11. 특정 백업 ID에 백업된 디렉토리명 입력
12. 특정 일자로 전체 복원
13.  취소

 

이전의 예제에서 우리는 FTP 서버를 백업했으므로 5번 메뉴를 이용하여 복원을 해보자.  참고로 입력을 잘못 했을 경우 점 (.)을 찍으면 언제든지 취소할 수 있다.

Select item: (1-13): 5
Defined Clients:
  1: DBServer
  2: Desktop
  3: FTP Server
  4: Web Server
  5: dbserver-fd
Select the Client (1-5): 3
Automatically selected FileSet: Full Set
+-------+-------+----------+-------------+---------------------+------------+
| JobId | Level | JobFiles |  JobBytes   |     StartTime       | VolumeName |
+-------+-------+----------+-------------+---------------------+------------+
|   5   |   F   |  55,461  | 982,708,126 | 2013-06-25 05:03:10 |  Server-1  |
+-------+-------+----------+-------------+---------------------+------------+
You have selected the following JobId: 5

Building directory tree for JobId(s) 5 ... +++++++++++++++++++++++++++++++++++++++++++
48,147 files inserted into the tree.

You are now entering file selection mode where you add (mark) and
remove (unmark) files to be restored. No files are initially added, unless
you used the "all" keyword on the command line.
Enter "done" to leave this mode.

cwd is: /

몇몇개의 단순한 유닉스 명령어가 지원된다.  어떤 명령어가 지원되는지 궁금하면 역시 마찬가지로 탭키를 입력하면 보여준다.   파일의 목록을 나열해보자.

ls

bin/
boot/
dev
etc/
home/
initrd.img
lib/
lib64/
lost+found
media/
mnt/
opt
root/
run
sbin/
selinux
srv
sys
usr/
var/
vmlinuz
$

실습에서는 /etc/bacula/bacula-fd.conf 파일을 /tmp 위치로 복원하는 것을 해보자.

$ cd etc/bacula
cwd is: /etc/bacula/
$ ls
bacula-fd.conf
bacula-sd.conf
bacula-sd.conf.dist
common_default_passwords
scripts/
$ mark bacula-fd.conf
1 file marked.
$ done
Bootstrap records written to /var/lib/bacula/dbserver-dir.restore.1.bsr

The job will require the following
  Volume(s) Storage(s) SD Device(s)
===========================================================================

  Server-1 Server Backup FileStorage-1

Volumes marked with "*" are online.


1 file selected to be restored.

Run Restore job
JobName: Restore
Bootstrap: /var/lib/bacula/dbserver-dir.restore.1.bsr
Where: *None*
Replace: always
FileSet: Full Set
Backup Client: FTP Server
Restore Client: FTP Server
Storage: Server Backup
When: 2013-06-25 06:31:54
Catalog: MyCatalog
Priority: 10
Plugin Options: *None*

OK to run? (yes/mod/no): mod
Parameters to modify:
  1: Level
  2: Storage
  3: Job
  4: FileSet
  5: Restore Client
  6: When
  7: Priority
  8: Bootstrap
  9: Where
  10: File Relocation
  11: Replace
  12: JobId
  13: Plugin Options
Select parameter to modify (1-13): 9
Please enter path prefix for restore (/ for none): /tmp
Run Restore job
JobName: Restore
Bootstrap: /var/lib/bacula/dbserver-dir.restore.1.bsr
Where: /tmp
Replace: always
FileSet: Full Set
Backup Client: FTP Server
Restore Client: FTP Server
Storage: Server Backup
When: 2013-06-25 06:31:54
Catalog: MyCatalog
Priority: 10
Plugin Options: *None*
OK to run? (yes/mod/no): yes
Job queued. JobId=6

이제 제대로 실행되는지 보자.

*status dir
dbserver-dir Version: 5.2.5 (26 January 2012) x86_64-pc-linux-gnu ubuntu 12.04
Daemon started 25-Jun-13 06:15. Jobs: run=1, running=0 mode=0,0
Heap: heap=286,720 smbytes=77,288 max_bytes=9,888,526 bufs=270 max_bufs=295

Scheduled Jobs:
Level Type Pri Scheduled Name Volume
===================================================================================
Incremental Backup 10 25-Jun-13 23:05 DBServer Backup Server-1
Incremental Backup 10 25-Jun-13 23:05 FTP Backup *unknown*
Incremental Backup 10 25-Jun-13 23:05 WEB Backup Server-1
Incremental Backup 10 25-Jun-13 23:05 Desktop Backup Server-1
Full Backup 11 25-Jun-13 23:10 BackupCatalog Server-1
====

Running Jobs:
Console connected at 25-Jun-13 06:17
No Jobs running.
====

Terminated Jobs:
JobId Level Files Bytes Status Finished Name
====================================================================
1 Full 0 0 Error 25-Jun-13 03:34 BackupClient1
3 Full 0 0 Cancel 25-Jun-13 04:56 FTP_Backup
4 Full 10 7.737 K OK 25-Jun-13 04:58 FTP_Backup
5 Full 55,461 982.7 M OK 25-Jun-13 05:06 FTP_Backup
6 1 974 OK 25-Jun-13 06:32 Restore

====
You have messages.
*

Running에는 아무 것도 뜨지않았지만 message가 있다고 나오는걸 보니 작업이 끝난 것 같다.  확인해보자.

*messages
25-Jun 06:32 dbserver-dir JobId 6: Start Restore Job Restore.2013-06-25_06.32.45_03
25-Jun 06:32 dbserver-dir JobId 6: Using Device "FileStorage-1"
25-Jun 04:11 FTPServer-sd JobId 6: Ready to read from volume "Server-1" on device "FileStorage-1" (/mnt/backup-1/bacula).
25-Jun 04:11 FTPServer-sd JobId 6: Forward spacing Volume "Server-1" to file:block 0:9594.
25-Jun 06:32 dbserver-dir JobId 6: Bacula dbserver-dir 5.2.5 (26Jan12):
Build OS: x86_64-pc-linux-gnu ubuntu 12.04
JobId: 6
Job: Restore.2013-06-25_06.32.45_03
Restore Client: FTP Server
Start time: 25-Jun-2013 06:32:47
End time: 25-Jun-2013 06:32:48
Files Expected: 1
Files Restored: 1
Bytes Restored: 974
Rate: 1.0 KB/s
FD Errors: 0
FD termination status: OK
SD termination status: OK
Termination: Restore OK

25-Jun 06:32 dbserver-dir JobId 6: Begin pruning Jobs older than 6 months .
25-Jun 06:32 dbserver-dir JobId 6: No Jobs found to prune.
25-Jun 06:32 dbserver-dir JobId 6: Begin pruning Files.
25-Jun 06:32 dbserver-dir JobId 6: No Files found to prune.
25-Jun 06:32 dbserver-dir JobId 6: End auto prune.

*

성공적으로 복원되었다.  이제 파일을 확인하러 가보자.   FTP 서버로 접속해서 /tmp 에 있는 파일을 확인하면 된다.

root@ftp:~# ls -l /tmp/etc/bacula/bacula-fd.conf
-rw-r----- 1 root root 974 Jun 25 02:29 /tmp/etc/bacula/bacula-fd.conf
root@ftp:~#

파일 소유권과 날짜까지 제대로 복원되었다.

 

Bacula에 대해 혹평하는 몇몇 외국 유저들의 이야기를 보면 그들 전부가 "어떻게 쓰는줄을 모르기 때문에" 생겨나는 불평이다.  백업이 안되느니 복원이 안되느니 하면서 사용을 포기하는 유저들을 몇몇 봤는데, 글쓴이 경험상 Bacula 자체에 버그가 있어서 안된 경우는 아직 못봤다.  처음 접하기 어려운 툴인 것만은 분명 사실이다.  하지만 작동원리만 알고나면 정말 쓰기 쉬운 프로그램인 것도 분명 사실이다.



다음 편에서는 GUI로 Bacula를 제어해보자.

블로그 이미지

Seowon Jung jswlinux

Seowon Jung의 잡동사니 보관소

댓글을 달아 주세요

  • 2017.01.01 18:38  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Seowon Jung jswlinux 2017.01.01 19:37 신고  댓글주소  수정/삭제

      안녕하세요 cestrum님,

      서버에서 메일 설정을 해두시면, 백업 성공 여부에 관계없이 내용을 요약해서 메일로 알림을 보내줍니다. 저희 서버 중 하나를 예로 올려드리자면 아래와 같습니다.

      02-Jan 02:04 modgud-dir JobId 34181: Start Backup JobId 34181, Job=T9_Backup.2017-01-02_02.00.07_26
      02-Jan 02:04 modgud-dir JobId 34181: Using Device "ZFS-1" to write.
      02-Jan 02:04 t9-master-fd JobId 34181: shell command: run ClientBeforeJob "mount -a"
      02-Jan 02:04 t9-master-fd JobId 34181: shell command: run ClientBeforeJob "sudo -u bacula cp -arf /srv/src/config /home/bacula/"
      02-Jan 02:04 modgud-dir JobId 34181: Sending Accurate information to the FD.
      02-Jan 02:10 keller-storage-00-sd JobId 34181: Elapsed time=00:00:11, Transfer rate=74.07 K Bytes/second
      02-Jan 02:10 keller-storage-00-sd JobId 34181: Sending spooled attrs to the Director. Despooling 9,190 bytes ...
      02-Jan 02:05 modgud-dir JobId 34181: Bacula Enterprise modgud-dir 8.4.7 (18Jan16):
      Build OS: x86_64-pc-linux-gnu-bacula-enterprise ubuntu 12.04
      JobId: 34181
      Job: T9_Backup.2017-01-02_02.00.07_26
      Backup Level: Incremental, since=2017-01-01 03:04:11
      Client: "T9" 8.4.7 (18Jan16) x86_64-pc-linux-gnu-bacula-enterprise,ubuntu,14.04
      FileSet: "T9 Backup FileSet" 2016-07-20 02:00:00
      Pool: "InstancesBackup" (From Job resource)
      Catalog: "PostgreSQL" (From Client resource)
      Storage: "FileStorage_1" (From Pool resource)
      Scheduled time: 02-Jan-2017 02:00:07
      Start time: 02-Jan-2017 02:04:56
      End time: 02-Jan-2017 02:05:08
      Elapsed time: 12 secs
      Priority: 10
      FD Files Written: 33
      SD Files Written: 33
      FD Bytes Written: 810,748 (810.7 KB)
      SD Bytes Written: 814,792 (814.7 KB)
      Rate: 67.6 KB/s
      Software Compression: None
      Comm Line Compression: 78.5% 4.6:1
      Snapshot/VSS: no
      Encryption: no
      Accurate: yes
      Volume name(s): InstancesBackup-0248
      Volume Session Id: 565
      Volume Session Time: 1482279256
      Last Volume Bytes: 24,680,162,867 (24.68 GB)
      Non-fatal FD errors: 0
      SD Errors: 0
      FD termination status: OK
      SD termination status: OK
      Termination: Backup OK

      02-Jan 02:05 modgud-dir JobId 34181: Begin pruning Jobs older than 1 month .
      02-Jan 02:05 modgud-dir JobId 34181: No Jobs found to prune.
      02-Jan 02:05 modgud-dir JobId 34181: Begin pruning Files.
      02-Jan 02:05 modgud-dir JobId 34181: No Files found to prune.
      02-Jan 02:05 modgud-dir JobId 34181: End auto prune.

      02-Jan 02:05 modgud-dir JobId 34181: shell command: run AfterJob "rm -rf /home/bacula/config"


      방문 감사합니다.

  • 2017.01.03 16:15  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Seowon Jung jswlinux 2017.01.03 23:45 신고  댓글주소  수정/삭제

      일단, LTO-5,6,7 등의 장비를 쓰실 때, 장비 자체에서 zip 압축기능을 제공하면 바큘라에서는 압축옵션을 끄셔도 되시고, 그렇지 않으면 압축 때문이 리소스 부하가 크게 생기진 않습니다. 보통 리눅스 배포판마다 기본적으로 탑재되서 나오는 libzip 라이브러리를 이용하기 때문에 그렇기도 하구요, 사실 제 경험상 압축보다는 데이터가 전송되면서 백업되는 과정의 모든 데이터를 SSL로 암호화할 때 오히려 더 부하가 많이 걸렸습니다. 그래서 저도 일단 peer간 verification시에만 TLS를 키고, 이외에는 따로 암호화하지 않습니다.

      바큘라가 사실 처음 초기 세팅은 좀 어렵습니다. 아무래도 수십 수백대의 클라이언트 백업 설정을 단 몇 개의 설정파일 안에 전부 다 때려넣어야해서 처음에는 좀 어려운데요, 한 번 이해하고나시면 이후로는 백업에 아예 신경을 안써도 될 정도입니다. 저도 매일 출근해서 바큘라가 보내주는 이메일의 제목 중 맨앞의 Bacula - OK 이거 하나만 확인하면 내용을 아예 안볼 정도입니다. 그나마도 제목보는 것마저 귀찮아서, 제 모니터링 시스템에서 OK가 아니면 따로 색깔을 표시해주는 간단한 스크립트를 짜서 볼 정도니, 바큘라가 시스템 관리자에게 굉장히 큰 도움이 되는 것 같습니다.

      다만, 바큘라를 도입하시기 전에, 바큘라를 이용한 백업/복원이야 원래 잘되고 쉬운 편이라 이것보다는, 비상시, 즉 바큘라 DIR 서버와 통신이 안되는 상태나 SD 서버가 죽어있는 상황을 가정해서 백업 데이터를 가져와 RAW로 수동복구를 연습해보시길 권해드립니다. 바큘라가 평상시에 문제없고 잘 돌아갈 때는 아예 신경조차 안써도 될 정도로 편하지만, 문제가 터지면 반대로 바큘라의 작동방식에 대해서 아주 잘 이해하고 있어야만 대처가 가능합니다.

      또 질문 있으시면 댓글 남겨주세요.
      방문 감사합니다.

  • cestrum 2017.01.04 02:12  댓글주소  수정/삭제  댓글쓰기

    아 정말 친절한 답변 감사합니다 ㅠㅜ.....
    이렇게까지 세세하게 답변 주실지는 정말 몰랐네여......

    일단 도입할때 다시 삽질을 수십번 하겠지만 그래도 한번 스트럭쳐를 잡고 시작할 수 있으니
    이렇게 도움이 될지 몰랐네여 정말 몇번이고 감사하다고 말씀드릴수 밖에 없네여!!

이번 편부터는 실제로 수동백업을 해보자.  수동백업의 의미는, bacula-dir.conf 디렉터 데몬 설정파일에서 이미 Job, FileSet, Schedule 등으로 "자동화" 해놨으므로 백업작업은 스케쥴에 정의된 시간에 자동으로 실행이 될 예정이다.  하지만, 지정된 시간이 아닌 수동으로 백업을 할 수 있어야하며 이때 제공되는 CLI와 GUI툴이 있다. 

일단은 GUI보다 CLI로 먼저 실습을 해볼건데, 왜냐하면 GUI는 기본적으로 CLI 툴에서 나오는 메시지를 예쁘게 포장한 것에 불과하기 때문이며, 리눅스 프로그램들이 다들 그렇듯 자세한 설정은 결국 CLI를 통해야만 하기 때문이다.  따라서, CLI툴에 익숙해져야 응급상황에 빠르게 대처할 수 있다.

Bacula의 CLI툴은 bconsole이라고 하는데, apt-get install bacula-console 명령을 통해서 설치할 수 있다.  디렉터 서버는 이 예제에서는 DBserver에서 운영 중이므로 DBserver에서 설치한다 (물론 다른 서버에 설치해도 된다.  그게 Bacula의 장점이다).  설치가 끝나면 /etc/bacula/bconsole.conf 파일을 열어서 name과 주소, 그리고 패스워드를 DIR 설정에 맞게 변경해주자.

Director {
  Name = dbserver-dir
  DIRport = 9101
  address = 10.211.55.33
  Password = "dir"
}

다 됐으면 루트권한으로 bconsole을 실행하자.  다음과 같은 화면이 나올거다.

root@dbserver:/etc/bacula# bconsole
Connecting to Director 10.211.55.33:9101
1000 OK: dbserver-dir Version: 5.2.5 (26 January 2012)
Enter a period to cancel a command.
*

bconsole은Tab키를 이용한 자동완성을 지원하므로 명령어가 생각이 나지않거나 파일셋, 클라이언트 이름 등이 해깔릴 때 요긴하게 사용할 수 있다.  먼저, DIR의 상태를 확인해보자.

*status dir
dbserver-dir Version: 5.2.5 (26 January 2012) x86_64-pc-linux-gnu ubuntu 12.04
Daemon started 25-Jun-13 04:09. Jobs: run=0, running=0 mode=0,0
Heap: heap=405,504 smbytes=49,275 max_bytes=51,814 bufs=220 max_bufs=232

Scheduled Jobs:
Level Type Pri Scheduled Name Volume
===================================================================================
Incremental Backup 10 25-Jun-13 23:05 DBServer Backup *unknown*
Incremental Backup 10 25-Jun-13 23:05 FTP Backup *unknown*
Incremental Backup 10 25-Jun-13 23:05 WEB Backup *unknown*
Incremental Backup 10 25-Jun-13 23:05 Desktop Backup *unknown*
Full Backup 11 25-Jun-13 23:10 BackupCatalog *unknown*
====

Running Jobs:
Console connected at 25-Jun-13 04:21
No Jobs running.
====

Terminated Jobs:
JobId Level Files Bytes Status Finished Name
====================================================================
1 Full 0 0 Error 25-Jun-13 03:34 BackupClient1

====
*

글쓴이가 이 글을 작성하는 시점에서 백업 스케쥴이 실행되는 시간이 되는 바람에 Job이 하나 취소됐다.  그래서 Terminated Jobs에 하나 떴다.

일단 DIR을 처음 실행하고 bconsole에 들어오면 가장 먼저 해야할 일이 볼륨을 생성해주는 일이다.  그래서, unknown이라는 메시지가 보이는 이유는 현재 DIR 데몬이 어디에 백업을 해야하는지 모르는 상태이다.  서버백업용 볼륨을 하나 생성해보자.

*label pool=Server storage="Server Backup" volume=Server-1
Connecting to Storage daemon Server Backup at 10.211.55.34:9103 ...
Sending label command for Volume "Server-1" Slot 0 ...
3000 OK label. VolBytes=193 DVD=0 Volume="Server-1" Device="FileStorage-1" (/mnt/backup-1/bacula)
Catalog record for Volume "Server-1", Slot 0 successfully created.
Requesting to mount FileStorage-1 ...
3906 File device ""FileStorage-1" (/mnt/backup-1/bacula)" is always mounted.
*

메시지를 보면 "successfully created"라고 나온걸 봐서 제대로 생성됐음을 알 수 있다.  그럼 이제 본격적으로 백업을 해보자.  우리가 지정한 파일셋이 제대로 적용됐는지 확인부터 해보자.

*show fileset="Full Set"
FileSet: name=Full Set
O M
N
I /
N
E /var/lib/bacula
E /nonexistant/path/to/file/archive/dir
E /proc
E /tmp
E /.journal
E /.fsck
N
*

제대로 나온다.  이제 클라이언트들이 제대로 응답하는지 확인해볼 차례다.  FTP 서버를 확인해보자.

*status client="FTP Server"
Connecting to Client FTP Server at 10.211.55.34:9102

ftp-fd Version: 5.2.5 (26 January 2012) x86_64-pc-linux-gnu ubuntu 12.04
Daemon started 25-Jun-13 02:29. Jobs: run=0 running=0.
Heap: heap=270,336 smbytes=15,781 max_bytes=15,928 bufs=48 max_bufs=49
Sizeof: boffset_t=8 size_t=8 debug=0 trace=0
Running Jobs:
Director connected at: 25-Jun-13 02:29
No Jobs running.
====

Terminated Jobs:
====
*

제대로 응답한다.  만약 명령어를 입력하고 "즉시" 응답이 없으면 설정이 잘못된 거다.  이 경우 십중팔구는 DIR 이름과 패스워드가 달라서 생기는 거다.  클라이언트에 SSH로 접속해서 /etc/bacula/bacula-fd.conf 파일을 열고 Director {} 섹션의 Name 항목이 dbserver-dir로 되어있는지, 그리고 Passwordftpserver로 되어있는지 확인하자.

이제 백업할 준비가 다 끝났다.  백업을 진행해보자.

*run job="FTP Backup" fileset="Full Set" client="FTP Server" storage="Server Backup" level="Full"
Using Catalog "MyCatalog"
Run Backup job
JobName: FTP Backup
Level: Full
Client: FTP Server
FileSet: Full Set
Pool: User Data (From Job resource)
Storage: Server Backup (From command line)
When: 2013-06-25 04:55:23
Priority: 10
OK to run? (yes/mod/no): 

여기서 위의 내용을 자세히 보면, Pool이 User Data라고 되어있는 것을 볼 수 있다.  이것은 bacula-dir.conf 파일에 정의된 Job 항목에 Pool이 User Data로 되어있기 때문인데, 일단 우리는 유저 데이터를 백업하려는게 아니라 서버 자체를 백업하려고 하는 것이므로 이것을 수정해서 Server Pool을 이용하도록 하자.

OK to run? (yes/mod/no): mod
Parameters to modify:
  1: Level
  2: Storage
  3: Job
  4: FileSet
  5: Client
  6: When
  7: Priority
  8: Pool
  9: Plugin Options
Select parameter to modify (1-9): 8
The defined Pool resources are:
  1: Server
  2: User Data
Select Pool resource (1-2): 1
Run Backup job
JobName: FTP Backup
Level: Full
Client: FTP Server
FileSet: Full Set
Pool: Server (From User input)
Storage: Server Backup (From command line)
When: 2013-06-25 04:58:16
Priority: 10
OK to run? (yes/mod/no): yes
Job queued. JobId=5
*

Job이 제대로 접수됐는지 DIR의 상태를 확인해보자.  참고로, 위의 예제에서 JobID가 5인 이유는 글쓴이가 테스트를 위해서 여러번 실행했다 취소했다를 반복해서 그런 것이니 신경쓰지 말자.

*status dir
dbserver-dir Version: 5.2.5 (26 January 2012) x86_64-pc-linux-gnu ubuntu 12.04
Daemon started 25-Jun-13 04:47. Jobs: run=2, running=0 mode=0,0
Heap: heap=405,504 smbytes=91,751 max_bytes=117,401 bufs=277 max_bufs=309

Scheduled Jobs:
Level Type Pri Scheduled Name Volume
===================================================================================
Incremental Backup 10 25-Jun-13 23:05 DBServer Backup Server-1
Incremental Backup 10 25-Jun-13 23:05 FTP Backup *unknown*
Incremental Backup 10 25-Jun-13 23:05 WEB Backup Server-1
Incremental Backup 10 25-Jun-13 23:05 Desktop Backup Server-1
Full Backup 11 25-Jun-13 23:10 BackupCatalog Server-1
====

Running Jobs:
Console connected at 25-Jun-13 05:01
JobId Level Name Status
======================================================================
5 Full FTP_Backup.2013-06-25_05.03.07_03 is running
====

Terminated Jobs:
JobId Level Files Bytes Status Finished Name
====================================================================
1 Full 0 0 Error 25-Jun-13 03:34 BackupClient1
3 Full 0 0 Cancel 25-Jun-13 04:56 FTP_Backup
4 Full 10 7.737 K OK 25-Jun-13 04:58 FTP_Backup

====
You have messages.
*

메시지 중간을 보면 running이라고 나온다.  실행 중이다.  잘 되고있다는 말이다.  마지막에 보면 You have messages.라고 나오면서 메시지가 있다고 나온다.  메시지를 확인해보자.

*messages
25-Jun 05:03 dbserver-dir JobId 5: Start Backup JobId 5, Job=FTP_Backup.2013-06-25_05.03.07_03
25-Jun 05:03 dbserver-dir JobId 5: Using Device "FileStorage-1"
25-Jun 02:41 FTPServer-sd JobId 5: Volume "Server-1" previously written, moving to end of data.
25-Jun 02:41 FTPServer-sd JobId 5: Ready to append to end of Volume "Server-1" size=9594
25-Jun 02:41 ftp-fd JobId 5: /sys is a different filesystem. Will not descend from / into it.
25-Jun 02:41 ftp-fd JobId 5: /dev is a different filesystem. Will not descend from / into it.
25-Jun 02:41 ftp-fd JobId 5: /run is a different filesystem. Will not descend from / into it.
25-Jun 02:41 ftp-fd JobId 5: /mnt/backup-2 is a different filesystem. Will not descend from / into it.
25-Jun 02:41 ftp-fd JobId 5: /mnt/backup-1 is a different filesystem. Will not descend from / into it.
*

잘 읽어보면 특수 파일시스템, sys, dev, run 등은 백업하지 않는다고 써있다.  또한, 추가로 붙인 하드디스크 역시 다른 파일시스템이라고 백업하지 않겠단다.  이것을 백업하려면 FileSet에 Include항목을 이용하면 된다.  다만, 본 테스트 한정으로, 백업 볼륨이 저 위치에 저장되므로 그것을 유의해서 스스로 백업하는 일이 없도록 하자.  대충 써보면 다음과 같다고 본다.

Include {
  File = /
  File = /mnt/backup-1
}
Exclude {
  File = /mnt/backup-1/bacula
}

 

백업이 어떻게 진행되가는지 궁금하다.  이럴 때는 status dir을 해도 되고 그냥 엔터키만 쳐도 된다.  그냥 엔터키를 쳐보자.

*
You have messages.
*

메시지가 와있다.  messages를 입력하면 보여주는데, bconsole에서 autodisplay on을 입력하면 엔터키를 입력할 때마다 추가생성되는 메시지를 자동으로 보여준다.  이것을 이용해보자.

*autodisplay on
25-Jun 02:44 ftp-fd JobId 5: /media/cdrom is a different filesystem. Will not descend from / into it.
25-Jun 02:45 FTPServer-sd JobId 5: Job write elapsed time = 00:03:32, Transfer rate = 4.671 M Bytes/second
25-Jun 05:06 dbserver-dir JobId 5: Bacula dbserver-dir 5.2.5 (26Jan12):
Build OS: x86_64-pc-linux-gnu ubuntu 12.04
JobId: 5
Job: FTP_Backup.2013-06-25_05.03.07_03
Backup Level: Full
Client: "FTP Server" 5.2.5 (26Jan12) x86_64-pc-linux-gnu,ubuntu,12.04
FileSet: "Full Set" 2013-06-25 05:03:08
Pool: "Server" (From User input)
Catalog: "MyCatalog" (From Client resource)
Storage: "Server Backup" (From Pool resource)
Scheduled time: 25-Jun-2013 05:02:57
Start time: 25-Jun-2013 05:03:10
End time: 25-Jun-2013 05:06:45
Elapsed time: 3 mins 35 secs
Priority: 10
FD Files Written: 55,461
SD Files Written: 55,461
FD Bytes Written: 982,708,126 (982.7 MB)
SD Bytes Written: 990,268,085 (990.2 MB)
Rate: 4570.7 KB/s
Software Compression: None
VSS: no
Encryption: no
Accurate: no
Volume name(s): Server-1
Volume Session Id: 3
Volume Session Time: 1372163033
Last Volume Bytes: 992,591,109 (992.5 MB)
Non-fatal FD errors: 0
SD Errors: 0
FD termination status: OK
SD termination status: OK
Termination: Backup OK

25-Jun 05:06 dbserver-dir JobId 5: Begin pruning Jobs older than 6 months .
25-Jun 05:06 dbserver-dir JobId 5: No Jobs found to prune.
25-Jun 05:06 dbserver-dir JobId 5: Begin pruning Files.
25-Jun 05:06 dbserver-dir JobId 5: No Files found to prune.
25-Jun 05:06 dbserver-dir JobId 5: End auto prune.

*

입력을 해보니 벌써 전체 백업이 모두 끝났다.  여기서 가장 중요한 항목은 Termination: Backup OK인데, OK냐 아니냐에 따라서 이 job이 제대로 끝났는지 아닌지를 알 수 있기 때문이다.  위의 메시지를 자세히 읽어보면 별로 어려운 것이 없다.  총 기록된 용량이 얼마며 날짜(가상머신이라 날짜가 다른건 신경쓰지 말자), 파일셋 등 여러가지 정보를 보여준다.

이로서 백업실습이 끝났다.  참고로, 증분백업은 명령어

run job="FTP Backup" fileset="Full Set" client="FTP Server" storage="Server Backup" level="Full"

에서 

run job="FTP Backup" fileset="Full Set" client="FTP Server" storage="Server Backup" level="Incremental"

이라고 변경해주면 된다.  어떤 백업방식이 가능한지 알아보고 싶으신 분은 

run job="FTP Backup" fileset="Full Set" client="FTP Server" storage="Server Backup" level=

까지만 입력된 상태에서 Tab키를 입력하면 되겠다.

 

다음 편에서는 복원을 실습해보자.

 

블로그 이미지

Seowon Jung jswlinux

Seowon Jung의 잡동사니 보관소

댓글을 달아 주세요

이번 편에서는 설정의 최종판, 끝판왕 되시는 Director 데몬이다. 지금까지 쭉 봐왔듯, 스토리지 데몬이나 파일데몬에서는 그다지 설정할 게 없었고, 결국 그 의미는 어디선가는 모든 책임을 지는 무언가가 있다는 의미인 것이다.  앞서 설명했듯, 디렉터 데몬은 지휘소 같은 개념으로서 백업에 관한 모든 명령어를 내리는 데몬이므로 가장 중요한 데몬이다.  역시 마찬가지로 일단 그림부터 보자.

 

딱 봐도 복잡하다.  그냥 봐서는 이해가 안갈거고, 차후에 설명할 CLI툴로 봐도 이해가 안가실 거다.  나중에 GUI툴로 보면 그때 이해가 가실 거다.

디렉터 데몬은 다른 데몬들과 마찬가지로 디렉터, 모니터, 메시지 이 3개의 섹션은 공통적으로 존재하되, 여기서 추가적으로
1. 파일을 저장하는 명령을 내리기 위해 어떤 백업은 어떤 스토리지를 이용할 것인지에 대한 스토리지 데몬 지정
2. 스케쥴 지정
3. Job 지정 (밑에서 따로 설명한다)
4. 어떤 파일들을 백업할 것인지에 대한 백업대상 지정 (FileSet)
5. 파일 데몬이 설치된 클라이언트 지정
6. 각종 에러 및 성공 메시지 처리 지정
7. 파일이 저장될 공간인 Pool 지정 

이렇게 7개의 섹션이 더 존재한다. 따라서, 디렉터 데몬의 설정파일은 프로그래밍 소스코드 마냥 몇백 몇천 라인 정도 되긴 하지만, 규모가 큰 곳에서 같은 일을 하는 컴퓨터가 많을 경우 상당히 효율적으로 백업을 구성할 수 있다. 이 부분에 대해서는 디렉터 데몬 설정파트 이후에 별도로 설명드린다 (설정파일의 분리가 가능하다).  길고 긴 설명을 편하게 하기위해 몇 가지를 정해두고, 전 편에서 설정했던 것들을 다시 짚어본다.

데스크탑 1, 웹서버 1, MySQL DB서버 1, FTP 서버 1.  이렇게 총 4대의 머신이 있고, 여기서 우리는 DB 서버에서 디렉터 데몬을 운영하기로 한다.  스토리지 데몬은 FTP에서 운영하며, 4대 모두 백업이 되어야하므로 파일 데몬은 4대 모두 운영한다.  앞으로 디렉터 데몬은 DIR, 스토리지 데몬은 SD, 마지막으로 파일 데몬은 FD라고 부르도록 한다.

DB서버로 옮겨서 작업을 시작하자.  DIR을 설치하기 전에 MySQL부터 설치한다.  FD은 앞서 이미 설치했으므로 DIR 설치는 금방 끝날 거다.  MySQL DB 서버가 운영 중인 가상머신이나 혹은 이글을 보고 실습 중이신 분이 DIR을 운영하기로 결정한 머신에 접속해서 DIR을 설치한다.

$ sudo apt-get install mysql-server mysql-client
$ sudo apt-get install bacula-director-mysql

설치하는 도중에 MySQL 사용자 생성을 위한 MySQL root의 비밀번호를 묻고나서, DIR의 DB 유저명과 비밀번호 입력을 요구할 것이다.  편한대로 넣으면 되고, 중간에 실수가 있었을시 dpkg-reconfigure bacula-director-mysql 명령어로 정정하면 되겠다.  아니면 MySQL 접속해서 유저와 데이터베이스를 생성해주고난 뒤, DIR의 설정파일에서 직접 수정해주면 된다.  설치가 끝났으면 운영 중인지 확인해보자.

$ ps ax | grep bacula-dir

글쓴이는 netstat -ltnp로 포트가 열려있는지도 꼭 확인해볼 것을 추천한다.  왜냐하면, DB접속에서 에러가 발생할 경우, ps로 확인해보면 디렉터 데몬의 프로세스는 메모리에 떠있지만 실제로 운영은 되지않는 상태가 되기 때문이다.

Bacula를 터미널에서 제어할 수 있는 bconsole이라고 하는 CLI 툴을 설치한다.  일단은 설치만 하고, 운용법은 추후 설명한다.

$ sudo apt-get install bacula-console


이제 DIR의 설정파일을 보도록 하자.  파일의 위치와 이름은 /etc/bacula/bacula-dir.conf 이다.  디폴트값으로 작성되어 나오는 설정파일의 길이가 300라인이 넘기 때문에 섹션부터 간략하게 살펴본 뒤, 각 섹션별로 다시 차근차근 살펴보자.  섹션부터 나열한다.

Director {}
JobDefs {}
Job {}
FileSet {}
Schedule {}
Client {}
Catalog {}
Messages {}
Pool {}
Console {} 


이제 수정해야할 것을 설명하는데, 위에 나열된 대로 설명하진 않고 글쓴이가 원하는 순서로 설명할 예정이다.  왜냐하면, Jobs, JobDefs, Client, 그리고 FileSet은 항목이 아주 길며, Director, Catalog, Console은 항목이 하나만 있으면 되기 때문에, 일단 하나만 있으면 되는 항목들부터 설명하고, 이후부터 짧은 순서대로 설명하도록 하겠다.  참고로, Bacula의 설정에서는 사실 순서는 아무 상관없다.

1. Director {}
이 항목은 디렉터 데몬, DIR의 기본적인 사항을 설정하는 부분이다.  보통은 건드릴 건 없고 수정해야할 사항은 딱 두가지인데, 하나는 전편에서 우리가 쓸 MySQL DB로 쓸 현재 이 DIR의 서버이름인 dbserver-dir이 Name 항목에 똑같이 되어있는지 확인하고, 다른 하나는 DirAddress 항목에서 만약 내부적으로 쓰이는 FQDN이 있으면 그것을 넣어준다.  없으면 그냥 IP 주소를 넣어준다.  만약 이름을 바꿀 경우, 모든 FD과 SD의 디렉터 이름을 전부 다 바꿔야한다.  그러니, 그냥 우리가 하기로 했었던 이름인 dbserver-dir을 사용하도록 하자.

한 가지 더 수정을 한다면, Maximum Concurrent Jobs라는 항목이 있는데, 말 그대로 "최대 동시 작업수"를 지정하는 항목이다.  따라서 반드시 한 번에 한 서버만 백업이 실행되길 원하거나, DIR을 실행하는 서버의 성능이 떨어진다면 이 숫자를 조절하면 되겠다.


2. Catalog {}
Bacula는 백업하는 데이터를 빠르고 안전하게 관리하기 위해 DB를 사용한다고 앞서 설명했다.  보통은 apt-get으로 설치하면 설치과정 중 DB Username과 Password를 묻게되고, 그 부분이 여기에 저장되게 된다.  따라서, 설치 과정 중 뭔가 잘못됐다고 하더라도 여기서 잘 설정해주면 된다.  보시면 아시겠지만 어려운 건 없다.


3. Messages {}
Bacula는 백업의 성공, 혹은 에러 등에 대해 발생하는 모든 메시지들을 이메일로 보내주는 기능이 있다.  자세히 보면 Messages 섹션은 이름은 같되, 내용은 다소 짧은 같은 이름의 섹션이 하나 더 존재하는데, 하나는 이름이 Standard이며 다른 하나는 이름이 Daemon으로 되어있다.  Standard는 백업 및 복원의 실행 결과에 대한 메시지를 담당하며, Daemon은 그외 DIR, FD, SD간의 통신에 대해 발생하는 에러를 담당한다.

mailcommand 항목에서 smtp 서버의 호스트명만 설정해주면 나머지는 알아서 보내준다.  그리고 mail = root@localhost 항목의 발신자명만 바꿔주면 그외에는 특별히 건드려줄 부분은 없어보인다.


4. Console {}: 놔둔다. 현재로서는 건드릴 게 없다.


5. Storage {}
본격적인 설정의 시작이다.  여기서부터는 환경별로 다양한 설정이 나올 수도 있고, 갖고있는 장치별로 여러가지 설정을 해줄 수 있는 다양한 옵션이 제공되지만, 일단 하나만 명심하자.  Storage 섹션은 "저장장치의 지정"만 한다.  그러니까, 백업에 쓸 장치가 하드디스크인지 아닌지, 그리고 어디에 붙어있고 이름은 뭐고 등에 대한 것만 지정한다는 얘기다.  만약 백업에 쓸 장치가 다른 서버에 붙어있다면, 그 서버에는 SD(스토리지 데몬)만 설치하고 여기 설정파일에는 지정만 해주면 된다는 얘기다.  무척 편하다.  전편에서 설명드렸듯, 이 매뉴얼에서는 FTP 서버로 쓸 머신에 붙어있는 하드디스크 2개를 백업용으로 쓸 예정이다.  현업에 계시는 분들을 위해 이전 편에서 LTO-5의 실제 설정을 올려드렸다.

일단, 첫번째 하드디스크인 sda1은 OS용이므로 백업용도로는 건드리지 않기로 하자.
두번째 하드디스크인 sdb1은 /mnt/backup-1에 마운트 되어있다.  이것을 우리는 "Server Backup"이라는 이름을 붙이고, bacula라는 디렉토리를 만들어서 서버를 백업하는 용도로 사용하도록 하자.
세번째 하드디스크인 sdc1은 /mnt/backup-2에 마운트 되어있다.  이것을 우리는 "User Data Backup"이라는 이름을 붙이고, 역시 마찬가지로 bacula라는 디렉토리를 만들어서 FTP의 자료들을 백업하는 용도로 사용하도록 하자. 

이름을 정할 때 공란이 있을 경우, 반드시 쌍따옴표로 묶도록 한다. 

이 단계에서는 전편의 FTP 서버에 미리 설정해놓은 SD 설정파일의 Storage 섹션 내용이 필요하다.  비교해보자.  같은 항목끼리는 같은 색으로 표시했다.

FTP - SD (bacula-sd.conf) DB Server - DIR (bacula-dir.conf)

Storage {
  Name = ftp-sd
  SDPort = 9103
  WorkingDirectory = "/var/lib/bacula"
  Pid Directory = "/var/run/bacula"
  Maximum Concurrent Jobs = 20
  SDAddress = 10.211.55.34
}

Director {
Name = dbserver-dir
Password = "ZZzIzaBzvGSK5DU74h-RoEy9QXvAVXyyW"
}


Device {

  Name = FileStorage-1
  Media Type = File
  Archive Device = /mnt/backup-1/bacula
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
}

 

Device {
  Name = FileStorage-2
  Media Type = File
  Archive Device = /mnt/backup-2/bacula
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
}

Storage {
  Name = "Server Backup"
  SDAddress = 10.211.55.34

  SDPort = 9103
  Password = "ZZzIzaBzvGSK5DU74h-RoEy9QXvAVXyyW"
  Device = FileStorage-1
  Media Type = File

Storage {
  Name = "User Data Backup"
  Address = 10.211.55.34
  SDPort = 9103
  Password = "ZZzIzaBzvGSK5DU74h-RoEy9QXvAVXyyW"
  Device = FileStorage-2
  Media Type = File
}

 

 

 

 

 

 

 

 

 



 

매치되어야하는 항목들 (순서 관계 없음)
1. SD IP 주소 및 포트번호 = DIR에 정의된 SD의 IP 주소 및 포트번호
2. SD 디렉터 패스워드 = DIR 스토리지 패스워드 (위의 표에서는 나오지 않았지만, SD 디렉터의 이름은 DIR 디렉터의 이름과 반드시 맞아야한다.) 
3. SD 디바이스 이름 = DIR 스토리지 디바이스 이름
4. SD 미디어 타입 = DIR 미디어 타입

이것까지만 하고 스토리지 데몬의 동작을 확인해봤으면 좋겠지만, 스토리지 항목과 연계된 다른 항목들에서 에러가 발생하기 때문에 어쩔 수 없이 다른 항목들의 설정을 모두 마쳐야한다.

 

6. Pool {}
Pool은 다소 이해하기가 어려울 수 있다.  전편에서 설명했지만, Bacula는 백업되는 파일들을 Tarball처럼 하나의 파일로 묶고 이것을 마치 테이프 장치에 백업하는 것처럼 다룬다고 했다.  다시 상기시켜드리자면, 백업되는 파일의 목록들을 데이터베이스에 저장하고, 실제 파일들은 내용을 볼 수 없도록 보안상 하나의 파일로 합쳐서 보관을 하게 된다.  이 합쳐진 파일을 Volume이라고 부르는데, 동일한 목적을 갖고 생성된 Volume들을 하나로 묶어서 Pool이라고 부른다.  이것이 다소 불편할 수도 있긴 하겠지만 편한 경우가 더 많다는 것을 설명드리고 싶다.  또한, DB가 망가진 상황을 대비하여 수동으로 복구할 수 있는 툴도 제공되고 있으니 너무 걱정하지 않아도 된다.  

쉽게 생각하면, 테이프 장치 생각하시면 된다.  각각의 볼륨이 각각의 테이프라고 생각하시면 되겠다.  볼륨 개념은 Bacula가 백업수행을 테이프 장치에 한다는 것을 기본 작동모델로 삼았다고 이전 편에서 설명드렸다.

예를  들어서, 1TB짜리 하드디스크가 하나 있고 여기에 내가 가진 모든 것을 백업하려고 한다고 가정하자.  사진이 대략 30기가, 음악이 대략 20기가, 각종 프로그램들 모아놓은게 100기가, 동영상 500기가, 그리고 앱스토어에서 다운받아놓은 앱들이 30기가 있다고 치자.  그러면 각각의 목적에 맞는 Pool들을 생성해서 관리하는 것을 생각해볼 수 있는데, 혹시 모르니까 하나의 Pool은 최대 용량을 10GB짜리 볼륨으로 관리한다고 치자.  그렇다면,

1. 아이폰/안드로이드 앱용 Pool 10GB x 8 vols = 80GB (앱이 아무리 많더라도 80기가 이상의 공간은 쓰고싶지 않다는 의미)
2.  사진용 Pool 10GB x 8 vols = 80GB
3.  프로그램용 Pool 10GB x 20 vols = 200GB
4.  동영상용 Pool 10GB x 50 vols = 500 GB
5.  음악용 Pool 10GB x 4 vols = 40GB

이렇게 해서 대략 900GB 정도의 백업공간을 맞춰놓았다.  그런데 생각해보니, 음악은 어차피 아이튠즈에서 구입한거니까 날아가더라도 다시 다운받으면 되고 모바일용 앱도 마찬가지고해서, 여기에다 용량을 주는게 좀 아깝다고 치자.  그래서 백업주기를 30일로 맞춰놓고 공간을 적당하게 주면, Bacula가 30일짜리 싸이클을 한 번 돌면서, 30일 이전의 자료는 알아서 자동으로 삭제를 해주므로 원하지 않는 자료들이 불필요한 공간을 차지하는 것을 방지하는 좋은 방법이 될 수 있는 것이다.  참고로, 본인이 근무하는 곳에서는 서버 백업용으로 총 10개의 볼륨에 볼륨 하나당 용량을 50기가 정도로 맞춰놨다.  이제 내용을 살펴보자.  위의 설명을 이해했 으면 이제 이 설정은 눈에 쉽게 들어오실 거다.   설명을 해보면,

Pool {
  Name = "For ServerFiles" Pool 이름을 For ServerFiles이라는 지정한다.
  Pool Type = Backup # 용도는 백업이다.  백업 외에 Archive, Cloned, Migration, Copy, Save 등의 특수한 타입이 있다.
  Recycle = yes # 위에서 설명한 대로, 지정한 주기가 끝나면 다시 처음부터 되돌아가는 "재활용 주기"를 지정한다.  테이프로 생각하면, 다시 처음으로 감는다고 생각하면 된다.
  AutoPrune = yes # 볼륨 내에서 주기가 지난 파일들을 자동으로 삭제해주는 옵션이다.
  Volume Retention = 365 days # 볼륨 자체의 주기를 지정한다.  이 예제에서는 365일이 지정되어있다.  이것은, 최근 1년간 사용되지 않는 볼륨이 있을시 볼륨을 비워버린다.
  Maximum Volume Bytes = 50G # 이 Pool에서 사용할 볼륨들의 최대 크기를 지정한다.  여기서는 50GB로 지정되어있다.
  Maximum Volumes = 100 # 이 Pool에서는 볼륨의 최대 갯수를 100개로 제한한다.  따라서, 이 Pool의 최대 사이즈는 50G x 100 = 5TB 정도 되겠다. 
  Storage = "Server Backup" # 이 Pool은 용도가 서버백업용이므로 저장장치로는 SD의 첫번째 백업장치로 마운트 되어있는 /mnt/backup-1/bacula를 사용한다 (위의 표 참고).
}

 

7. Schedule {}
스케쥴은 별로 설명할 게 없다.  Bacula의 설정이 워낙 직관적이기 때문에 딱 보면 누구나 알 수 있기 때문이다.   일단, 기본값으로 설정되어진 스케쥴 중 하나를 설명드린다.

Schedule {
  Name = "WeeklyCycle" # 이름을 지정한다.  지금껏 따라오신 분들은 눈치채셨겠지만, Bacula에서 이름은 아주 중요하다.  밑에서 설명할 Job/JobDefs에서 쓰이게 된다.
  Run = Full 1st sun at 23:05 # 매월 첫째주 일요일 밤 11시 5분에는 "전체 백업"을 실시한다.
  Run = Differential 2nd-5th sun at 23:05 # 매월 둘째주부터 5째주까지 일요일 밤 11시 5분에는 변경분에 대한 백업을 실시한다.
  Run = Incremental mon-sat at 23:05 # 매주 월요일부터 토요일 밤 11시 5분에는 증분 백업을 실시한다.
}

위의 예제처럼 꼭 전체/변경/증분을 모두 넣어야하는 건 아니다.  여러가지 스케쥴 세트를 만들고, 각 서버별로 백업을 하면 된다.  예를 들어, DB서버는 매일 밤 10시마다 무조건 전체백업을 실시하고, 데스크탑 종류는 월 1회만 전체백업, 그외는 증분백업만 실시하고, 개발서버는 무조건 증분백업만 실시하게끔 해서 목적별로 다양한 스케줄 세트를 지정해서 사용할 수 있다.

참고하시라는 차원에서 설정 몇 줄을 더 보여드린다.
Run = Full 1st,3rd sat at 02:00
Run = Full Hourly at 0:05 # 매시 5분
Run = Incremental on 1 at 2:05
 # 매월 1일

 

8. FileSet {}
이 섹션은, "어떤 파일들이 백업되어야하는가"를 직접 지정하는 부분이다.  기본값으로 나온게 카탈로그 백업 밖에 없으므로, 글쓴이가 관리하는 서버의 FileSet 예제 하나를 보여드린다.  이름은 Standard Backup FileSet이라고 해놨는데, 이 FileSet의 목적은 특별히 백업되어야할 게 없는 평범한 서버를 지정하기 위해서다.

FileSet {

  Name = "Standard Backup FileSet" # 이름을 지정한다.  역시, 밑에서 설명할 Job/JobDefs에서 쓰인다.

  Include { # 백업 작업시 포함되어야할 내용을 기술한다.

    Options {

      signature = MD5 # 파일검증을 MD5로 한다.  다른 옵션으로는 SHA1을 쓸 수 있다.

      compression = GZIP # 파일을 압축한다.  다른 옵션으로는 LZO가 있다.  만약, 테이프 장치를 사용할 예정이라면, 사용 중인 테이프 장치가 자체 압축을 지원한다면 이 옵션은 끄는게 좋다.

    }

    File = /home # 백업되어야할 목록을 기록한다.

    File = /etc
    File = /var 

  }
  Exclude {
 # 백업시 제외되어야할 목록을 기록한다.
    File = /var/run
  } 

}

 

클라이언트가 윈도우 서버일 경우, Microsoft 제품의 운영체제가 경로에 사용하는 백슬래시 (\)를 슬래시 (/)로 바꿔주거나 혹은 백슬래시를 두 개 붙여주면 된다..
예)
File = "C:/Program Files/Microsoft SQL Server"
File = "C:\\Program Files\\Microsoft SQL Server" 

FileSet의 설명은 이게 전부다.  역시 느끼는 거지만, 정말로 쉽다.  사실 이거 말고도 엄청나게 많은 옵션이 있는데, 몇 가지 유용해보이는 것만 소개해드리고 더 궁금하신 분은 아래의 링크를 참고하시면 되겠다.
http://www.bacula.org/5.2.x-manuals/en/main/main/Configuring_Director.html

hfsplussupport=yes # MacOSX의 HFS+ 파인더 정보를 지원한다.
aclsupport=yes # POSIX ACL을 지원한다.
wildfile = "*.gz"  # 와일드카드를 사용한다.  확장자가 gz인 파일들을 포함하거나 제외시킨다.
wildDir = "[A-Z]:/Documents and Settings/*/Application"
RegexDir = "^/home/[c-z]" # 정규식을 사용하여 파일 및 디렉토리들을 포함/제외 한다.
Exclude = yes # 이 옵션이 Include 섹션에 사용됐을 경우, wildfile / wildDir, RegexDir에 정의된 파일은 제외시킨다.
xattrsupport=yes
 # xattr을 지원한다.  다만, 이 옵션의 스트림 포맷은 OS간에 서로 호환이 되지않으므로 다른 OS간에는 지원되지 않는다.
xattr 지원되는 OS: AIX, Darwin, FreeBSD, IRIX, Linux, NetBSD, Solaris, Tru64 

다른 예제를 몇 개 더 보자.  /home을 백업하는데, *.c는 제외하도록 한다.  FIleset { 부분과 Name은 건너뛰고 Include만 보여드린다.
Include {
    Options {
        wildfile = "*.c"
        Exclude = yes
    }
    File = /home
}

이번에는, 확장자가 Z인 파일들과 gz인 파일들만 백업해보자.

Include {
    Options {
        wildfile = "*.Z"
        wildfile = "*.gz"

    }
    Options {
        Exclude = yes
        RegexFile = ".*"
    }

    File = /home
}

참고로 Include {} 항목 내에서의 Exclude = yes가 아닌, Exclude {} 항목의 경우는 정규식이나 와일드 카드 등으 표현식은 지원되지 않는다.

 

 

9. JobDefs {} / Job {}

실제로 작업을 실행하는 부분이다.  물론 위의 항목들이 하나라도 준비가 안되면 백업이 진행되지 않긴 하지만, 나중에 설명할 GUI 프로그램인 Bacula Admin Tool을 써보면 그때 알게된다.  여기가 바로 백업을 실행하는 부분이다.  일단 예제를 먼저 보자.  JobDefs부터 시작한다.  아래의 예제는 글쓴이가 관리하는 LDAP 서버들의 백업을 위한 설정이다.

JobDefs {

  Name = "LDAP JobDefs"

  Schedule = "Standard"

  Type = Backup

  Messages = Standard

  Pool = Volume_File

  FileSet = "LDAP Backup FileSet"

  ClientRunBeforeJob = "/usr/local/sbin/ldapbackup.sh"

}

JobDefs는 공통적인 작업에 대한 부분을 정의해놓는 섹션인데, 따라서 JobDefs는 있어도 되고 없어도 된다.  다만, 수많은 서버들이 공통적이거나 중복되는 설정이 많다면 그것을 모아서 하나로 정의할 수 있는 편의를 제공해준다는 점 정도로 보면 되겠다.

 

10. Client {}

백업이 되어야할 클라이언트에 대한 주소와 이름 등을 지정해주는 부분이다.  특별한 건 없다.

Client {
  Name = "Desktop"
  Address = "192.168.0.100"
  Catalog = "MySQL"
  FdPort = 9102
  MaximumConcurrentJobs = 1 // 동시에 백업될 수 있는 최대 접속수를 지정한다.
  Password = "desktop-bacula" // 패스워드의 형식은 따로 없다.
} 

 

모든 설정이 끝났다.  일단은 테스트를 위해 최소한으로만 설정해보자.  쉬운 테스팅을 위해서 글쓴이는 비밀번호를 전부 쉽게 바꿔버렸다.  bacula-dir.conf 전체내용을 보자.

Director {
  Name = dbserver-dir
  DIRport = 9101
  QueryFile = "/etc/bacula/scripts/query.sql"
  WorkingDirectory = "/var/lib/bacula"
  PidDirectory = "/var/run/bacula"
  Maximum Concurrent Jobs = 1
  Password = "dir"
  Messages = Daemon
  DirAddress = 10.211.55.33
}

JobDefs {
  Name = "DefaultJob"
  Type = Backup
  FileSet = "Full Set"
  Storage = "Server Backup"
  Messages = Standard
  Priority = 10
  Write Bootstrap = "/var/lib/bacula/%c.bsr"
  Schedule = "WeeklyCycle"
}

Job {
  Name = "DBServer Backup"
  JobDefs = "DefaultJob"
  Pool = Server
  Client = "DBServer"

}

Job {
  Name = "FTP Backup"
  JobDefs = "DefaultJob"
  Client = "FTP Server"
  Pool = "User Data"

}

Job {
  Name = "WEB Backup"
  JobDefs = "DefaultJob"
  Pool = Server

  Client = "Web Server"
}

Job {
  Name = "Desktop Backup"
  JobDefs = "DefaultJob"
  Client = "Desktop"
  Pool = Server

}

Job {
  Name = "BackupCatalog"
  Client = "DBServer"
  Type = Backup
  Level = Full
  Messages = Standard
  FileSet = "Catalog"
  Pool = Server
  Schedule = "WeeklyCycleAfterBackup"
  RunBeforeJob = "/etc/bacula/scripts/make_catalog_backup.pl MyCatalog"
  RunAfterJob = "/etc/bacula/scripts/delete_catalog_backup"
  Write Bootstrap = "/var/lib/bacula/%n.bsr"
  Priority = 11
}


FileSet {
  Name = "Full Set"
  Include {
    Options {
      signature = MD5
    }
    File = /
  }
  Exclude {
    File = /var/lib/bacula
    File = /sys
         File = /run
    File = /proc
    File = /tmp
    File = /.journal
    File = /.fsck
  }
}

Schedule {
  Name = "WeeklyCycle"
  Run = Full 1st sun at 23:05
  Run = Differential 2nd-5th sun at 23:05
  Run = Incremental mon-sat at 23:05
}

Schedule {
  Name = "WeeklyCycleAfterBackup"
  Run = Full sun-sat at 23:10
}

FileSet {
  Name = "Catalog"
  Include {
    Options {
      signature = MD5
    }
  File = "/var/lib/bacula/bacula.sql"
  }
}

Client {
  Name = "DBServer"
  Address = 10.211.55.33
  FDPort = 9102
  Catalog = MyCatalog
  Password = "dbserver"
  File Retention = 30 days
  Job Retention = 6 months
  AutoPrune = yes
}

Client {
  Name = "FTP Server"
  Address = 10.211.55.34
  FDPort = 9102
  Catalog = MyCatalog
  Password = "ftpserver"
  File Retention = 30 days
  Job Retention = 6 months
  AutoPrune = yes
}

Client {
  Name = "Web Server"
  Address = 10.211.55.35
  FDPort = 9102
  Catalog = MyCatalog
  Password = "webserver"
  File Retention = 30 days
  Job Retention = 6 months
  AutoPrune = yes
}

Client {
  Name = "Desktop"
  Address = 10.211.55.32
  FDPort = 9102
  Catalog = MyCatalog
  Password = "desktop"
  File Retention = 30 days
  Job Retention = 6 months
  AutoPrune = yes
}


Storage {
  Name = "Server Backup"
  Address = 10.211.55.34
  SDPort = 9103
  Password = "storage"
  Device = FileStorage-1
  Media Type = File
}

Storage {
  Name = "User Data Backup"
  Address = 10.211.55.34
  SDPort = 9103
  Password = "storage"
  Device = FileStorage-2
  Media Type = File
}


Catalog {
  Name = MyCatalog
  dbname = "bacula"; DB Address = "127.0.0.1"; dbuser = "bacula"; dbpassword = "bacula"
}

Messages {
  Name = Standard
  mail = root@localhost = all, !skipped
  operator = root@localhost = mount
  console = all, !skipped, !saved
  append = "/var/lib/bacula/log" = all, !skipped
  catalog = all
}


Messages {
  Name = Daemon
  # mailcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r"
  mail = root@localhost = all, !skipped
  console = all, !skipped, !saved
  append = "/var/lib/bacula/log" = all, !skipped
}

Pool {
  Name = Server
  Pool Type = Backup
  Storage = "Server Backup"
  Recycle = yes
  AutoPrune = yes
  Maximum Volume Bytes = 50G

  Volume Retention = 365 days
}

Pool {
  Name = "User Data"
  Pool Type = Backup
  Storage = "User Data Backup"

  Recycle = yes
  AutoPrune = yes
  Volume Retention = 365 days
  Maximum Volume Bytes = 50G
  Maximum Volumes = 100
}


Console {
  Name = dbserver-mon
  Password = "eIHC8_gqenYpPFXbCc6-r0lFHx9B5azJ9"
  CommandACL = status, .status
}

 

내용이 길어서 상당히 복잡해보이지만 하나만 기억하자.  "모든 설정은 Name이 매치된다".  추후에 설정을 나누는 법에 대해서 다루겠다.

간단하게 설명을 하자면,
1. JobDefs에서 DefaultJob이라는 기본 백업룰을 하나 만들고 공통적인 사항은 모두 넣었다.  
2. 각 클라이언트별로 Job을 생성해주되 BackupCatalog라는 별도의 카탈로그 백업 Job을 생성해줬다.  이 백업은 DefaultJob과는 내용이 완전히 다르기 때문에 JobDefs가 필요하지 않다.
3. 백업되어야할 파일들(FileSet)은 일단 Full Set과 Catalog, 이렇게 두개만 만들었다.  당연한 얘기지만 여러개의 파일셋을 만들고 상황별로 백업이 가능하다.
4. 스토리지는 이전 편의 예제에 설명했듯이, 두 개의 스토리지를 만들어서 하나는 서버백업용, 나머지 하나는 유저 데이터 백업용으로 한다고 했다.
5. Messages란의 mailcommand는 주석처리 했다.  일단 테스팅용이므로 메일은 생략한다.

이제 DIR을 재시작해서 에러가 있는지 확인하자.  위의 설정을 그대로 쓴다면 에러없이 재시작이 가능할거다.  netstat으로 작동 중인지 확인해보자. 

 

다음 편에서는 실제로 백업을 실습해본다.  현재로서는 이해가 되지않는 항목이 있더라도 그냥 넘어가도록 하자.

블로그 이미지

Seowon Jung jswlinux

Seowon Jung의 잡동사니 보관소

댓글을 달아 주세요

  • weblegend 2015.01.02 23:19  댓글주소  수정/삭제  댓글쓰기

    yubikey 서버측 인증 어플리케이션이나 알고리즘은 직접 만들어줘야 하나요? 서버 어플리케이션도 포함되어 있나요?
    프로그램을 해 넣을 수 있다는게 매력포인트네요.ㅋ.
    회사에서 사용한다면 usb잊어버리거나 부서지면 어떻하나요?

    • Seowon Jung jswlinux 2015.01.05 12:42 신고  댓글주소  수정/삭제

      안녕하세요. 코멘트를 다른 글에 달아주셨네요.

      일단, yubikey의 인증서버는 yubikey 회사에서 기본으로 제공하는 서버를 쓸 수 있고, 사내에 내부 인증서버를 둘 수도 있습니다. 이 인증서버는 yubikey를 제작한 회사인 yubico에서 vmware 이미지가 올라와있으므로, 이것을 그대로 사용하실 수 있습니다.

      USB로 되어있는 키를 잃어버리시면 방법이 없겠죠. 집 대문키 잃어버리면 자물쇠 뜯어내지 않으면 못들어가는 것처럼 이것도 마찬가지입니다. 다만, 리눅스의 경우 로그인시 pam.d 설정을 통해서 패드워드와 키 둘 다 쓸 수 있게끔 해놓으면 대비가 되겠네요.

      도움이 되셨길 바랍니다.

  • weblegend 2015.01.02 23:43  댓글주소  수정/삭제  댓글쓰기

    페이지에 나와있는 방식을 보니까 U2F가 챌린지 응답 방식으로 되어있네요
    salt 같은 임의의 난수들을 서버에서 받는 과정등이 중간자 공격 등으로 보안이 취약해 지지 않을까요?
    물론 yubikey 디바이스의 OTP 알고리즘을 커스터마이징하면 보안에 강할 수 있겠지만, 암호 생성방식이 파악당한다면 뚫리지 않을까요?
    다른 OTP인증 방식도 예외가 아니겠지만요.

    • Seowon Jung jswlinux 2015.01.05 12:47 신고  댓글주소  수정/삭제

      안녕하세요. 코멘트를 다른 글에 달아주셨네요.

      일단 암호생성방식이 파악되면 뚫리지않을 암호는 세상 어디에도 없겠죠? 그래서, yubikey 홈페이지에서 문서를 보시거나, 펌웨어 업데이트용 프로그램을 받아서 보시면 아주 다양한 방법으로 암호화를 할 수 있게 제공해줍니다. 너무나도 옵션이 다양해서 키 없이 암호를 알아내긴 어렵지 않나 싶습니다.

      아무래도 궁금하신 부분은, yubikey 펌웨어 업데이트용 프로그램을 써보셔야 이해가 가실 것 같네요. 가격이 얼마 안하니까 하나 구입해서 써보시는 걸 추천해드립니다.

      도움이 되셨길 바래요.

  • 2015.06.30 16:54  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Seowon Jung jswlinux 2015.07.01 08:41 신고  댓글주소  수정/삭제

      안녕하세요 namoo님

      백업서버가 여러 곳에 나뉘어져있거나 여러 장치가 한 서버에 연결되어있더라도, Bacula의 스토리지 데몬이 설정된대로 잘 제어해주기 때문에 충돌은 나지 않습니다. 그냥 디렉토리 지정해준다고 생각하시면 되겠습니다.

      기본적으로 Bacula는 오픈소스 소프트웨어이므로 사용 자체는 무료입니다. 별도의 특별한 플러그인이 필요하시면 그때 상용지원버전을 구입하셔도 됩니다. 상용버전 안내 홈페이지는 여기를 참고하세요: http://www.baculasystems.com/

      좋은 하루 되세요.

설치를 해보자.  Bacula의 설치는 무척이나 간단하다.  먼저, 어떤 머신을 디렉터로 쓰고 어떤 머신을 스토리지로 쓸건지 정해야할텐데 설마 이 글을 보면서 현 업무에 바로 적용하실 분은 없을거라 가정하고, 일단 Bacula의 클라이언트가 될 머신들부터 설치를 하자.  글쓴이는 매뉴얼을 써야하므로 쉬운 이해를 위해 총 4대의 가상 컴퓨터를 운영한다고 들어가기편에서 미리 언급했다.  자세한 사항을 나열해본다.  참고로, 모든 가상머신용 운영체제는 우분투 12.04 64비트를 사용했으며, 루트 파티션으로는 8기가를, 램은 1기가를 할당했다.

상황을 가정해보자.  데스크탑 1, 웹서버 1, MySQL DB서버 1, FTP 서버 1.  총 4대의 머신이 있다.  다음의 조건을 정하도록 한다.

1. 4대 모두 백업되어야한다.
2. FTP 서버가 그나마 스토리지의 용량이 가장 커야할테니, FTP 서버를 스토리지 데몬으로 운영하도록 한다.  루트파티션용 하드디스크 외에 별도로 2개의 20기가짜리 가상 하드디스크를 더 붙인다.
3. 본 매뉴얼에서는 스토리지 데몬과 디렉터 데몬을 각기 다른 서버에 나눠서 운영하는 것으로 정했다.  현실적으로는 CPU의 부하가 덜한 FTP 서버에서 디렉터 데몬도 함께 돌려야겠지만, 여기서는 DB 설정의 편의상, DB서버에서 디렉터 데몬을 운영하게 한다.  디렉터 데몬용 가상머신을 한 대 더 올리려니 실습치고는 너무 복잡해보여서 수정했다.
4.  Bacula 백업을 위한 DB는 꼭 하나만 돌아갈 필요는 없다.  하지만 역시 마찬가지로 설정의 편의상 하나만 돌리며, 백업 규모가 수천대가 아니라면 하나로도 충분하다고 판단된다.  그리고 DB는 보안상, 그리고 성능상 실제 현업에서 운영 중인 DB 서버와는 별개로 운영하는 것이 맞겠지만, 경험상 디렉터 데몬과 디렉터 데몬이 사용할 DB가 서로 다른 곳에 있으면 성능상 좋지않았다.  또한 위에 적은 이유도 있고해서, DB는 디렉터 데몬이 설치될 곳에 설치한다.
5.  호스트명은 각각 desktop, webserver, dbserver 그리고 ftp라고 정한다.

정리해보자.
DB Server - 디렉터 데몬, 파일 데몬, MySQL 데이터베이스 서버
FTP Server - 파일 데몬, 스토리지 데몬, vsFTPd, 하드디스크 2개 추가
Web Server - 파일 데몬, Apache2
Desktop - 파일 데몬, 그외 데스크탑용 어플리케이션들 

나중에 fstab을 설정하는게 귀찮으신 분들께서는, FTP 머신 설정하기 전에 하드디스크 2개를 더 붙이고 이것들을 설치 과정에서 파티션을 생성하고 ext4로 포맷한뒤, 각각 /mnt/backup-1 그리고 /mnt/backup-2로 마운트 포인트를 주도록 하자.

 

일단 가장 쉬운 "클라이언트"부터 설치해보자.  서버-클라이언트의 개념으로 놓고보자면, 클라이언트의 역할을 하는 데몬은 파일데몬이다.  클라이언트용으로 필요한 패키지는 딱 2개이며,  bacula-common과 bacula-fd 이다.  설치는 아시다시피 뻔하다.  sudo apt-get install bacula-fd 이것만 쳐주면 bacula-common은 알아서 딸려온다.  위의 조건 #1에서, "4대 모두 백업되어야한다"고 했으니, 파일데몬 설치 명령어는 4대 모두 실시해야한다.  즉, 위의 설명대로 FTP 서버는 스토리지 데몬과 파일 데몬이 같이 돌아가는 것이고, DB서버는 디렉터 데몬과 파일데몬이 같이 돌아가게 되는 것이다.

용량이 크지않기 때문에 설치는 금방 끝난다.  설치가 끝났으면, 아무 가상머신에서 /etc/bacula/bacula-fd.conf 파일을 열어보도록 하자.  루트권한이 필요하다.  주석을 제외한 핵심만 보도록 하자.  글쓴이는 데스크탑에서 작업해보도록 한다.

Director {
  Name = desktop-dir 
  Password = "39oawhr8gQpsSDq3948tWwe4SdlED12LZ12" 
}

Director {
  Name = desktop-mon
  Password = "Jd904Kddfjw3932djv4Ldvn4234I3damz" 
  Monitor = yes


FileDaemon {
  Name = desktop-fd
  FDport = 9102
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /var/run/bacula
  Maximum Concurrent Jobs = 20
  FDAddress = 127.0.0.1
}

Messages {
  Name = Standard
  Director = desktop-dir = all, !skipped, !restored
}

이번에는 이걸 그림으로 표현한 것을 보자.

 

이 매뉴얼을 보시는 분들이라면 현업에서 이미 시스템 관리자로 일하시는 분들이 대부분일거라 짐작되며, 그렇지 않은 분들이라도 리눅스 쓰는데 익숙하신 분들이라면 위의 설정은 딱 보면 아마 다들 한 번에 이해하실 거다.  참고로, 동시에 백업 가능하도록 허용된 최대 백업은 20이라고 지정되어있다.  아마 이 옵션 필요하신 분들이 많을 것으로 생각한다.

일단 항목별 설명부터 드린다.  
첫번째 Director 섹션은, desktop-dir 이라고 되어있는데, 이 부분은 디렉터 데몬이 파일 데몬에게 접속을 요청할 때 패스워드를 인증하는 부분이다.  따라서, 디렉터 데몬을 위한 부분이다. 
두번째 섹션은, 자세히 보면 뒤에 -mon 이라는 글자가 붙어있는데, 예상하시는대로 모니터링용 섹션이다.  이 부분은 나중에 따로 설명드린다.  참고로 *거의* 사용하지 않는다.  하지만, 규모가 거대한 곳이라면 필요할 수도 있다.
세번째 섹션은 파일 데몬이 작동하는 부분이다.
마지막 네번째 Messages 섹션은 작업메시지를 처리하는 부분이다.  한 번만 설정하면 다시는 건드릴 일이 없다.

여기서 우리가 건드려야할 부분은 딱 2개다.  정말이다.  파일데몬 설정은 건드릴게 아예 없다고 봐도 될 정도다.  건드려야할 2개 중 하나는 디렉터 데몬의 이름인데, 데스크탑의 호스트명은 desktop이라고 하기로했고 따라서 자동으로 호스트명-dir이 붙은 것뿐이다.  desktop-dir을 본 매뉴얼에서 쓰기로 정한 디렉터 데몬 이름으로 바꿔주기만 하면 된다.  이 매뉴얼에서의 디렉터 데몬은 DB서버에 설치하기로 했고, DB서버의 이름은 위에서 편의상 dbserver라고 하기로 했다.  따라서, desktop-dir이라고 되어있는 이름을 dbserver-dir로 바꿔주고 저장한 다음, 파일데몬을 재시작해주자.  참고로, 이름은 중요하다.  Bacula는 모든 객체를 이름으로 구분한다.  bacula-fd.conf에 들어가는 디렉터 데몬의 이름과, 실제 디렉터 데몬의 이름은 반드시 같아야한다 (디렉터 데몬 부분에서 다시 설명드린다).  물론, 디렉터 데몬이나 파일데몬의 이름이 꼭 호스트명으로 이루어져야하는건 아니라는 점을 알아두자.  나머지 다른 하나는 FDAddress = 127.0.0.1이라는 디폴트값을 loopback이 아닌 FQDN이나 eth0 등의 실제 내/외부에서 지정된 IP 주소나 호스트명을 넣도록 한다.

sudo service bacula-fd restart

가상머신 4대 전부 위에서 했던 것들을 똑같이 해주되, Password는 변경 후 꼭 기억하고 있자.  나중에 해깔린다.  앞서 설명했듯 저 패스워드는 디렉터 데몬이 파일데몬과 통신하기 위한 인증암호인데, 파일데몬의 패스워드와 똑같은 패스워드를 디렉터 데몬이 갖고있어야 접속할 수 있다.  다시 말하자면, 디렉터 데몬은 자신이 접속할 클라이언트의 비번을 알아야 접속을 한다는 것이다.  정말 간단하지 않은가?  클라이언트는 이것으로 더 이상 손댈 게 없다.  한 가지 더 추가한다면, sudo netstat -ltnp를 입력해서 해당 포트가 해당 데몬에 의해 제대로 열려있는지 확인하는 정도는 해볼 수 있겠다.

$ sudo netstat -ltnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address     Foreign Address State      PID/Program name
tcp   0      0      127.0.0.1:9102    0.0.0.0:*       LISTEN     4760/bacula-fd
tcp   0      0      127.0.0.1:53      0.0.0.0:*       LISTEN     4980/dnsmasq
tcp   0      0      127.0.0.1:631     0.0.0.0:*       LISTEN     4980/cupsd

제대로 동작하고 있다.  그럼 이쯤에서 수정이 완료된 bacula-fd.conf 파일을 보자.  보시면 아시겠지만, Name이랑 FDAddress 빼고는 바뀐게 없다.  바뀐 부분은 붉은 색으로처리했다.

Director {
  Name = dbserver-dir 
  Password = "desktop
}

Director {
  Name = desktop-mon
  Password = "Jd904Kddfjw3932djv4Ldvn4234I3damz" 
  Monitor = yes


FileDaemon {
  Name = desktop-fd
  FDport = 9102
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /var/run/bacula
  Maximum Concurrent Jobs = 20
  FDAddress = 10.211.55.32
}

Messages {
  Name = Standard
  Director = dbserver-dir = all, !skipped, !restored
}

 

참고로 패스워드에 대한 추가설명을 해드리자면, 패스워드는 설치시 자동으로 생성되지만 특별한 규칙은 없다고 공식 매뉴얼에 기술되어있다.  따라서, 별도의 원하는 패스워드가 있으면 그것을 써도 무방하겠다.

 

 

이제 스토리지 데몬을 보자.  스토리지 데몬은 FTP 머신에 설치하기로 했으므로, FTP 머신으로 옮겨서 작업을 진행한다.  스토리지 데몬의 설치는 bacula-sd-mysql만 하면 된다.  파일데몬 설치하는 것만큼이나 쉽다.

$ sudo apt-get install bacula-fd bacula-sd-mysql

그림부터 보자.

 

파일데몬과 다른건 Device 섹션이 더 추가된 것 뿐이다.

예상하시는대로 설정파일은 /etc/bacula/bacula-sd.conf이며, 마찬가지로 루트권한이 필요하다.  기본적인 구조도 파일데몬과 거의 비슷한데, 먼저 디렉터 데몬의 이름과 패스워드를 위한 섹션, 모니터 섹션, 스토리지 데몬을 위한 섹션 (그래봐야 포트 번호랑 데몬 이름 말고는 다를 것도 없다), 그리고 각각의 저장장치에 대한 설정이 전부다.  데몬 설치 후 설정파일 열면 디렉터 데몬 이름 바꿔주는 거랑 저장장치 추가하는 거 외에는 특별히 할 일이 없다.  설정파일을 보자.  일단은 설명을 위해 설치하자마자 바로 생성된 파일을 수정없이 올린다.  마찬가지로 주석처리된 부분은 제외한다.

Storage {
  Name = ftp-sd
  SDPort = 9103
  WorkingDirectory = "/var/lib/bacula"
  Pid Directory = "/var/run/bacula"
  Maximum Concurrent Jobs = 20
  SDAddress = 127.0.0.1


Director {
  Name = ftp-dir 
  Password = "29q48hfaFiuhfGq234908aHer" 
}

Director {
  Name = ftp-mon
  Password = "2309IOdf23D302jlsdfawerfcdf"
  Monitor = yes
}

Device {
  Name = FileStorage
  Media Type = File
  Archive Device = /nonexistant/path/to/file/archive/dir
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
}

…….. (생략)


Messages {
  Name = Standard
  director = ftp-dir = all
}

여기서 실제 파일의 Messages 섹션 위의 주석처리된 부분을 보면, 테이프 장치 및 여러가지 저장장치에 대한 옵션의 예제들이 주석처리되어있다.  자세히 보면 auto-changer도 보이고, Bacula에서 제공하는 mtx-changer 명령어도 보인다. 

첫번째로 할 일은 아마 다들 예상하시겠지만, 디렉터 데몬의 이름을 바꿔주는 거다.  위에서 언급했듯, 디렉터 데몬의 이름은 dbserver-dir이 될 예정이므로 ftp-dir이라고 적혀있는 부분을 dbserver-dir로 변경해주자.  두번째로는 SDAddress 항목에서 마찬가지로 loopback으로 두면 안되고, 내부 네트워크에서 사용하는 FQDN이 있으면 그것을 넣어주거나 아니면 IP Address를 지정해주자.  여기서는 10.211.55.34라는 주소를 사용한다.

세번째이자 마지막으로 할 일은 저장장치를 추가해주는 것이다.  테이프 백업장치가 없으신 분들이라면 아마 간단하게 끝내실 수 있을 것 같다.  일단 본 매뉴얼에서는 가상머신을 이용하기로 했고, 가상 테이프 백업장치를 이용한 설명은 추후 고급편에서 설명하도록 하겠다.  따라서, 10GB 용량의 하드디스크 2개를 더 생성해서 이것을 붙이도록 한다.  FTP용 가상머신에 설치하기로 했으므로, 가상머신을 옮겨서 설치하도록 한다.  편의상 이 둘을 각각 /mnt/backup-1, 그리고 /mnt/backup-2에 마운트 하고, 부팅시마다 자동으로 마운트하는 것으로 fstab을 수정해놨다고 가정한다 (아니면 설치시 미리 되어있거나).  일단 본 매뉴얼에서는 하드디스크를 이용한 백업만 하기로 결정했지만, 테이프 백업장치를 설정한다고 해도 제대로 구성되어진 설정이 주석처리되어있으므로 그것들의 주석만 풀어서 그냥 그대로 써도 된다 (이름 제외하고는 수정할 필요가 없다).  

만약 스토리지 데몬 자체의 이름을 따로 사용하고 싶으신 분은 Name 항목을 모두 바꿔주시면 되겠다.  주의사항은, ftp-sd를 FTPStorage-sd라고 바꾼다면, 모니터링 항목의 ftp-mon 역시 반드시 FTPStorage-mon 이라고 변경되어야하며, 스토리지 섹션에는 이름 뒤에 반드시 -sd가 붙어야하며, 모니터링 항목에는 반드시 뒤에 -mon이 붙어야하고, 마지막으로 이름에는 공란이 들어갈 경우 반드시 쌍따옴표로 묶어줘야한다.  하지만, 사실 이름은 전혀 중요하지 않다.  나중에 클라이언트들을 식별하기 위한 이름은 클라이언트가 아닌 디렉터 데몬에서 설정하기 때문이다.  따라서, 이름은 그냥 냅두도록 하자.  

하드디스크 백업장치의 지정은, 장치명을 지정해주는 것이 아니라 마운트 포인트를 지정해주는 것이라 상당히 편리하다.  한 하드디스크 내에서도 공간을 원하는대로 나눠서 쓸 수 있다는 장점이 되겠다.

그외, 동시에 여러개의 백업 작업이 실행되는 관계로 이것에 대한 속도저하 내지는 한 번에 실행되는 백업의 숫자를 제한하고 싶을 때 Maximum Concurrent Job 항목의 숫자를 조절해주면 된다.  이제 이쯤에서 완성된 bacula-sd.conf 파일을 보도록 하자.  마찬가지로 변경되거나 추가된 항목은 붉은 색으로 표시했다.

Storage {
  Name = ftp-sd
  SDPort = 9103
  WorkingDirectory = "/var/lib/bacula"
  Pid Directory = "/var/run/bacula"
  Maximum Concurrent Jobs = 20
  SDAddress = 10.211.55.34


Director {
  Name = dbserver-dir 
  Password = "ftpserver
}

Director {
  Name = ftp-mon
  Password = "2309IOdf23D302jlsdfawerfcdf"
  Monitor = yes
}

Device {
  Name = FileStorage-1
  Media Type = File
  Archive Device = /mnt/backup-1/bacula
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
}

Device {
  Name = FileStorage-2
  Media Type = File
  Archive Device = /mnt/backup-2/bacula
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
}


Messages {
  Name = Standard
  director = dbserver-dir = all
} 

 

참고로 테이프 백업 장치를 위한 항목을 올려드린다.  글쓴이의 사무실에서 사용하는 LTO-5 테잎 장치다.

Device {

  Name = Neo-200s

  Media Type = LTO-5

  Archive Device = /dev/nst0

  AutomaticMount = yes

  AlwaysOpen = yes

  RemovableMedia = yes

  RandomAccess = no

  Changer Command = "/etc/bacula/scripts/mtx-changer %c %o %S %a %d"

  Changer Device = /dev/sg2

  AutoChanger = yes

  Alert Command = "sh -c 'smartctl -H -l error %c'"  

}

테이프 장치와 하드디스크의 차이점은, 일단 RemovableMedia, RandomAccess, Commands가 제공된다는점, 그리고 마운트 포인트가 아닌 장치명을 사용한다는 점이 되겠다.  사실, Changer command와 Alert Command 등의 Commands는 Bacula에서 이미 다 제공된다.

 

추가된 2개의 하드디스크를 위한 장치 섹션을 살펴보자.
Name = FileStorage-1: 장치의 이름을 정한다.  이 이름은 디렉터 데몬에서 반드시 매치되어야한다.  디렉터 데몬에서 다시 설명한다.
Media Type = File: 미디어의 타입은 두가지 뿐이다.  파일, 아니면 테이프(LTO-1, LTO-2, LTO-3, LTO-4, LTO-5)
Archive Device = /mnt/backup-1/bacula: 백업되는 파일이 저장될 곳을 의미한다. 여기서 우리는 추가 하드디스크를 지정한다.
LabelMedia = yes;: 미디어에 레이블을 한다.  보통은 테이프 장치에서 테이프의 레이블을 자동으로 인식한다. 하드디스크에 적용하면 자동으로 장치명을 레이블해준다. 세미콜론은 디폴트로 붙어나오는데, 매뉴얼에는 설명이 없다.
Random Access = Yes; 하드디스크일 경우는 yes이며, 테이프 장치는 no로 정한다.
AutomaticMount = yes; 백업작업마다 저장되는 장치가 다를 경우, Bacula가 자동으로 장치를 마운트 해준다 (테이프도 가능).
RemovableMedia = no; 제거 가능한 장치인지 지정해준다.  하드디스크라면 당연히 No다.
AlwaysOpen = no;   하드디스크라면 당연히 No이고, 테이프라면 yes를 줘도 된다.

 

다 됐으면 백업될 파일들(볼륨)이 저장되는 디렉토리를 생성하고 소유권을 변경해준다.
$ sudo mkdir /mnt/backup-1/bacula /mnt/backup-2/bacula
$ sudo chown bacula:bacula /mnt/backup-1/bacula /mnt/backup-2/bacula 

스토리지 데몬을 재시작해주자.
$ sudo service bacula-sd restart

솔직히 말해서 하나도 어려운 게 없다.  만약 뭐가 뭔지 모르시겠다면, 지금껏 대충 읽으신 거다.  차근차근 직접 따라하면서 하시면 상당히 쉽다는 것을 알 수 있을 거라고 확신한다.  본인도 역시, 처음에는 뭐가 뭔지 몰라서 해깔렸는데, 조금만 파보니까 눈에 쉽게 들어오더라.

이제 가장 중요하고 복잡한 디렉터 데몬을 설정해보자.  내용이 조금 해깔릴 수 있으며 설정이 아주 길다.

블로그 이미지

Seowon Jung jswlinux

Seowon Jung의 잡동사니 보관소

댓글을 달아 주세요

  • 2013.09.30 20:36  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Seowon Jung jswlinux 2013.10.01 07:53 신고  댓글주소  수정/삭제

      안녕하세요.

      제가 리플을 달면 이메일 주소가 공개되어버리니까, 다시 비밀댓글로 이메일 주소를 남겨주시면 제가 뭘 메일에 보내주셔야하는지 메일에 적어서 보 내드리겠습니다.

  • ardahong 2017.08.06 22:49  댓글주소  수정/삭제  댓글쓰기

    안녕하세요!

    bacula를 도입하던중 난관에 부딪혀 질문 댓글 남깁니다.

    제 bacula가 병렬/동시백업(concurrent backup)시 잘 작동하지 않는것같은데요.

    예를들면 job1과 job2가 있고, 이 둘은 각각 fullbackup하는데 4분, 5분 소요됩니다.

    bconsole에서 status dir을 쳐보면 두 job이 동시에 running되는것이 확인되는데요.

    동시에 backup이되다보니 두 job의 종료시점이 다르더라도, 최대 7~8분정도 소요될것으로 예상했습니다.

    그런데 동시에 작업을 시작한 후 job1이 4분후에 먼저 끝나고, job2는 job1이 끝나고나서 5분후에 종료됩니다.

    보이기만 running이 동시에되고 시간은 총 9분이걸리니 따로돌리는것과 같네요. (두 job의 우선순위 Priority는 같습니다.)

    아래는 제가 동시백업을 위해 변경한 conf내용입니다.

    ## bacula-dir.conf
    Director section's option Maximum Concurrent Jobs = 20
    Client section's option Maximum Concurrent Jobs = 20
    Storage section's option Maximum Concurrent Jobs = 20

    ## bacula-sd.conf
    Storage section's option Maximum Concurrent Jobs = 20
    Device secsion's option Maximum Concurrent Jobs = 20

    ## bacula-fd.conf
    FileDaemon section's option Maximum Concurrent Jobs = 20


    빛과같은 조언 부탁드립니다ㅠㅠ

이번 편에서는 Bacula가 어떠한 방법으로 백업을 하는지, 그 방법에 대한 개념을 잡아보도록 한다.  Bacula는 다소 특이한 방식으로 작동하는데, 처음 보면 뭐가뭔지 이해가 잘 안가고, 언뜻 보면 상당히 복잡해보이기 때문이다.  bacula.org에는 이해를 돕기위한 그림이 몇 개 있지만 사실 이게 본인 입장에서는 더 해깔린다.  별것도 아닌건데 어렵게 설명하는 느낌이랄까.

Bacula는 3개의 서비스 데몬과 카탈로그라고 하는 하나의 DB로 구성된다.  결국 총 4개의 서비스 데몬이 필요한 셈인데, 이 4개의 서비스 데몬은 얼마든지 확장이 가능하다.  그렇다면, DB를 제외한 나머지 3개의 서비스 데몬에 대해서 보자.

1.  Director Daemon - 클라이언트들과 통신을 한다.  백업 및 복원명령을 직접 제어하며, 공식적으로 하나의 디렉터 데몬은 총 1천여대 정도의 클라이언트를 제어할 수 있다.  포트번호는 9101을 사용한다.
2.  File Daemon - Director Daemon으로부터 백업 명령이 들어왔을시, 어떤 파일들을 백업해야하는지 대상 목록을 뽑아낸뒤 해당 파일들을 전송한다.  포트번호는 9102을 사용한다.
3.  Storage Daemon - Director Daemon으로부터 백업 명령이 들어왔을시, 파일데몬과 직접 접속하여 파일들이 저장되어야할 백업 장치를 제공하고, 파일을 실제로 저장하는 역할을 수행한다.  포트번호는 9103을 사용한다.

조금 이해가 되실거다.  디렉터 데몬은 하나만 있으면 되지만 규모가 많거나, 혹은 특정한 목적에 의해 서버별로 백업을 나눠서 해야하는 경우라면 디렉터 데몬은 여러 개를 두면 된다.  결국 명령은 디렉터가 내리는 것이므로, 두개의 디렉터에서 하나의 클라이언트에 백업명령을 두번 세번 내리는 것도 가능하다는 얘기다.  물론 그렇게 쓸 일은 없겠지만.

파일데몬의 경우, 대부분의 머신에 설치되는 클라이언트인데, 설정 자체는 아예 손댈 일이 없을 정도로 간단하게 돌아간다.  메모리에 상주해있기만하면 디렉터 데몬에 의해서 알아서 동작하기 때문에 신경쓸 일은 전혀 없다고 봐도 무방하다.  실제로 대부분의 에러는 디렉터 데몬이 돌아가는 서버에서 발생하지, 파일데몬이 설치되어있는 클라이언트에서는 거의 생기지 않는다.

스토리지 데몬은, 머신에 어떤 저장장치가 연결되어있는지를 정의해놓으면 작업별로 특정 장치를 지정할 수 있다.  예를 들어서, 사용자의 FTP 디렉토리는 LTO-5로 백업하고, /etc 디렉토리는 하드디스크에 저장하는 형태도 가능하다.  따라서, 스토리지만 정의해놓으면 디렉터 데몬이 설정대로 파일을 백업해준다.  서버의 규모가 작은 곳이라면, 하나의 머신에 모든 저장장치를 전부 연결하고 디렉터와 스토리지 데몬을 한 서버에서 돌리는 식으로 하면 되겠다.  글쓴이가 일하는 곳에서는 디렉터 데몬은 오픈스택의 한 가상머신에서, 스토리지 데몬은 LTO-5 장치를 연결한 서버에서 운영한다.  그외 모든 물리적인 서버와 오픈스택 가상머신들에 파일데몬을 설치하여 백업 중에 있다.  Bacula가 사용하는 CPU 점유율은 무척 낮기 때문에 가상머신에서 돌려도 거의 문제가 없다.

그러면 이제 bacula.org에서 제공하는 그림을 보자.

 

이제 위의 그림이 쉽게 이해 가실거다.  다만 Admin Workstation이 2대가 보이는 부분은, 관리자의 개인 컴퓨터에서 디렉터 데몬을 통한 모니터링이 가능하다는 것을 보여주는 그림인데, 실제로 3줄짜리 설정파일만 있으면 모니터링이 가능하다.  따라서, 관리자가 여러 명인 상황에서도 각각 자기들의 컴퓨터를 통해서 모니터링이 가능한 것이다.

그러면, 왜 데이터베이스가 필요한지 설명을 할 차례가 왔다.  Bacula에는 "카탈로그"라고 하는 일종의 백엔드 서비스가 있는데, 백업되는 파일들의 인덱싱을 한다고 보면 이해가 쉬우실 거다.  즉, 파일 관리의 수월함과 빠른 복원을 위해 백업시마다 파일들에 대한 목록을 DB에 넣어서 관리를 하게되며, 공식적으로 MySQL, PostgreSQL, 그리고 SQLite를 지원한다.  물론, DB가 손상됐을 때를 대비해서 수동으로 복원할 수 있는 방법 역시 제공되는 CLI 툴을 통해 가능하다.  공식적으로는 PostgreSQL을 권장하며, 실제 기업업무용으로 SQLite는 권장하지 않는다.

여기서 어떤 분들은 아마 "어차피 백업된 경로 들어가서 ls 치면 파일목록 다 나올텐데 뭐하러 DB를 쓰는가" 라고 의문점이 생기실텐데, Bacula는 파일의 목록을 DB에 넣고, 실제 파일들은 압축하거나 아니면 그냥 하나의 파일로 묶어서 보관한다.  쉽게 생각해서 tar 명령어처럼 하나의 파일을 만들어서 여기에 몽땅 넣어버리는데, 물론 여기에도 다양한 옵션이 있다.  용어가 해깔릴 수 있으므로, 백업되는 파일들을 몰아넣는 파일을 "볼륨"이라고 부르도록 하자.

1.  볼륨의 용량을 제한할 수 있다.  예를 들어 볼륨 하나당 10기가로 지정해두고 백업을 진행하다 10기가가 넘어가게 되면 또 다른 볼륨을 생성한다.
2.  생성되는 볼륨의 갯수를 제한할 수 있다.
3.  특정 백업분을 삭제할 경우, 사용자는 몇개의 볼륨이 존재하는지, 어떤 파일이 어떤 볼륨에 있는지 상관하지 않아도 된다.  따라서, 목적별로 스토리지를 운영ㅇ할 수 있다.
4.  특정 볼륨에서 특정 백업분만 삭제할 수 있다.
5.  볼륨에 auto-prune을 지원한다. 
6.  백업되는 파일들의 유지기간 (Retention) 지정이 가능하며, 기일이 지난 백업분은 Bacula가 알아서 삭제해준다.
7.  특정 백업분을 특정 볼륨에 지정하는 것이 가능하다.  예를 들어, Incremental은 볼륨 AAA, Differential은 볼륨 BBB, Full은 CCC 이런 식으로.
8.  따라서, 백업에 쓸 수 있는 스토리지의 용량이 한정되어있어서 이것을 매번 신경써줘야하는 관리자라면, 이 문제에서 해방될 수 있다. 

Bacula의 공식문서에 의하면, 데이터를 저장하는 방식인 Pool이니 Volume이니 하는 것들은 사실상 테이프 백업 장치의 개념을 하드디스크 백업에 적용시키는 거라고 한다.  또한, 하나의 파일로 묶어서 보관한다는게 뭐하러 그렇게 하는건지 다소 이해가 가지않을 수도 있지만, 서버의 보안이 뚫렸거나 관리자가 아닌 유저가 접속해서 백업데이터에 접근하더라도 데이터 자체가 하나 혹은 몇개의 파일에 전부 모아져있기 때문에 내용을 볼 수 없다는 장점이 있다.  따라서, 하나의 파일로 묶는건 보안상 그렇다고 이해하면 되겠다.

스토리지 서버가 다른 곳에 있기 때문에, 재해복구나 Bare Metal Recovery도 가능하다.  평소 서버들을 백업할 때 시스템 전체 (/)를 백업해뒀다면, 나중에 우분투 라이브 씨디 등으로 부팅한뒤 네트워크를 설정해주고 파일데몬을 설치해서 CLI 툴로 복원해주면 되는 것이다.

 

이것으로 Bacula의 백업 프로세스에 대해서 알아봤다.  복잡해보이지만, 알고보면 무쟈게 간단하다.  정리를 해보자.

1.  Bacula는 3가지 서비스 데몬과 데이터베이스로 구성된다.
2.  디렉터 데몬은 일종의 관제탑으로서, 백업/복원/모니터 등등의 모든 작업에 대한 통솔을 한다.
3.  파일 데몬은 어떤 파일이 백업되어야하는지를 목록을 뽑아낸다.
4.  스토리지 데몬은 디렉터 데몬의 백업 및 복원 명령에 의해 저장장치를 제공하고, 데이터를 읽고쓴다.
5.  디렉터 데몬은 백업되는 파일들의 목록과 모든 상황을 데이터베이스에 기록한다.
6.  백업되는 파일들은 볼륨이라는 몇개의 거대한 파일이나 테이프에 기록된다.

다음 편에는 Bacula의 서비스 데몬들을 설치해보도록 한다.

블로그 이미지

Seowon Jung jswlinux

Seowon Jung의 잡동사니 보관소

댓글을 달아 주세요

9월 10일부터 12일까지 총 3일간 진행됐던 Bacula Systems 사의 오픈소스 네트워크 백업 솔루션 공인 자격교육이 끝났다.

이로써 아마도 국내 첫 Bacula 공인 백업 어드민이 된듯 싶다.


 


 

블로그 이미지

Seowon Jung jswlinux

Seowon Jung의 잡동사니 보관소

댓글을 달아 주세요