Debian Jessie: Установка и настройка bacula

Это заметка из цикла стетей моего небольшого HowTo по Debian Jessie.

Напомню что я описывал свою небольшую сетку и ее составляющие тут.
Настройка будет проводится на двух серверах nas.my.local и gw.my.local, я постараюсь указывать на каком сервере что выполнятеся, но также будет видно и в приветствии шела. Роли у них будут такие:
nas.my.local — основной менеджер (bacula-dir), хранилище (bacula-sd), консоль (bacula-console) и клиент (bacula-fd)
gw.my.local — основной клиент (bacula-fd) для бекапа (настройки, сайты, базы mysql …)

С ролями определились, вперед к настройке!

Особенность bacula такова, что все компоненты системы в конфигах должны быть заданы через FQDN имена серверов.
Напомню что у меня настроен DNS сервер и есть локальная зона my.local. Значит можно создать в данной зоне DNS необходимые записи для бакулы. На сервере gw.my.local открываем конфиг локальной зоны:

gw:~$ sudo vim /etc/bind/my_local.db

И добавляем такие записи (не забываем также увеличить параметр serial):

gw-fd   IN      A       192.168.1.1
nas-fd  IN      A       192.168.1.5
dir     IN      A       192.168.1.5
sd      IN      A       192.168.1.5

Перечитываем конфиги:

gw:~$ sudo rndc reload

Если у вас нету локального DNS, можете на всех серверах где будут установлены компоненты bacula добавить в локальный файл /etc/hosts:

192.168.1.1 gw-fd gw-fd.my.local
192.168.1.1 nas-fd nas-fd.my.local
192.168.1.5 dir dir.my.local
192.168.1.5 sd sd.my.local

Также на сервере gw.my.local у меня настроен iptables, поэтому необходимо добавить розрешение конекта с сервера nas.my.local на сервер gw.my.local port 9102

Открываем конфиг с правилами iptables:

gw:~$ sudo vim /etc/iptables.rules

Добавляем туда вот что (я добавил сразу после правила для NTP):

...
# Allow NTP for local network
-A INPUT -i eth0 -p udp --dport 123 -j ACCEPT

# Allow connect to Bacula-FD from nas.my.local
-A INPUT -i eth0 -p tcp --dport 9102 -j ACCEPT

# Now you should read up on iptables rules and consider whether ssh access
...

Применяем новый конфиг iptables:

gw:~$ sudo iptables-restore /etc/iptables.rules

Настройка клиента на сервере gw.my.local (bacula-fd)
Ну и поскольку мы уже на сервере gw.my.local, предлагаю сразу установить bacula-fd, настроить его и запустить.

Ставим пакет bacula-fd:

gw:~$ sudo apt-get install bacula-fd

Добавляем сервис в автозагрузку:

gw:~$ sudo systemctl enable bacula-fd

Открываем основной конфиг File Daemon-а:

gw:~$ sudo vim /etc/bacula/bacula-fd.conf

В секции Director с именем gw-dir исправляем Name и Password:

Director {
  Name = nas-dir
  Password = "_fd_gw_some_passwd_" # from /etc/bacula/client-gw.conf on nas
}

В секции Director с именем gw-mon исправляем Name и Password:

Director {
  Name = nas-mon
  Password = "_some_nas-mon_passwd_" # from /etc/bacula/bacula-dir.conf on nas
  Monitor = yes
}

В секции FileDaemon с именем gw-fd исправляем FDAddress:

Director {
  Name = gw-fd
...
  FDAddress = gw-fd.my.local
}

Сохраняем, выходим, перезапускаем сервис bacula-fd:

gw:~$ sudo systemctl restart bacula-fd

Настройка клиента, Storage Daemon и директора на сервере nas.my.local (bacula-fd, bacula-sd, bacula-director)
Теперь заходим по ssh на сервер nas.my.local и создаем для бэкапов bacula отдельную директорию /bacula:

nas:~$ sudo mkdir /bacula

Создаем отдельный LV для хранения бэкапов:

nas:~$ sudo lvcreate -L 10g -n lv_bacula st13
  Logical volume "lv_bacula" created
nas:~$

Создаем на нем файловую систему ext4:

nas:~$ sudo mkfs.ext4 -L BACULA /dev/mapper/st13-lv_bacula

Добавляем в /etc/fstab запись для монтирования нового LV:

/dev/mapper/st13-lv_bacula  /bacula  ext4  noatime,nodiratime  0 2

Монтируем:

nas:~$ sudo mount -a

Создаем 2 директории, одну для хранения бэкапов — backup, вторую на случай востановления файлов — restore

nas:~$ sudo mkdir -p /bacula/{backup,restore}

Ограничиваем права доступа:

nas:~$ sudo chown -R bacula.bacula /bacula
nas:~$ sudo chmod 0700 /bacula

Для бакулы нужна база данных. В простых случаях можно обойтись и sqlite, но я планирую ставить кое какие эксперименты в дальнейшем и для этого мне нужен будет postgres, поэтому ставлю postgres.

nas:~$ sudo apt-get install postgresql

Делаю для него отдельный LV:

nas:~$ sudo lvcreate -L 2g -n postgresql st13

Создаю файловую систему:

nas:~$ sudo mkfs.ext4 -L POSTGRESQL /dev/mapper/st13-postgresql

Останавливаем сервис postgresql:

nas:~$ sudo systemctl stop postgresql

Монтируем новый раздел и сливаем на него содержимое директории /var/lib/postgresql:

nas:~$ sudo mount /dev/mapper/st13-postgresql /mnt/
nas:~$ sudo rsync -Pavl /var/lib/postgresql/ /mnt/

Проверяем что директория скопировалась:

nas:~$ ls -l /mnt/
total 20
drwxr-xr-x 3 postgres postgres  4096 Nov 27 07:51 9.4
drwx------ 2 root     root     16384 Nov 27 07:55 lost+found
nas:~$

Отмонтируем /mnt

nas:~$ sudo umount /mnt

Очищаем директорию /var/lib/postgresql/

nas:~$ sudo rm -rf /var/lib/postgresql/*

Добавляем в конфиг /etc/fstab строчку для монтирование LV-шки /dev/mapper/st13-postgresql

/dev/mapper/st13-postgresql  /var/lib/postgresql  ext4  noatime,nodiratime  0 2

Монтируем новую LV согласно конфига /etc/fstab:

nas:~$ sudo mount -a

Проверяем что смонтировалось:

nas:~$ sudo mount |grep postgres
/dev/mapper/st13-postgresql on /var/lib/postgresql type ext4 (rw,noatime,nodiratime,data=ordered)
nas:~$

Отлично! Сервис postgresql добавляем в автозагрузку и запускаем:

nas:~$ sudo systemctl enable postgresql
nas:~$ sudo systemctl start postgresql

Переходим под пользователя postgres:

nas:~$ sudo su - postgres

Переходим в консоль postgres:

postgres@nas:~$ psql
psql (9.4.5)
Type "help" for help.

postgres=# ALTER ROLE postgres WITH PASSWORD '_my_PG_pass_here_';
ALTER ROLE
postgres=# \q
postgres@nas:~$

Выходим из под пользователя postgres и возвращаемся в свою админскую учетку:

postgres@nas:~$ exit
logout
nas:~$

Открываем конфиг /etc/postgresql/9.4/main/pg_hba.conf:

nas:~$ sudo vim /etc/postgresql/9.4/main/pg_hba.conf

Все строчки внизу меняем на md5, у меня получилось вот так:

# Database administrative login by Unix domain socket
local   all             postgres                                md5

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

После этого нужно релоаднуть сервис postgresql:

nas:~$ sudo systemctl reload postgresql

Устанавливаем основные компоненты bacula на сервере nas:

nas:~$ sudo apt-get install bacula-director-pgsql bacula-sd-pgsql bacula-console bacula-fd

В процессе спрашивает про настройку базы данных для bacula, жмем «Yes»
Следующий вопрос про метод подключения: unix socket или tcp/ip. Я выбрал сокет
Следующий вопрос про метод авторизации: ident или password. Я выбрал password
Следующий вопрос про метод авторизации: ident или password. Я выбрал password
Следующий вопрос аккаунт с админ правами в postgres. Написано правильно — postgres, жмем Enter
Следующий вопрос Пароль на аккаунт postgres. Вводим тот пароль что мы задавали ранее _my_PG_pass_here_ и Enter
Следующий вопрос Username в postgres для bacula-director. Я ввел baculadir
Следующий вопрос Название базы данных postgres для bacula-director. Я ввел baculadb

После чего увидел в консоли вот такой вывод:

bconfig-common: writing config to /etc/dbconfig-common/bacula-director-pgsql.conf
Replacing config file /etc/dbconfig-common/bacula-director-pgsql.conf with new version
creating postgres user baculadir:  success.
verifying creation of user: success.
creating database baculadb: success.
verifying database baculadb exists: success.
populating database via administrative sql...  done.
populating database via sql...  done.
dbconfig-common: flushing administrative password
Processing configuration...Replacing config file /etc/bacula/scripts/delete_catalog_backup with new version
Ok.
nas:~$

Тут я не понял какой пароль будет у пользователя baculadir, поэтому я решил задать его явно вручную. Для этого заходим в консоль postgresql под пользователем postgres:

nas:~$ psql -U postgres -W
Password for user postgres:
psql (9.4.5)
Type "help" for help.

postgres=#

И выполняем вот такую команду для смены пароля пользователю baculadir:

postgres=# ALTER ROLE baculadir WITH PASSWORD '_some_baculadir_pass_';
ALTER ROLE
postgres=#

Выходим из консольки postgresql:

postgres=# \q
nas:~$

Настройка компонентов bacula
Начнем с простого — настройка bacula-sd:

nas:~$ sudo vim /etc/bacula/bacula-sd.conf

В секции Storage исправляем SDAddress и проверяем Name:

Storage {
  Name = nas-sd
...
  SDAddress = sd.my.local
...
}

В секции Director с именем nas-dir задаем Password:

Director {
  Name = nas-dir
  Password = "_some_sd_password_"
}

В секции Director с именем nas-mon задаем Password:

Director {
  Name = nas-mon
  Password = "_some_nas-mon_passwd_"
  Monitor = yes
}

В секции Device исправляем Archive Device:

Device {
...
  Archive Device = /bacula/backup
...
}

Сохраняем, выходим, проверяем конфиг Storage Daemon-а:

nas:~$ sudo bacula-sd -tc /etc/bacula/bacula-sd.conf
nas:~$

Все замечательно, можно перезапускать сервис bacula-sd (он стартует по дефолту после установки):

nas:~$ sudo systemctl restart bacula-sd.service

Теперь настроим bacula-fd
Открываем конфиг:

nas:~$ sudo vim /etc/bacula/bacula-fd.conf

В секции Director с именем nas-dir исправляем Password:

Director {
  Name = nas-dir
  Password = "_fd_nas_some_passwd_" # from /etc/bacula/client-nas.conf on nas
}

В секции Director с именем nas-mon исправляем Password:

Director {
  Name = nas-mon
  Password = "_some_nas-mon_passwd_" # from /etc/bacula/bacula-dir.conf on nas
  Monitor = yes
}

В секции FileDaemon исправляем FDAddress:

Device {
...
  FDAddress = nas-fd.my.local
...
}

Сохраняем, выходим, проверяем конфиг File Daemon-а:

nas:~$ sudo bacula-fd -tc /etc/bacula/bacula-fd.conf
nas:~$

Все замечательно, можно перезапускать сервис bacula-fd (он стартует автоматом после установки):

nas:~$ sudo systemctl restart bacula-fd.service

Теперь настроим bacula-console.
Открываем конфиг:

nas:~$ sudo vim /etc/bacula/bconsole.conf

В секции Director исправляем address и Password:

Director {
...
  address = dir.my.local
  Password = "_some_dir_password_"
}

Проверка конфига не повредит:

nas:~$ sudo bconsole -tc /etc/bacula/bconsole.conf
nas:~$

Теперь самое сложное, настройка Bacula Director.
Открываем основной конфиг:

nas:~$ sudo vim /etc/bacula/bacula-dir.conf

В секции Director исправляем DirAddress и Password:

Director {
...
  Password = "_some_dir_password_" # from /etc/bacula/bconsole.conf
...
  DirAddress = dir.my.local
}

Идем дальше, секция JobDefs мне не нужна — комментирую:

#JobDefs {
#  Name = "DefaultJob"
#  Type = Backup
#  Level = Incremental
#  Client = nas-fd
#  FileSet = "Full Set"
#  Schedule = "WeeklyCycle"
#  Storage = File
#  Messages = Standard
#  Pool = File
#  Priority = 10
#  Write Bootstrap = "/var/lib/bacula/%c.bsr"
#}

Слудующая секция Job для клиента Client1 мне тоже не нужна — комментирую:

#Job {
#  Name = "BackupClient1"
#  JobDefs = "DefaultJob"
#}

Слудующая секция Job для каталога BackupCatalog мне тоже не нужна — комментирую:

# Backup the catalog database (after the nightly save)
#Job {
#  Name = "BackupCatalog"
#  JobDefs = "DefaultJob"
#  Level = Full
#  FileSet="Catalog"
#  Schedule = "WeeklyCycleAfterBackup"
#  # This creates an ASCII copy of the catalog
#  # Arguments to make_catalog_backup.pl are:
#  #  make_catalog_backup.pl <catalog-name>
#  RunBeforeJob = "/etc/bacula/scripts/make_catalog_backup.pl MyCatalog"
#  # This deletes the copy of the catalog
#  RunAfterJob  = "/etc/bacula/scripts/delete_catalog_backup"
#  Write Bootstrap = "/var/lib/bacula/%n.bsr"
#  Priority = 11                   # run after main backup
#}

Идем дальше, ищем секцию Job с именем Name = «RestoreFiles» в ней исправляем путь к директории для восстановленных файлов и Storage:

Job {
  Name = "RestoreFiles"
...
  Storage = nas-sd
...
  Where = /bacula/restore
}

Идем дальше, секция Client мне не нужна в этом конфиге, для клиентов будут отдельные конфиги — комментирую:

# Client (File Services) to backup
#Client {
#  Name = nas-fd
#  Address = localhost
#  FDPort = 9102
#  Catalog = MyCatalog
#  Password = "XXX_FDPASSWORD_XXX" # password for FileDaemon
#  File Retention = 30 days        # 30 days
#  Job Retention = 6 months        # six months
#  AutoPrune = yes                 # Prune expired Jobs/Files
#}

Дальше секция Storage, тут указываем Address и Password:

Storage {
...
  Address = sd.my.local
  SDPort = 9103
  Password = "_some_sd_password_" # from /etc/bacula/bacula-sd.conf section Director, name nas-dir
...

Дальше секция Catalog, тут настраивается подключение к базе данных:

Catalog {
  Name = MyCatalog
  dbname = "baculadb"; dbuser = "baculadir"; dbpassword = "_some_baculadir_pass_"
}

И последняя секция Console указываем пароль, который берем из конфига bacula-sd.conf секция Director с именем nas-mon:

Console {
  Name = nas-mon
  Password = "_some_nas-mon_passwd_" # from /etc/bacula/bacula-sd.conf section Director, name nas-mon
  CommandACL = status, .status
}

Теперь в конце конфига добавляем инклуд будущих конфигов для клиектов бекапа.

# Backup clients
@/etc/bacula/client-gw.conf
@/etc/bacula/client-nas.conf

Сохраняем конфиг директора, выходим с эдитора.
Почему я сделал инклудом клиентские конфиги? Потому что из моего опыта так намного удобней. Те конфиги что идут по умолчанию (bacula-dir/bacula-sd/bacula-fd) достаточно «один раз настроить и забыть», основные изменения в процессе эксплуатации, если и производятся, то именно в клиентских конфигах (перенастройка FileSet, Shedule, Pool и тд) Работать с отдельными клиентскими конфигами намного удобней, так как не нужно искать по огромному конфигу bacula-dir конкретную секцию определенного клиента, а достаточно просто открыть конфиг конкретного клиента и все его настройки как на ладони.

Конфиг клиента gw-fd.my.local — /etc/bacula/client-gw.conf
Открываем текстовый редактор vim:

nas:~$ sudo vim /etc/bacula/client-gw.conf

И вставляем туда следующее:

Job {
    Name = "backup_gw"
    Type = Backup
    Level = Full
    Client = gw-fd
    FileSet = "fileset_gw"
    Schedule = "shedule_weekly_gw"
    Messages = Standard
    Pool = gw_pool
    Write Bootstrap = "/var/lib/bacula/%c.bsr"
    Priority = 3
}

FileSet {
    Name = "fileset_gw"
    Include {
      Options {
        signature = MD5
        compression = GZIP
        recurse = yes
        xattrsupport = yes
      }
      File = /etc
    }
    Exclude {
      File = /usr/local/www
    }
}

Schedule {
    Name = "shedule_weekly_gw"
    Run = Level=Full 1st sun at 4:35
    Run = Level=Differential 2nd-5th sun at 4:35
    Run = Level=Incremental mon-sat at 4:35
}

Client {
    Name = gw-fd
    Address = gw-fd.my.local
    FDPort = 9102
    Catalog = MyCatalog
    Password = "_fd_gw_some_passwd_"
    File Retention = 45 days
    Job Retention = 6 months
    AutoPrune = yes
}

Pool {
    Name = gw_pool
    Pool Type = Backup
    Recycle = yes                 # Bacula can automatically recycle Volumes
    AutoPrune = yes               # Prune expired volumes
    Volume Retention = 65 days    # 65 days
    Recycle Oldest Volume = yes
    Maximum Volume Bytes = 4400m  # Limit Volume size to something reasonable
    Maximum Volumes = 5           # Limit number of Volumes in Pool
    Label Format = "gw_pool-vol"
    Storage = nas-sd
}

Конфиг клиента nas-fd.my.local — /etc/bacula/client-nas.conf
Открываем текстовый редактор vim:

nas:~$ sudo vim /etc/bacula/client-nas.conf

И вставляем туда следующее:

Job {
    Name = "backup_nas"
    Type = Backup
    Level = Full
    Client = nas-fd
    FileSet = "fileset_nas"
    Schedule = "shedule_weekly_nas"
    Messages = Standard
    Pool = nas_pool
    Write Bootstrap = "/var/lib/bacula/%c.bsr"
    Priority = 3
}

FileSet {
    Name = "fileset_nas"
    Include {
      Options {
        signature = MD5
        compression = GZIP
        recurse = yes
        xattrsupport = yes
      }
      File = /etc
    }
    Exclude {
      File = /usr/local/www
    }
}

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

Client {
    Name = nas-fd
    Address = nas-fd.my.local
    FDPort = 9102
    Catalog = MyCatalog
    Password = "_fd_nas_some_passwd_"
    File Retention = 45 days
    Job Retention = 6 months
    AutoPrune = yes
}

Pool {
    Name = nas_pool
    Pool Type = Backup
    Recycle = yes                 # Bacula can automatically recycle Volumes
    AutoPrune = yes               # Prune expired volumes
    Volume Retention = 65 days    # 65 days
    Recycle Oldest Volume = yes
    Maximum Volume Bytes = 4400m  # Limit Volume size to something reasonable
    Maximum Volumes = 5           # Limit number of Volumes in Pool
    Label Format = "nas_pool-vol"
    Storage = nas-sd
}

Эти оба конфига содержат пароли, так что рекомендую дать права на чтение/запись для root и на чтение группе bacula:

nas:~$ sudo chown root.bacula /etc/bacula/client-*
nas:~$ sudo chmod 0640 /etc/bacula/client-*

Проверяем конфиг директора (если ничего не выдает — конфиг корректный):

nas:~$ sudo bacula-dir -tc /etc/bacula/bacula-dir.conf
nas:~$

Перезапускаем сервис:

nas:~$ sudo systemctl restart bacula-director.service

Пробуем войти в консоль:

nas:~$ sudo bconsole

Смотрим в консоли общий статус системы, должны увидеть чтото в таком духе:

nas:~$ sudo bconsole
Connecting to Director dir.my.local:9101
1000 OK: nas-dir Version: 5.2.6 (21 February 2012)
Enter a period to cancel a command.
*status all
nas-dir Version: 5.2.6 (21 February 2012) x86_64-pc-linux-gnu debian jessie/sid
Daemon started 03-Dec-15 09:14. Jobs: run=0, running=0 mode=0,0
 Heap: heap=266,240 smbytes=55,910 max_bytes=57,190 bufs=237 max_bufs=245

Scheduled Jobs:
Level          Type     Pri  Scheduled          Name               Volume
===================================================================================
Incremental    Backup     3  04-Dec-15 05:05    backup_gw          *unknown*
Incremental    Backup     3  04-Dec-15 05:05    backup_nas         *unknown*
====

Running Jobs:
Console connected at 03-Dec-15 09:15
No Jobs running.
====
No Terminated Jobs.
====
Connecting to Storage daemon nas-sd at sd.my.local:9103

nas-sd Version: 5.2.6 (21 February 2012) x86_64-pc-linux-gnu debian jessie/sid
Daemon started 01-Dec-15 07:46. Jobs: run=0, running=0.
 Heap: heap=270,336 smbytes=18,467 max_bytes=78,115 bufs=55 max_bufs=57
 Sizes: boffset_t=8 size_t=8 int32_t=4 int64_t=8 mode=0,0

Running Jobs:
No Jobs running.
====

Jobs waiting to reserve a drive:
====

Terminated Jobs:
====

Device status:
Device "FileStorage" (/bacula/backup) is not open.
====

Used Volume status:
====

====

Connecting to Client gw-fd at gw-fd.my.local:9102

gw-fd Version: 5.2.6 (21 February 2012)  x86_64-pc-linux-gnu debian jessie/sid
Daemon started 03-Dec-15 08:20. Jobs: run=0 running=0.
 Heap: heap=270,336 smbytes=16,852 max_bytes=16,999 bufs=49 max_bufs=50
 Sizeof: boffset_t=8 size_t=8 debug=0 trace=0
Running Jobs:
Director connected at: 03-Dec-15 09:15
No Jobs running.
====

Terminated Jobs:
====
Connecting to Client nas-fd at nas-fd.my.local:9102

nas-fd Version: 5.2.6 (21 February 2012)  x86_64-pc-linux-gnu debian jessie/sid
Daemon started 03-Dec-15 09:15. Jobs: run=0 running=0.
 Heap: heap=270,336 smbytes=15,765 max_bytes=15,912 bufs=48 max_bufs=49
 Sizeof: boffset_t=8 size_t=8 debug=0 trace=0
Running Jobs:
Director connected at: 03-Dec-15 09:15
No Jobs running.
====

Terminated Jobs:
====
You have messages.
*

Пробуем выполнить job бекапа для сервера gw:

*run job=backup_gw
Using Catalog "MyCatalog"
Run Backup job
JobName:  backup_gw
Level:    Full
Client:   gw-fd
FileSet:  fileset_gw
Pool:     gw_pool (From Job resource)
Storage:  nas-sd (From Pool resource)
When:     2015-12-03 09:18:42
Priority: 3
OK to run? (yes/mod/no): yes
Job queued. JobId=1
*

Смотрим статус выполнения:

*status client=gw-fd
Connecting to Client gw-fd at gw-fd.my.local:9102

gw-fd Version: 5.2.6 (21 February 2012)  x86_64-pc-linux-gnu debian jessie/sid
Daemon started 03-Dec-15 08:20. Jobs: run=1 running=0.
 Heap: heap=270,336 smbytes=94,708 max_bytes=177,531 bufs=61 max_bufs=105
 Sizeof: boffset_t=8 size_t=8 debug=0 trace=0
Running Jobs:
Director connected at: 03-Dec-15 09:19
No Jobs running.
====

Terminated Jobs:
 JobId  Level    Files      Bytes   Status   Finished        Name
======================================================================
     1  Full      2,007    2.052 M  OK       03-Dec-15 09:18 backup_gw
====
*

Бекап выполнился без ошибок (Status OK)! Напомню что в FileSet в данный момент включена только директория /etc, для тестов при запуске системы этого более чем достаточно.
Теперь пробуем запустить аналогичный job для сервере nas.my.local:

*run job=backup_nas
Run Backup job
JobName:  backup_nas
Level:    Full
Client:   nas-fd
FileSet:  fileset_nas
Pool:     nas_pool (From Job resource)
Storage:  nas-sd (From Pool resource)
When:     2015-12-03 09:23:00
Priority: 3
OK to run? (yes/mod/no): yes
Job queued. JobId=2
*

Смотрим статус:

*status client=nas-fd
Connecting to Client nas-fd at nas-fd.my.local:9102

nas-fd Version: 5.2.6 (21 February 2012)  x86_64-pc-linux-gnu debian jessie/sid
Daemon started 03-Dec-15 09:15. Jobs: run=1 running=0.
 Heap: heap=270,336 smbytes=93,621 max_bytes=176,411 bufs=60 max_bufs=104
 Sizeof: boffset_t=8 size_t=8 debug=0 trace=0
Running Jobs:
Director connected at: 03-Dec-15 09:23
No Jobs running.
====

Terminated Jobs:
 JobId  Level    Files      Bytes   Status   Finished        Name
======================================================================
     2  Full      1,988    926.2 K  OK       03-Dec-15 09:23 backup_nas
====
*

Тоже job выполнился без ошибок.
Бекапы обоих серверов выполнились без ошибок, значит осталось продумать FileSet и Shedule для каждого из клиентов и подкорректировать конфиги. Хорошим правилом настройки bacula является минимальное количество одновременно выполняющихся job-ов. Когда клиентов не слишком много, job-ы можно просто рознести во времени с помощью шедулера. Пробуем продумать оптимальную последовательность бекапа, не забываем что на сервере gw.my.local настроен бекап всех баз mysql по крону на 03:00 ночи. У меня получилось вот так:
— 03:00 (gw.my.local) — бекап mysql баз по cron-у
— 04:05 (nas.my.local) — бекап бакулой
— 05:05 (gw.my.local) — бекап бакулой
Как видите я выделил по часу на каждую задачу, этого в моем случае более чем достаточно и хватит с запасом на долго. В реальности каждый их этих бекапов длится не более 5 минут, но базы ростут, файлов становится больше …
Теперь что касается более точной настройки FileSet или что конкретно нам нужно бекапить.
— На сервере nas.my.local кроме настроек системы (директория /etc) есть еще настроенный WEB Torrent клиент в отдельной директории (/home/torrent) вот и все … Суммарный размер этих двух директорий в несжатом виде около 25 MB
Вот FileSet и Shedule для такого случая (nas.my.local — /etc/bacula/client-nas.conf):

FileSet {
    Name = "fileset_nas"
    Include {

        Options {
            compression = GZIP9
            noatime = yes
            onefs = yes
            recurse = yes
            signature = MD5
            sparse = yes
        }

        File = /etc
        File = /home/torrent
    }

    Exclude {
        File = lost+found
    }
}

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

— На сервере gw.my.local кроме настроек системы (директория /etc) есть еще настроенный web сервер (/srv/www и /var/www) и бекапы MySQL баз (/backup). Суммарный размер этих директорий в несжатом виде около 4 GB. Но тут еще один нюанс, хотелось бы исключить из бекапа файлы логов web сервера которые расположены по маске /srv/www/*/logs/* В сложных случаях опций нужно иметь ввиду, что согласно документации bacula дефолтными опциями являются те что ниже всех в конфиге. Поэтому exclude я розместил сверху, а compression/recurse/signature и прочие — внизу.
Вот FileSet и Shedule для такого случая (gw.my.local — /etc/bacula/client-gw.conf):

FileSet {
    Name = "fileset_gw"
    Include {

        Options {
            Wild = "/srv/www/*/logs/*"
            exclude = yes
        }

        Options {
            compression = GZIP9
            noatime = yes
            onefs = yes
            recurse = yes
            signature = MD5
            sparse = yes
        }

        File = /etc
        File = /backup
        File = /srv/www
        File = /var/www
    }

    Exclude {
        File = lost+found
    }
}

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

После изменений FileSet и Shedule не забывайте проверить конфигурацию директора и перезапустить сервис:

nas:~$ sudo bacula-dir -tc /etc/bacula/bacula-dir.conf
nas:~$

Перезапускаем сервис:

nas:~$ sudo systemctl restart bacula-director.service

В процессе дебага FileSet здорово помогает команда estimate в bconsole.
Входим в консоль:

nas:~$ sudo bconsole

И набираем вот такую команду:

*estimate job=backup_gw listing

Результатом этой команды будет полный листинг файлов/директорий которые будут бекапиться при текущей настройке FileSet:

...
drwxr-xr-x  10 root     root            4096 2015-06-30 13:15:41  /srv/www
-rw-r--r--   1 root     root              53 2015-04-27 13:39:31  /var/www/default/index.html
drwxr-xr-x   2 root     root            4096 2015-04-27 13:39:31  /var/www/default
-rw-r--r--   1 root     root             867 2015-04-24 11:17:32  /var/www/html/index.nginx-debian.html
-rw-r--r--   1 root     root           11104 2015-04-27 07:37:56  /var/www/html/index.html
drwxr-xr-x   2 root     root            4096 2015-04-27 13:38:09  /var/www/html
...

Также в процессе начальной настройки и тестирования бывает что мы набекапили непойми чего и хочется корректно удалить старые бекапы и начать сначала. Крайне не желательно просто удалять файлы волумов из директории /bacula/ потому что в Catalog останется куча инфы которая будет ссылаться на эти волум-файлы. Для такого случая есть отдельная процедура.
Сначала в bconsole нужно удалить волумы:

*delete volume=gw_pool-vol0001

This command will delete volume gw_pool-vol0001
and all Jobs saved on that volume from the Catalog
Are you sure you want to delete Volume "gw_pool-vol0001"? (yes/no): yes
*delete volume=nas_pool-vol0004

This command will delete volume nas_pool-vol0004
and all Jobs saved on that volume from the Catalog
Are you sure you want to delete Volume "nas_pool-vol0004"? (yes/no): yes
*

а потом уже удалять файлы с файловой системы:

nas:~$ sudo rm /bacula/backup/nas_pool-vol0004
nas:~$ sudo rm /bacula/backup/gw_pool-vol0001

Теперь можно начинать сначала …

Для закрепления понимания рекомендую поглядывать в официальную документацию.
Для тех кто бекапит через Интернет рекомендую настраивать с поддержкой SSL шифрования, такой вариант я настраивал ранее на FreeBSD, но отличия там только в генерации сертификатов и нескольких дополнительных опциях связанных с ними. Считаю что разобраться не очень трудно. В любом случае, если вы новичок — лучше сначала настроить вариант без шифрования, а потом уже прикрутить сертификаты.

P.S. В процессе настройки обязательно пользуйтесь проверкой конфигурации, также первое время рекомендую просматривать лог файл на сервере с директором /var/log/bacula/bacula.log — это полный журнал работы системы.

P.P.S. Для тех кто совсем запутался с паролями/именами/конфигами (у меня так было когда я настраивал bacula первый раз) выкладываю архивчик с готовыми конфигами по данной доке, просто скопируйте их себе в /etc/bacula меняйте имена хостов и пароли на желаемые и запускайте сервисы … все должно работать. FileSet в них содержит только директорию /etc — поэтому смело запускайте бекапы и только после корректного выполнения первых job-ов перестраивайте FileSet под свои задачи.

Хай щастить!

  • Трэкбэки отключены
  • Комментов (0)
  1. Комментов пока нет

Why ask?