The implementation of Autochanger in bareos software is very far from working, so I expect many changes there in the future. The described solution is actually a workaround that works well on the 17.2 version. It may not work on a different version, you need to check before implementation on the production server.
When performing a backup using bareos, most of the backup time is wasted on the client side. The client performs an inventory of files, compares them with bareos metadata, compresses files, etc. If it were possible to perform parallel backups, this could dramatically reduce the backup window even for full backups. However, the standard FileStorage configuration does not allow running parallel tasks.
The solution includes four devices and an autochanger script. Devices are just symbolic links to real volume files somewhere in the location pointed to by the script. This solution makes concurrent backups possible yet still using the same media and pools. With minor changes, it can also use multiple file systems. The necessary wisdom can be realized in an autochanger script.
I want to remind you that the storage daemon is not required to be on the same server, it can be somewhere else where there is a lot of disk space. Therefore, these changes need to be made where your storage daemon is running.
Remove the default FileStorage definition and create new devices:
# rm -f /etc/bareos/bareos-sd.d/device/FileStorage.conf # cat /etc/bareos/bareos-sd.d/device/drive0.conf Device { AlwaysOpen = no Archive Device = /var/lib/bareos/storage/drive0 Autochanger = yes Automatic Mount = no Block Checksum = no Device Type = File Drive Index = 0 LabelMedia = yes Maximum Concurrent Jobs = 1 Media Type = File Name = drive0 Random Access = yes RemovableMedia = no } # sed -e 's/0/1/' /etc/bareos/bareos-sd.d/device/drive0.conf > /etc/bareos/bareos-sd.d/device/drive1.conf # sed -e 's/0/2/' /etc/bareos/bareos-sd.d/device/drive0.conf > /etc/bareos/bareos-sd.d/device/drive2.conf # sed -e 's/0/3/' /etc/bareos/bareos-sd.d/device/drive0.conf > /etc/bareos/bareos-sd.d/device/drive3.conf
Now create the Autochanger control device:
# cat /etc/bareos/bareos-sd.d/autochanger/VTLControl.conf Autochanger { Changer Command = "/usr/local/bin/bareos-sd-link \%o \%a \%S \%v" Changer Device = none Description = "VTLControl script relink device files" Device = drive0 Device = drive1 Device = drive2 Device = drive3 Name = VTLControl }
Update Maximum Concurrent Jobs in /etc/bareos/bareos-sd.d/storage/bareos-sd.conf
Storage { Name = bareos-sd Maximum Concurrent Jobs = 4 # We have 4 drives }
And finally, create a new script that do the trick:
# cat /usr/local/bin/bareos-sd-link #!/bin/bash # all storage volumes mounted under /var/lib/bareos/storage hierarchy, like: # /dev/sdc 1.0T 34M 1.0T 1% /var/lib/bareos/storage/volume1 # /dev/sdd 1.0T 34M 1.0T 1% /var/lib/bareos/storage/volume2 logger -t Autochanger "Called with:${@};arguments." COMMAND=$1 ; shift DRIVEFILE=$1 ; shift TAPESLOT=$1 ; shift VOLUME=$1 # Could be missing BASEDIR=$(dirname $DRIVEFILE) cd ${BASEDIR} || exit 1 make_new() { local v=$1 # Select less used mountpoint: touch $(df -kP | grep $BASEDIR | sort -k4nr | awk '{print $NF;exit}')/$v } case $COMMAND in load|loaded) if [ ! -z $VOLUME ] ; then rm -f $DRIVEFILE [ -f */${VOLUME} ] || make_new ${VOLUME} ln -s */${VOLUME} $DRIVEFILE fi ;; esac # chmod +x /usr/local/bin/bareos-sd-link
Do not forget that all files should be owned by bareos user:
# chown -R bareos:bareos /etc/bareos/bareos-sd.d
Restart storage daemon:
# service bareos-sd restart
It is enough to fix the device name in the /etc/bareos/bareos-dir.d/storage/File.conf file and add a couple of other parameters:
Storage { Name = File Address = bareos # N.B. Use a fully qualified name here (do not use "localhost" here). Password = "WrwIH5axzI/zzXWIsgaPygOCOBrYJ/dZxYMlKNppOUqa" Media Type = File Device = VTLControl Auto Changer = yes Maximum Concurrent Jobs = 20 # Should be more than double of devices, control session is also counts as "jobs" }
You can restart the director service or just reload it:
# echo reload | bconsole