Si vous avez un manque d’espace pour Bacula, ceci peut peut-être bien vous aider, mais pas vous sauver… Il faut toujours bien penser à son dimensionnement d’espace disque nécessaire dès le départ.

Mais parfois il arrive que vous faites des changements importants, comme changer les pools utilisés par certains jobs. A ce moment là, vous risquez d’avoir beaucoup de volumes qui n’ont plus de jobs associés une fois la période de rétention passée.

Cas concret :

Vous révisez votre façon de sauvegarder avec Bacula et vous décidez de dissocier les backups systèmes et backups data. Ceci afin d’avoir une rétention de 3 mois sur les systèmes et 12 mois sur les data. Cela vaut aussi pour séparer des données critiques avec rétention de 10 ans et des données temporaires de projets de < 6 mois. Les volumes des deux pools sont sur le même disque physique (une grosse baie RAID par exemple).

Si vous modifiez les jobs « data » du pool de 3 mois vers celui de 12 mois, il faut savoir que les volumes de ce pool de 3 mois seront toujours là. Ce qui est normal vu que la rétention de 3 mois est toujours active. Après les 3 mois passé, les jobs sont retirés du catalogue, et les volumes sont toujours présents afin d’être recyclés si besoin. Mais au vue de nos changements, ce nombre de volumes prêts à être recyclés est trop important et prend de l’espace physique sur le disque inutilement.

C’est comme si vous 2 pools étaient 2 containers de cargo. Celui de 3 mois était plein, mais après changement il est à moitié vide. Pourtant il garde la même taille sur le cargo. On va donc réduire la taille de ce containers pour pouvoir en mettre un autre sur l’espace gagné.

Afin de gagner de l’espace sur le disque physique et d’avoir quelque chose de plus réaliste entre le volume de données Bacula et le volume réel des données, nous allons grappiller sur cet espace « perdu ».

Obtenir la liste des volumes bacula inutilisés

Cela se fait via des requêtes SQL, la plupart étant déjà toutes faites, voici la liste :

# bconsole
Connecting to Director riga.anderlecht.be:9101
1000 OK: riga-dir Version: 5.0.2 (28 April 2010)
Enter a period to cancel a command.
*query
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
Available queries:
     1: List up to 20 places where a File is saved regardless of the directory
     2: List where the most recent copies of a file are saved
     3: List last 20 Full Backups for a Client
     4: List all backups for a Client after a specified time
     5: List all backups for a Client
     6: List Volume Attributes for a selected Volume
     7: List Volumes used by selected JobId
     8: List Volumes to Restore All Files
     9: List Pool Attributes for a selected Pool
    10: List total files/bytes by Job
    11: List total files/bytes by Volume
    12: List Files for a selected JobId
    13: List Jobs stored on a selected MediaId
    14: List Jobs stored for a given Volume name
    15: List Volumes Bacula thinks are in changer
    16: List Volumes likely to need replacement from age or errors
    17: List Jobs stored for a given Pool name

Voir le fichier /etc/bacula/scripts/query.sql pour la liste des query disponibles. Je mets celles que j’ai ici en pièce jointe : query.sql

Celle qui nous intéresse est « List total files/bytes by Volume »

Vous aurez une liste qui contiendra tous les volumes, avec tous les jobs associés du genre :

|   26 |  2,982,358 | 1,469,979,785,882 | VolFull6-0113  |
|   18 |  1,517,094 | 4,388,960,546,838 | VolFull6-0115  |

On veut justement le contraire nous : tous les volumes vides. On va donc travailler en faisant un diff entre la liste de tous les volumes et cette liste de volumes associés à des jobs. On aura donc la liste des volumes n’ayant pas de job associés dans Bacula. Vous pouvez faire cela via une requête SQL dédiée pour la réutiliser via la commande query de Bacula plus tard. Mais dans mon cas, j’ai fais au plus simple.

On écrit la liste des volumes :

echo -e "query\n11" |bconsole | grep VolFull6 > /tmp/toto

On arrange proprement :

cat /tmp/toto | awk -F'|' '{print $5}' | cut -c 2- | sort | sed 's/ //g' > /tmp/toto2

On va lister les fichiers de volumes concernés en se déplaçant dans le répertoire des volumes Bacula :

cd /data/bacula/volumes/
ls -1 VolFull6* > /tmp/totovol

Visionnez le diff :

diff -y /tmp/totovol /tmp/toto2 |less

Obtenir la liste les volumes vides de jobs :

diff /tmp/totovol /tmp/toto2 | grep '<' | cut -c 3- > /tmp/volvide

Vérification des volumes Bacula

Pour savoir la taille que cela va vous faire gagner en espace physique (en Go):

somme=$(while read l ; do ls -l $l ; done < /tmp/volvide | awk '{printf $5"+"}')0
echo $((($somme)/1024/1024/1024))
958

On va vérifier toute la liste des volumes afin d’être sur qu’il n’y a plus de job associés!

La query qui nous intéresse est la 14 « List Jobs stored for a given Volume name »

while read vol ; do echo -e "query\n14\n$vol" | bconsole | tail -n 3 ; done < /tmp/volvide

Vous aurez la liste des jobs qui ne renverra aucun résultat :

Choose a query (1-17): 14
Enter Volume name: VolFull6-0003
No results to list.

Si vous avez quelque chose du genre de ceci, vous avez fait une erreur quelque part! Attention à ne pas supprimer des jobs utiles de Bacula.

echo -e "query\n14\nVolFull6-0656" | bconsole | tail -n 3
+--------+------------+---------------------+------+-------+--------+-----------------+--------+
| 27,656 | luxembourg | 2015-05-01 22:00:01 | B    | F     | 84,300 | 243,832,488,949 | T      |
+--------+------------+---------------------+------+-------+--------+-----------------+--------+

Suppression des volumes Bacula

Suppression d’un volume du catalogue directement avec tous ses jobs associés! (dans note cas, il n’y a plus de jobs associés)

*delete volume=VolFull6-0003 yes

Pour tous les volumes :

while read vol ; do echo -e "delete volume=$vol yes" | bconsole | tail -n 3 ; done < /tmp/volvide
This command will delete volume VolFull6-0006
and all Jobs saved on that volume from the Catalog

This command will delete volume VolFull6-0007
and all Jobs saved on that volume from the Catalog

On supprime physiquement les volumes du disque :

cd /data/bacula/volumes
while read vol ; do rm -v $vol ; done < /tmp/volvide

Voilà 950Go de gagné! Bacula pourra toujours créer des volumes dans les deux pools en fonction de ses besoins.

Et n’oubliez pas de monitorer tout cela avec l’interface web pour Bacula. Pour toutes les infos sur Bacula, je vous redirige vers la bible 🙂