Based on Ubuntu 14.04 Server
Here is sort of a picture of what names/passwords in which files/Resources must match up:
Director/Console/Client:
1. vi /etc/hostname
director.test.pri
vi /etc/hosts
#127.0.1.1 ubuntu
192.168.1.15 director.test.pri
2. aptitude -y install mysql-server bacula-director-mysql bacula-console bacula-fd bacula-doc
3. vi /etc/bacula/bacula-dir.conf
#
# Default Bacula Director Configuration file
#
# The only thing that MUST be changed is to add one or more
# file or directory names in the Include directive of the
# FileSet resource.
#
# For Bacula release 5.2.6 (21 February 2012) -- ubuntu 14.04
#
# You might also want to change the default email address
# from root to your address. See the "mail" and "operator"
# directives in the Messages resource.
#
Director { # define myself
Name = director.test.pri-dir
DIRport = 9101 # where we listen for UA connections
QueryFile = "/etc/bacula/scripts/query.sql"
WorkingDirectory = "/var/lib/bacula"
PidDirectory = "/var/run/bacula"
Maximum Concurrent Jobs = 1
Password = "password-dir" # Console password
Messages = Daemon
DirAddress = 192.168.1.15
}
JobDefs {
Name = "DefaultJob"
Type = Backup
Level = Incremental
Client = director.test.pri-fd
FileSet = "Full Set"
Schedule = "WeeklyCycle"
Storage = File
Messages = Standard
Pool = Backup-File
Priority = 10
Write Bootstrap = "/var/lib/bacula/%c.bsr"
}
#
# Define the main nightly save backup job
# By default, this job will back up to disk in /nonexistant/path/to/file/archive/dir
Job {
Name = "BackupDirectorMysql"
JobDefs = "DefaultJob"
}
#Job {
# Name = "BackupClient2"
# Client = director.test.pri2-fd
# JobDefs = "DefaultJob"
#}
# 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
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
}
#
# Standard Restore template, to be changed by Console program
# Only one such job is needed for all Jobs/Clients/Storage ...
#
Job {
Name = "RestoreFiles"
Type = Restore
Client=director.test.pri-fd
FileSet="Full Set"
Storage = File
Pool = Default
Messages = Standard
Where = /tmp/restores
}
# List of files to be backed up
FileSet {
Name = "Full Set"
Include {
Options {
signature = MD5
compression = GZIP
}
#
# Put your list of files here, preceded by 'File =', one per line
# or include an external list with:
#
# File =
# Note: / backs up everything on the root partition.
# if you have other partitions such as /usr or /home
# you will probably want to add them too.
#
# By default this is defined to point to the Bacula binary
# directory to give a reasonable FileSet to backup to
# disk storage during initial testing.
#
File = /var/lib/mysql/bacula
}
#
# If you backup the root directory, the following two excluded
# files can be useful
#
Exclude {
File = /var/lib/bacula
File = /nonexistant/path/to/file/archive/dir
File = /proc
File = /tmp
File = /.journal
File = /.fsck
}
}
#
# When to do the backups, full backup on first sunday of the month,
# differential (i.e. incremental since full) every other sunday,
# and incremental backups other days
Schedule {
Name = "WeeklyCycle"
Run = Full 1st sun at 22:05
Run = Differential 2nd-5th sun at 22:05
Run = Incremental mon-sat at 22:05
}
# This schedule does the catalog. It starts after the WeeklyCycle
Schedule {
Name = "WeeklyCycleAfterBackup"
Run = Full sun-sat at 23:05
}
# This is the backup of the catalog
FileSet {
Name = "Catalog"
Include {
Options {
signature = MD5
}
File = "/var/lib/bacula/bacula.sql"
}
}
# Client (File Services) to backup
Client {
Name = director.test.pri-fd
Address = 192.168.1.15
FDPort = 9102
Catalog = MyCatalog
Password = "password-fd" # password for FileDaemon
File Retention = 30 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
}
#
# Second Client (File Services) to backup
# You should change Name, Address, and Password before using
#
#Client {
# Name = director.test.pri2-fd
# Address = localhost2
# FDPort = 9102
# Catalog = MyCatalog
# Password = "_gzGQ9nMJCrqcy2GqcfTBS-AiW-_3kU5m2" # password for FileDaemon 2
# File Retention = 30 days # 30 days
# Job Retention = 6 months # six months
# AutoPrune = yes # Prune expired Jobs/Files
#}
# Definition of file storage device
Storage {
Name = File
# Do not use "localhost" here
Address = 192.168.1.16 # N.B. Use a fully qualified name here
SDPort = 9103
Password = "password-sd"
Device = FileStorage
Media Type = File
}
# Definition of DDS tape storage device
#Storage {
# Name = DDS-4
# Do not use "localhost" here
# Address = localhost # N.B. Use a fully qualified name here
# SDPort = 9103
# Password = "FLIppBYBl0owLpu6sM187Z2c6Nu0yo_uN" # password for Storage daemon
# Device = DDS-4 # must be same as Device in Storage daemon
# Media Type = DDS-4 # must be same as MediaType in Storage daemon
# Autochanger = yes # enable for autochanger device
#}
# Definition of 8mm tape storage device
#Storage {
# Name = "8mmDrive"
# Do not use "localhost" here
# Address = localhost # N.B. Use a fully qualified name here
# SDPort = 9103
# Password = "FLIppBYBl0owLpu6sM187Z2c6Nu0yo_uN"
# Device = "Exabyte 8mm"
# MediaType = "8mm"
#}
# Definition of DVD storage device
#Storage {
# Name = "DVD"
# Do not use "localhost" here
# Address = localhost # N.B. Use a fully qualified name here
# SDPort = 9103
# Password = "FLIppBYBl0owLpu6sM187Z2c6Nu0yo_uN"
# Device = "DVD Writer"
# MediaType = "DVD"
#}
# Generic catalog service
Catalog {
Name = MyCatalog
# Uncomment the following line if you want the dbi driver
# dbdriver = "dbi:postgresql"; dbaddress = 127.0.0.1; dbport =
dbname = "bacula"; DB Address = ""; dbuser = "bacula"; dbpassword = "mysql"
}
# Reasonable message delivery -- send most everything to email address
# and to the console
Messages {
Name = Standard
#
# NOTE! If you send to two email or more email addresses, you will need
# to replace the %r in the from field (-f part) with a single valid
# email address in both the mailcommand and the operatorcommand.
# What this does is, it sets the email address that emails would display
# in the FROM field, which is by default the same email as they're being
# sent to. However, if you send email to more than one address, then
# you'll have to set the FROM address manually, to a single address.
# for example, a '[email protected]', is better since that tends to
# tell (most) people that its coming from an automated source.
# %c = Client’s name
# %d = Director’s name
# %e = Job Exit Status
# %h = Client address
# %i = JobId
# %j = Unique Job id
# %l = Job Level
# %n = Job name
# %r = Recipients
# %s = Since time
# %t = Job type (Backup, ...)
# %v = Volume name (Only on director side)
#
mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r"
operatorcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: Intervention needed for %j\" %r"
mail = root = all, !skipped
operator = root = mount
console = all, !skipped, !saved
#
# WARNING! the following will create a file that you must cycle from
# time to time as it will grow indefinitely. However, it will
# also keep all your messages if they scroll off the console.
#
append = "/var/log/bacula/bacula.log" = all, !skipped
catalog = all
}
#
# Message delivery for daemon messages (no job).
Messages {
Name = Daemon
mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r"
mail = root = all, !skipped
console = all, !skipped, !saved
append = "/var/log/bacula/bacula.log" = all, !skipped
}
# Default pool definition
Pool {
Name = Default
Pool Type = Backup
Recycle = yes # Bacula can automatically recycle Volumes
AutoPrune = yes # Prune expired volumes
Volume Retention = 365 days # one year
}
# File Pool definition
Pool {
Name = Backup-File
Pool Type = Backup
Recycle = yes # Bacula can automatically recycle Volumes
AutoPrune = yes # Prune expired volumes
Volume Retention = 365 days # one year
Maximum Volume Bytes = 50G # Limit Volume size to something reasonable
Maximum Volumes = 100 # Limit number of Volumes in Pool
Label Format = "${Year}-${Month}-${Day}-${Hour}-${Minute}-Vol"
}
# Scratch pool definition
Pool {
Name = Scratch
Pool Type = Backup
}
#
# Restricted console used by tray-monitor to get the status of the director
#
#Console {
# Name = director.test.pri-mon
# Password = "YwtsD4l9OkdjN67obn4SSOu0mvam4R7ly"
# CommandACL = status, .status
#}
vi /etc/bacula/bconsole.conf
#
# Bacula User Agent (or Console) Configuration File
#
Director {
Name = director.test.pri-dir
DIRport = 9101
address = 192.168.1.15
Password = "password-dir"
}
vi /etc/bacula/bacula-fd.conf
#
# Default Bacula File Daemon Configuration file
#
# For Bacula release 5.2.6 (21 February 2012) -- ubuntu 14.04
#
# There is not much to change here except perhaps the
# File daemon Name to
#
#
# List Directors who are permitted to contact this File daemon
#
Director {
Name = director.test.pri-dir
Password = "password-fd"
}
#
# Restricted Director, used by tray-monitor to get the
# status of the file daemon
#
#Director {
# Name = director.test.pri-mon
# Password = "kwQyI185fEBa38vuHtT9si_kudzPH5mVP"
# Monitor = yes
#}
#
# "Global" File daemon configuration specifications
#
FileDaemon { # this is me
Name = director.test.pri-fd
FDport = 9102 # where we listen for the director
WorkingDirectory = /var/lib/bacula
Pid Directory = /var/run/bacula
Maximum Concurrent Jobs = 20
FDAddress = 192.168.1.15
}
# Send all messages except skipped files back to Director
Messages {
Name = Standard
director = director.test.pri-dir = all, !skipped, !restored
}
4. chmod 755 /etc/bacula/scripts/delete_catalog_backup
service bacula-director restart
service bacula-fd restart
5. bconsole
autodisplay on
delete pool=File
6. you should reload in bconsole after you change the bacula-dir.conf
Note: using sendemail to send backup report to outside ISP's email, like [email protected]
1. aptitude -y install sendemail
2. vi /etc/bacula/bacula-dir.conf
Messages {
Name = Standard
mailcommand = "/usr/bin/sendEmail -s smtp.139.com -xu account-name -xp account-pass -f [email protected] -u \"Bacula: %t %e of %n on %c %l\" -t %r"
operatorcommand = "/usr/bin/sendEmail -s smtp.139.com -xu account-name -xp account-pass -f [email protected] -u \"Bacula: Intervention needed for %j\" -t %r"
mail = [email protected] = all, !skipped
operator = [email protected] = mount
Messages {
Name = Daemon
mailcommand = "/usr/bin/sendEmail -s smtp.139.com -xu account-name -xp account-pass -f [email protected] -u \"Bacula daemon message\" -t %r"
mail = [email protected] = all, !skipped
3. service bacula-director restart
bconsole
reload
Storage:
1. vi /etc/hostname
storage1.test.pri
vi /etc/hosts
#127.0.1.1 ubuntu
192.168.1.16 storage1.test.pri
2. aptitude -y install bacula-sd-mysql
vi /etc/bacula/bacula-sd.conf
#
# Default Bacula Storage Daemon Configuration file
#
# For Bacula release 5.2.6 (21 February 2012) -- ubuntu 14.04
#
# You may need to change the name of your tape drive
# on the "Archive Device" directive in the Device
# resource. If you change the Name and/or the
# "Media Type" in the Device resource, please ensure
# that dird.conf has corresponding changes.
#
Storage { # definition of myself
Name = storage1.test.pri-sd
SDPort = 9103 # Director's port
WorkingDirectory = "/var/lib/bacula"
Pid Directory = "/var/run/bacula"
Maximum Concurrent Jobs = 20
SDAddress = 192.168.1.16
}
#
# List Directors who are permitted to contact Storage daemon
#
Director {
Name = director.test.pri-dir
Password = "password-sd"
}
#
# Restricted Director, used by tray-monitor to get the
# status of the storage daemon
#
#Director {
# Name = storage1.test.pri-mon
# Password = "qwVX5fQeI6ARiSHf8FuQXIHcSAWTmviAY"
# Monitor = yes
#}
#
# Note, for a list of additional Device templates please
# see the directory
# Or follow the following link:
# http://bacula.svn.sourceforge.net/viewvc/bacula/trunk/bacula/examples/devices/
#
#
# Devices supported by this Storage daemon
# To connect, the Director's bacula-dir.conf must have the
# same Name and MediaType.
#
Device {
Name = FileStorage
Media Type = File
Archive Device = /mybackup/backup
LabelMedia = yes; # lets Bacula label unlabeled media
Random Access = Yes;
AutomaticMount = yes; # when device opened, read it
RemovableMedia = no;
AlwaysOpen = no;
}
#
# An autochanger device with two drives
#
#Autochanger {
# Name = Autochanger
# Device = Drive-1
# Device = Drive-2
# Changer Command = "/etc/bacula/scripts/mtx-changer %c %o %S %a %d"
# Changer Device = /dev/sg0
#}
#Device {
# Name = Drive-1 #
# Drive Index = 0
# Media Type = DLT-8000
# Archive Device = /dev/nst0
# AutomaticMount = yes; # when device opened, read it
# AlwaysOpen = yes;
# RemovableMedia = yes;
# RandomAccess = no;
# AutoChanger = yes
# #
# # Enable the Alert command only if you have the mtx package loaded
# # Note, apparently on some systems, tapeinfo resets the SCSI controller
# # thus if you turn this on, make sure it does not reset your SCSI
# # controller. I have never had any problems, and smartctl does
# # not seem to cause such problems.
# #
# Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
# If you have smartctl, enable this, it has more info than tapeinfo
# Alert Command = "sh -c 'smartctl -H -l error %c'"
#}
#Device {
# Name = Drive-2 #
# Drive Index = 1
# Media Type = DLT-8000
# Archive Device = /dev/nst1
# AutomaticMount = yes; # when device opened, read it
# AlwaysOpen = yes;
# RemovableMedia = yes;
# RandomAccess = no;
# AutoChanger = yes
# # Enable the Alert command only if you have the mtx package loaded
# Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
# If you have smartctl, enable this, it has more info than tapeinfo
# Alert Command = "sh -c 'smartctl -H -l error %c'"
#}
#
# A Linux or Solaris LTO-2 tape drive
#
#Device {
# Name = LTO-2
# Media Type = LTO-2
# Archive Device = /dev/nst0
# AutomaticMount = yes; # when device opened, read it
# AlwaysOpen = yes;
# RemovableMedia = yes;
# RandomAccess = no;
# Maximum File Size = 3GB
## Changer Command = "/etc/bacula/scripts/mtx-changer %c %o %S %a %d"
## Changer Device = /dev/sg0
## AutoChanger = yes
# # Enable the Alert command only if you have the mtx package loaded
## Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
## If you have smartctl, enable this, it has more info than tapeinfo
## Alert Command = "sh -c 'smartctl -H -l error %c'"
#}
#
# A Linux or Solaris LTO-3 tape drive
#
#Device {
# Name = LTO-3
# Media Type = LTO-3
# Archive Device = /dev/nst0
# AutomaticMount = yes; # when device opened, read it
# AlwaysOpen = yes;
# RemovableMedia = yes;
# RandomAccess = no;
# Maximum File Size = 4GB
## Changer Command = "/etc/bacula/scripts/mtx-changer %c %o %S %a %d"
## Changer Device = /dev/sg0
## AutoChanger = yes
# # Enable the Alert command only if you have the mtx package loaded
## Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
## If you have smartctl, enable this, it has more info than tapeinfo
## Alert Command = "sh -c 'smartctl -H -l error %c'"
#}
#
# A Linux or Solaris LTO-4 tape drive
#
#Device {
# Name = LTO-4
# Media Type = LTO-4
# Archive Device = /dev/nst0
# AutomaticMount = yes; # when device opened, read it
# AlwaysOpen = yes;
# RemovableMedia = yes;
# RandomAccess = no;
# Maximum File Size = 5GB
## Changer Command = "/etc/bacula/scripts/mtx-changer %c %o %S %a %d"
## Changer Device = /dev/sg0
## AutoChanger = yes
# # Enable the Alert command only if you have the mtx package loaded
## Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
## If you have smartctl, enable this, it has more info than tapeinfo
## Alert Command = "sh -c 'smartctl -H -l error %c'"
#}
#
# A FreeBSD tape drive
#
#Device {
# Name = DDS-4
# Description = "DDS-4 for FreeBSD"
# Media Type = DDS-4
# Archive Device = /dev/nsa1
# AutomaticMount = yes; # when device opened, read it
# AlwaysOpen = yes
# Offline On Unmount = no
# Hardware End of Medium = no
# BSF at EOM = yes
# Backward Space Record = no
# Fast Forward Space File = no
# TWO EOF = yes
# If you have smartctl, enable this, it has more info than tapeinfo
# Alert Command = "sh -c 'smartctl -H -l error %c'"
#}
#
# Send all messages to the Director,
# mount messages also are sent to the email address
#
Messages {
Name = Standard
director = director.test.pri-dir = all
}
3. mkdir -p /mybackup/backup
chown -R bacula:bacula /mybackup/backup
chmod -R 700 /mybackup/backup
4. service bacula-sd restart
Install Bacula web on Director
1. aptitude -y install apache2 libapache2-mod-php5 php5-mysql php5-gd
vi /etc/php5/apache2/php.ini
date.timezone = Asia/Shanghai
2. cd /var/www/html
wget http://bacula-web.org/download/articles/bacula-web-600.html?file=files/bacula-web.org/downloads/bacula-web-6.0.0.tgz
mv bacula-web-600.html\?file\=files%2Fbacula-web.org%2Fdownloads%2Fbacula-web-6.0.0.tgz bacula-web-600.tgz
tar zxf bacula-web-600.tgz
mv bacula-web-6.0.0 baculaweb
cd baculaweb/application/config/
cp config.php.sample config.php
vi config.php
// MySQL bacula catalog
$config[0]['label'] = 'Backup Server';
$config[0]['host'] = 'localhost';
$config[0]['login'] = 'bacula';
$config[0]['password'] = 'mysql';
$config[0]['db_name'] = 'bacula';
$config[0]['db_type'] = 'mysql';
$config[0]['db_port'] = '3306';
cd ..
cd view/
chmod ug+w cache/
chown -R www-data:www-data /var/www/html/baculaweb/
service apache2 restart
3. http://localhost/baculaweb/index.php
Backup Bacula Database on Director
1. mysql> CREATE USER 'baculabackup'@'localhost' IDENTIFIED BY 'baculabackup';
mysql> GRANT SELECT, RELOAD, LOCK TABLES ON *.* TO 'baculabackup'@'localhost' IDENTIFIED BY 'baculabackup';
mysql> flush privileges;
2. vi /usr/local/bin/mysqlbackup
#!/bin/bash
DBLIST="bacula" # databases for backing up
DBDIR=/var/lib/bacula/mysql
UP=" -u $1 --password=$2"
LOGFILE=/var/lib/bacula/mysql/backup.log
mkdir -p $DBDIR
for DATABASE in $DBLIST
do
mysqldump -q $UP $DATABASE > ${DBDIR}/$DATABASE
done
chmod +x /usr/local/bin/mysqlbackup
3. vi /etc/bacula/bacula-dir.conf
Job {
Name = "BackupBaculaDatabase"
JobDefs = "DefaultJob"
FileSet = "BaculaDatabase FileSet"
RunBeforeJob = "/usr/local/bin/mysqlbackup baculabackup baculabackup"
RunAfterJob = "/bin/rm -rf /var/lib/bacula/mysql"
}
Fileset {
Name = "BaculaDatabase FileSet"
Include {
Options {
signature = MD5
compression = GZIP
}
File = /var/lib/bacula/mysql
}
}
4. service bacula-director restart
Backing up a Windows Client - windows server 2012 R2
1. install bacula-win64-5.2.10.exe
2. edit C:\Program Files\Bacula\bacula-fd.conf
#
# Default Bacula File Daemon Configuration file
#
# For Bacula release 5.2.10 (06/28/12) -- Windows MinGW64
#
# There is not much to change here except perhaps the
# File daemon Name
#
#
# "Global" File daemon configuration specifications
#
FileDaemon { # this is me
Name = win2012-fd
FDport = 9102 # where we listen for the director
WorkingDirectory = "C:\\Program Files\\Bacula\\working"
Pid Directory = "C:\\Program Files\\Bacula\\working"
# Plugin Directory = "C:\\Program Files\\Bacula\\plugins"
Maximum Concurrent Jobs = 10
FDAddress = 192.168.1.106
}
#
# List Directors who are permitted to contact this File daemon
#
Director {
Name = director.test.pri-dir
Password = "password-fd"
}
#
# Restricted Director, used by tray-monitor to get the
# status of the file daemon
#
#Director {
# Name = @monitor_name@
# Password = "@monitor_password@"
# Monitor = yes
#}
# Send all messages except skipped files back to Director
Messages {
Name = Standard
director = director.test.pri-dir = all, !skipped, !restored
}
3. open firewall for TCP port 9102
open services.msc to start Bacula File Backup Service
4. on Director
vi /etc/bacula/bacula-dir.conf
# Windows 2012 Client (File Services) to backup
Client {
Name = win2012-fd
Address = 192.168.1.106
FDPort = 9102
Catalog = MyCatalog
Password = "password-fd" # password for FileDaemon
File Retention = 30 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
}
you should also define Job/FileSet/Schedule etc for Windows Client
service bacula-director restart
bconsole
status client