![]()
Backing Up to Disk VolumesIf you have a lot of harddisk storage or you absolutely must have your backups run within a small time window, you may want to direct Bacula to backup to disk Volumes rather than tape Volumes. This chapter is intended to give you some of the options that are available to you so that you can manage those disk volumes.Key Concepts and Resource RecordsGetting Bacula to write to disk rather than tape in the simplest case is rather easy. In the Storage daemon's configuration file, you simply define an Archive Device to be a directory. For example, if you want your disk backups to go into the directory /home/bacula/backups, you could use the following:Device { Name = FileBackup Media Type = File Archive Device = /home/bacula/backups Random Access = Yes; AutomaticMount = yes; RemovableMedia = no; AlwaysOpen = no; }Assuming you have the appropriate Storage resource in your Director's configuration file that references the above Device resource, Storage { Name = FileStorage Address = ... Password = ... Device = FileBackup Media Type = File }Bacula will then write the archive to the file /home/bacula/backups/<volume-name> where <volume-name> is the volume name of a Volume defined in the Pool. For example, if you have labeled a Volume named Vol001, Bacula will write to the file /home/bacula/backups/Vol001. Although you can later move the archive file to another directory, you should not rename it or it will become unreadable by Bacula. This is because each archive has the filename as part of the internal label, and the internal label must agree with the system filename before Bacula will use it. Although this is quite simple, there are a number of problems, the first is that unless you specify otherwise, Bacula will always write to the same volume until you run out of disk space.
Pool Options to Limit the Volume UsageSome of the options you have, all of which are specified in the Pool record, are:
Pool { Name = File Pool Type = Backup Volume Use Duration = 23h }then if you run a backup once a day (every 24 hours), Bacula will use a new Volume each backup because each Volume it writes can only be used for 23 hours after the first write. Automatic Volume LabelingUse of the above records brings up another problem -- that of labeling your Volumes. For automated disk backup, you can either manually label each of your Volumes, or you can have Bacula automatically label new Volumes when they are needed. The current automatic Volume labeling is a bit simplistic, but it does allow for automation. Automatic Volume labeling is accomplished by making a change to both the Pool resource (Director) and to the Device resource (Storage daemon) shown above. In the case of the Pool resource, you must provide Bacula with a label format that it will use to create new names. The label format is simply the Volume name, to which Bacula will append a four digit number. This number starts at 0001 and is incremented for each Volume the pool contains. Thus if you modify your Pool resource to be:Pool { Name = File Pool Type = Backup Volume Use Duration = 23h LabelFormat = Vol }Bacula will create Volume names Vol0001, Vol0002, and so on when new Volumes are needed. The second change that is necessary to make this work is to give the Storage daemon permission to automatically label Volumes. Do so by adding LabelMedia = yes to the Device resource as follows: Device { Name = File Media Type = File Archive Device = /home/bacula/backups Random Access = Yes; AutomaticMount = yes; RemovableMedia = no; AlwaysOpen = no; LabelMedia = yes } Restricting the Number of Volumes and RecyclingAutomatic labeling discussed above brings up the problem of Volume management. With the above scheme, a new Volume will be created every day. If you have not specified Retention periods, your Catalog will continue to fill keeping track of all the files Bacula has backed up, and this procedure will create one new archive file (Volume) every day.The tools Bacula gives you to help automatically manage these problems are the following:
Volume Retention, AutoPrune, and Recycle determine how long Bacula will keep your Volumes before reusing them, and they are also discussed in detail in the Automatic Volume Recycling chapter of this manual. The Maximum Volumes record can also be used in conjunction with the Volume Retention period to limit the total number of archive Volumes (files) that Bacula will create. By setting an appropriate Volume Retention period, a Volume will be purged just before it is needed and thus Bacula can cycle through a fixed set of Volumes. Cycling through a fixed set of Volumes can also be done by setting Recycle Oldest Volume = yes. In this case, when Bacula needs a new Volume, it will purge the oldest Volume without out regard to retention periods. This guarantees that the oldest Volume will be reused, but you should take care that you understand how this works or you could cause Bacula to overwrite valid data. At a minimum you must define a reasonable number of Volumes before running any job so that the current Volume isn't immediately recycled and reused when it is full! An ExampleThe following example is not very practical, but can be used to demonstrate the proof of concept in a relatively short period of time. The example consists of a single client that is backed up to a set of 12 archive files (Volumes). Each Volume is used (written) only once, and there are four Full saves done every hour (so the whole thing cycles around after three hours).The Director's configuration file is as follows: Director { Name = my-dir QueryFile = "~/bacula/bin/query.sql" PidDirectory = "~/bacula/working" SubSysDirectory = "~/bacula/working" WorkingDirectory = "~/bacula/working" Password = dir_password } Schedule { Name = "FourPerHour" Run = Level=Full Pool=Recycle Storage=File hourly at 0:05 Run = Level=Full Pool=Recycle Storage=File hourly at 0:20 Run = Level=Full Pool=Recycle Storage=File hourly at 0:35 Run = Level=Full Pool=Recycle Storage=File hourly at 0:50 } Job { Name = "RecycleExample" Type = Backup Level = Full Client = Rufus FileSet= "Example FileSet" Messages = Standard Storage = FileStorage Pool = Recycle Schedule = FourPerHour } FileSet { Name = "Example FileSet" Include = compression=GZIP signature=SHA1 { /home/kern/bacula/bin } } Client { Name = Rufus Address = rufus Catalog = BackupDB Password = client_password } Storage { Name = FileStorage Address = rufus Password = local_storage_password # password for Storage daemon Device = RecyleDir # must be same as Device in Storage daemon Media Type = File # must be same as MediaType in Storage daemon } Catalog { Name = BackupDB dbname = bacula; user = bacula; password = "" } Messages { Name = Standard ... } Pool { Name = Recycle Use Volume Once = yes Pool Type = Backup LabelFormat = Vol AutoPrune = yes VolumeRetention = 2h Maximum Volumes = 12 Recycle = yes }and the Storage daemon's configuration file is: Storage { Name = my-sd WorkingDirectory = "~/bacula/working" Pid Directory = "~/bacula/working" Subsys Directory = "~/bacula/working" MaximumConcurrentJobs = 10 } Director { Name = my-dir Password = local_storage_password } Device { Name = RecyleDir Media Type = File Archive Device = /home/bacula/backups LabelMedia = yes; # lets Bacula label unlabeled media Random Access = Yes; AutomaticMount = yes; # when device opened, read it RemovableMedia = no; AlwaysOpen = no; } Messages { Name = Standard director = my-dir = all }In this example, the Jobs will be backed up to directory /home/bacula/backups with Volume names Vol0001, Vol0002, ... Vol0012. Every backup Job will write a new volume cycling through the volume numbers, and two hours after a job has started, the volume will be pruned Volume Retention = 2h. With a little bit of work, you can change the above example into a weekly or monthly cycle (take care about the amount of archive disk space used). Considerations for Multiple ClientsIf we take the above example and add a second Client, here are a few considerations:
The Director's configuration file is as follows: Director { Name = my-dir QueryFile = "~/bacula/bin/query.sql" PidDirectory = "~/bacula/working" SubSysDirectory = "~/bacula/working" WorkingDirectory = "~/bacula/working" Password = dir_password } # Basic weekly schedule Schedule { Name = "WeeklySchedule" Run = Level=Full fri at 1:30 Run = Level=Incremental sat-thu at 1:30 } FileSet { Name = "Example FileSet" Include = compression=GZIP signature=SHA1 { /home/kern/bacula/bin } } Job { Name = "Backup-client1" Type = Backup Level = Full Client = client1 FileSet= "Example FileSet" Messages = Standard Storage = File1 Pool = client1 Schedule = "WeeklySchedule" } Job { Name = "Backup-client2" Type = Backup Level = Full Client = client2 FileSet= "Example FileSet" Messages = Standard Storage = File2 Pool = client2 Schedule = "WeeklySchedule" } Client { Name = client1 Address = client1 Catalog = BackupDB Password = client1_password File Retention = 7d # keep files in catalog only 7 days } Client { Name = client2 Address = client2 Catalog = BackupDB Password = client2_password } # Two Storage definitions permits different directories Storage { Name = File1 Address = rufus Password = local_storage_password # password for Storage daemon Device = client1 # must be same as Device in Storage daemon Media Type = File # must be same as MediaType in Storage daemon } Storage { Name = File2 Address = rufus Password = local_storage_password # password for Storage daemon Device = client2 # must be same as Device in Storage daemon Media Type = File # must be same as MediaType in Storage daemon } Catalog { Name = BackupDB dbname = bacula; user = bacula; password = "" } Messages { Name = Standard ... } # Two pools permits different cycling periods and Volume names # Cycle through 15 Volumes (two weeks) Pool { Name = client1 Use Volume Once = yes Pool Type = Backup LabelFormat = Client1- AutoPrune = yes VolumeRetention = 13d Maximum Volumes = 15 Recycle = yes } # Cycle through 8 Volumes (1 week) Pool { Name = client2 Use Volume Once = yes Pool Type = Backup LabelFormat = Client2- AutoPrune = yes VolumeRetention = 6d Maximum Volumes = 8 Recycle = yes }and the Storage daemon's configuration file is: Storage { Name = my-sd WorkingDirectory = "~/bacula/working" Pid Directory = "~/bacula/working" Subsys Directory = "~/bacula/working" MaximumConcurrentJobs = 10 } Director { Name = my-dir Password = local_storage_password } # Archive directory for Client1 Device { Name = client1 Media Type = File Archive Device = /home/bacula/client1 LabelMedia = yes; # lets Bacula label unlabeled media Random Access = Yes; AutomaticMount = yes; # when device opened, read it RemovableMedia = no; AlwaysOpen = no; } # Archive directory for Client2 Device { Name = client2 Media Type = File Archive Device = /home/bacula/client2 LabelMedia = yes; # lets Bacula label unlabeled media Random Access = Yes; AutomaticMount = yes; # when device opened, read it RemovableMedia = no; AlwaysOpen = no; } Messages { Name = Standard director = my-dir = all }
|