La ressource Autochanger supporte les librairies à un ou plusieurs lecteurs en regroupant une ou plusieurs ressources Device en une unité nommée Autochanger dans Bacula (souvent désignée en tant que librairie de bandes par les constructeurs). Si vous possédez une librairie, et si vous voulez qu'elle fonctionne correctement, vous devez avoir une ressource Autochanger dans le fichier de configuration de votre Storage Daemon, et les directives Storage de votre Director doivent se référer au nom de la ressource Autochanger si elles sont supposées utiliser la librairie. Dans les versions antérieures à 1.38.0, les directives Storage du Director se référaient directement aux ressources Device qui étaient des librairies. Désormais, ce type de référence directe ne fonctionne plus avec les librairies.
Voici un exemple de définition de ressource Autochanger valide :
Autochanger {
Name = "DDS-4-changer"
Device = DDS-4-1, DDS-4-2, DDS-4-3
Changer Device = /dev/sg0
Changer Command = "/etc/bacula/mtx-changer %c %o %S %a %d"
}
Device {
Name = "DDS-4-1"
Drive Index = 0
Autochanger = yes
...
}
Device {
Name = "DDS-4-2"
Drive Index = 1
Autochanger = yes
...
Device {
Name = "DDS-4-3"
Drive Index = 2
Autochanger = yes
Autoselect = no
...
}
Notez l'importance de la directive Autochanger = yes dans chaque définition de périphérique appartenant à une librairie. Un périphérique ne devrait pas être défini comme appartenant à plusieurs librairies. Aussi, votre directive Device dans la ressource Storage du Director devrait comporter le nom de la ressource Autochanger plutôt que le nom de l'un des lecteurs.
Si vous avez un lecteur qui appartient physiquement à une librairie mais que vous ne souhaitez pas que Bacula puisse l'utiliser automatiquement (par exemple, si vous voulez le réserver pour les restaurations) vous pouvez utiliser la directive :
Autoselect = no
à la ressource Device de ce lecteur. Dans ce cas, Bacula ne le sélectionnera pas automatiquement en accédant à la librairie. Vous pouvez encore utiliser le lecteur en le désignant par son nom de ressource device plutôt que par celui de la ressource Autochanger. Un exemple d'une telle définition est montré ci-dessus pour le lecteur DDS-4-3, qui ne sera pas sélectionné si le nom DDS-4-changer est utilisé dans une ressource Storage, mais le sera si DDS-4-3 est utilisé.
Les deux ressource suivantes implémentent une librairie :
Autochanger {
Name = "Autochanger"
Device = DDS-4
Changer Device = /dev/sg0
Changer Command = "/etc/bacula/mtx-changer %c %o %S %a %d"
}
Device {
Name = DDS-4
Media Type = DDS-4
Archive Device = /dev/nst0 # Normal archive device
Autochanger = yes
LabelMedia = no;
AutomaticMount = yes;
AlwaysOpen = yes;
}
où vous adapterez les directives Archive Device, Changer Device et Changer Command pour qu'elles conviennent à votre système.
Les ressources suivantes implémentent une librairie multi-lecteurs :
Autochanger {
Name = "Autochanger"
Device = Drive-1, Drive-2
Changer Device = /dev/sg0
Changer Command = "/etc/bacula/mtx-changer %c %o %S %a %d"
}
Device {
Name = Drive-1
Drive Index = 0
Media Type = DDS-4
Archive Device = /dev/nst0 # Normal archive device
Autochanger = yes
LabelMedia = no;
AutomaticMount = yes;
AlwaysOpen = yes;
}
Device {
Name = Drive-2
Drive Index = 1
Media Type = DDS-4
Archive Device = /dev/nst1 # Normal archive device
Autochanger = yes
LabelMedia = no;
AutomaticMount = yes;
AlwaysOpen = yes;
}
où vous adapterez les directives Archive Device, Changer Device et Changer Command pour qu'elles conviennent à votre système.
Si vous utilisez la directive Autochanger = yes à la ressource Storage du fichier de configuration de votre Director, la console Bacula vous demandera automatiquement le numéro de slot lors de l'utilisation des commandes add ou label pour ce périphérique de stockage. Si votre script mtx-changer est correctement installé, Bacula chargera la bonne cartouche à l'exécution de la commande label.
Vous devez aussi spécifier Autochanger = yes dans la ressource Device du Storage Daemon ainsi que nous l'avons décrit plus haut pour que la librairie soit utilisée. Veuillez consulter la section Ressource Storage dans le chapitre sur la configuration du Director pour plus de détails sur ce sujet.
Ainsi, toutes les phases de l'utilisation des cartouches peuvent être intégralement automatisées. Il est aussi possible de paramétrer ou modifier la valeur du slot en utilisant le sous-menu Volume Parameters de la commande update de la console.
Même si tous les paramètres ci-dessus sont correctement spécifiés, Bacula ne tentera d'accéder à la librairie que s'il existe un slot non-nul parmi les volumes enregistrés dans le catalogue.
Si votre librairie est équipée d'un lecteur de codes barres, vous pouvez étiqueter vos volumes l'un après l'autre en utilisant la commande label barcodes. Bacula montera et étiquettera chaque cartouche porteuse d'un code barres contenue dans la librairie avec le nom spécifié par le code barres. L'enregistrement aproprié sera aussi créé dans le catalogue. Toute cartouche dont le code barres commence par les caractères spécifiés par la directive Cleaning Prefix est considérée comme une cartouche de nettoyage, et ne sera pas étiquetée. Par exemple, avec :
Pool {
Name ...
Cleaning Prefix = "CLN"
}
toute cartouche de code barres CLNxxxx sera traitée en tant que cartouche de nettoyage, et ne sera pas montée.
unmount (changez vos cartouches et/ou ex\'ecutez mtx) mount
Si vous omettez de faire "unmount" avant de telles changements, Bacula ne saura plus ce qui est dans la librairie, et ce qui n'y est pas, et peut même cesser de fonctionner parce qu'il s'attend à avoir le contrôle exclusif de la librairie tandis quie le lecteur est monté.
Notez que les volumes doivent être pré-étiquetés pour pouvoir être utilisés automatiquement dans la librairie lors d'une sauvegarde. Si vous ne disposez pas d'un lecteur de code barres, ceci se fait manuellement, ou à l'aide d'un script.
Si vous avez plusieurs magasins ou si vous insérez ou retirez des cartouches d'un magasin, vous devriez en informer Bacula. Ainsi, Bacula sera en mesure d'utiliser préférentiellement des cartouches qu'il sait être dans la librairie, prévenant ainsi des interventions humaines inutiles.
Si votre librairie est équipée d'un lecteur de codes barres, il est aisé de tenir Bacula informé : chaque fois que vous changez un magasin, ajoutez ou prélevez une cartouche, faites simplement :
unmount (remove magazine) (insert new magazine) update slots mount
dans la console. Avec cette commande, Bacula se renseigne auprès de la librairie pour connaître les volumes qu'elle contient. Ceci ne nécessite pas d'accéder aux volumes car la librairie se charge de faire son inventaire lors de sa mise sous tension. Bacula s'assure alors que tout volume présent dans la librairie est marqué présent dans le catalogue et que tout volume absent de la librairie est marqué absent dans le catalogue. En outre, les numéros de slots des volumes sont corrigés dans le catalogue s'ils sont inexacts.
Si vous ne disposez pas d'un lecteur de codes barres, vous avez plusieurs alternatives :
update slots scan
qui ordonne à Bacula de lire l'étiquette (label) de chacune des cartouches dans la librairie par montage successif, et de mettre à jour les informations (Slot, drapeau InChanger) dans le catalogue. Cette méthode est efficace, mais prend du temps pour charger chaque cartouche et en lire l'étiquette.
Vous pouvez simuler un lecteur de codes barres dans votre librairie en faisant en sorte que le script mtx-changer retourne les informations que retournerait une librairie avec lecteur de codes barres. Pour cela, commentez la ligne ci-dessous dans le "case" aux alentours de la ligne 99 :
${MTX} -f $ctl status | grep " *Storage Element [0-9]*:.*Full" | awk "{print \$3 \$4}" | sed "s/Full *\(:VolumeTag=\)*//"
en ajoutant un # au début de cette ligne (vous pouvez aussi supprimer la ligne). A sa place, ajoutez une nouvelle ligne dont le rôle est d'imprimer le contenu d'un fichier. Par exemple :
cat /etc/bacula/changer.volumes
Le nom du fichier est libre, mais assurez vous d'utiliser un chemin absolu. Le contenu du fichier doit avoir le format :
1:Volume1 2:Volume2 3:Volume3 ...
Où 1, 2, 3 sont les numéros de slots et Volume1, Volume2, Volume3 sont les noms de volumes dans ces slots. Vous pouvez utiliser plusieurs fichiers représentant les contenus de plusieurs magasins, ainsi, lorsque vous changez de magasin, contentez vous de copier le contenu du fichier associé dans le fichier /etc/bacula/changer.volumes. Il n'est pas utile de stopper et redémarrer Bacula lors d'un changement de magasins, mettez simplement les bonnes valeurs dans le fichier avant de lancer la commande update slots. Votre librairie apparaîtra à Bacula comme équipée d'un lecteur de codes barres.
Si vous ne changez qu'une cartouche, vous ne voulez peut-être pas passer au crible tous vos volumes, c'est pourquoi la commande update slots (de même que la commande update slots scan) possède la forme additionnelle :
update slots=n1,n2,n3-n4, ...
où le mot-clef scan peut éventuellement être ajouté. n1, n2, n3-n4 représentent respectivement les numéros et la plage de slots que vous souhaitez mettre à jour.
Cette forme est particulièrement utile si vous voulez utiliser "scan" (couteux en temps) en restrignant l'opération à quelques slots.
Par exemple, si vous lancez la commande :
update slots=1,6 scan
Bacula va charger le volume du slot 6, lire son étiquette logicielle (label) et mettre à jour le catalogue, avant de faire de même avec la cartouche du slot 6. Avec la commande :
update slots=1-3,6
il va lire les codes barres des volumes dans les slots 1,2,3 et 6, et faire les mises à jour approriées dans le catalogue. Si vous n'avez pas de lecteur de codes barres, ni n'en simulez comme décrit plus haut, la commande ci-dessus ne trouvera aucun nom de volume et ne fera donc rien.
Si vous rencontrez des problèmes sur FreeBSD lorsque Bacula tente de sélectionner une cartouche, et si le message est Device not configured, c'est parce que FreeBSD a fait disparaître le fichier de périphérique /dev/nsa1 lorsqu'il n'y avait plus de cartouche montée dans le lecteur. Par conséquent, Bacula ne peut ouvrir le périphérique. Une solution consiste à charger une cartouche avant le lancement de Bacula. Ce problème est corrigé dans les versions de Bacula ultérieures à 1.32f-5.
Veuillez consulter le chapitre Tester votre lecteur de ce manuel pour d'importantes informations sur votre lecteur avant de passer au test de la librairie.
Avant d'essayer d'utiliser une librairie avec Bacula, il est préférable de vérifier "à la main" que le bras robotisé fonctionne. Pour ce faire, utilisez les commandes suivantes (à supposer que le script mtx-changer est installé dans /etc/bacula/mtx-changer) :
Cette commande devrait afficher :
1: 2: 3: ...
soit un numéro suivi de deux points pour chacun des slots occupé dans la librairie. Si votre librairie a un lecteur de codes barres, celui-ci sera affiché après les deux points. Si un message d'erreur s'affiche, vous devez résoudre le problème (par exemple, essayez un autre nom de périphérique si /dev/sg0 n'est pas le bon. PAr exemple, sur FreeBSD c'est généralement /dev/pass2).
Cette commande devrait retourner le nombre de slots de votre librairie.
Si une cartouche est chargée, cette commande devrait la décharger.
Si vous avez une cartouche dans le slot 3, elle sera chargée dans le slot de lecture (0).
devrait afficher "3"
Une fois que toutes les commandes ci-dessus fonctionnent correctement, Bacula devrait être capable d'utiliser la librairie, pourvu que votre configuration comporte la bonne commande Changer Command. A ce stade, il ne peut subsister qu'un problème : si votre librairie requiert un certain délai pour charger la cartouche après l'exécution de la commande. Immédiatement après avoir obtenu le retour du script mtx-changer, Bacula commande le rembobinage et la lecture de la bande. S'il obtient une erreur I/O, vous devriez probablement insérer une pause (sleep 20) après la commande mtx, mais prenez soin de terminer le script avec un code de sortie 0 en ajoutant exit 0 après toute commande que vous ajoutez au script, car Bacula contrôle le code de sortie du script qui devrait être 0 si tout s'est bien passé.
Vous pouvez tester si vous avez ou non besoin d'une telle pause en exécutant le script suivant :
#!/bin/sh /etc/bacula/mtx-changer /dev/sg0 unload /etc/bacula/mtx-changer /dev/sg0 load 3 mt -f /dev/st0 rewind mt -f /dev/st0 weof
S'il fonctionne correctement, vous n'êtes sans doute pas concerné par ce problème. Sinon, commencez par ajouter sleep 30 voire sleep 60 juste après la commande "/etc/bacula/mtx-changer /dev/sg0 load 3". Si ça marche, vous pouvez alors intégrer cette pause dans le script mtx-changer afin qu'elle soit effective lorsque Bacula est exécuté.
Quelques rares librairies exigent l'éjection de la cartouche avant de pouvoir la décharger. Dan ce cas, la commande /etc/bacula/mtx-changer /dev/sg0 load 3 ne fonctionne jamais, quel que soit la durée de la pause. Si vous pensez avoir ce problème, insérez une commande "eject" juste avant la commande /etc/bacula/mtx-changer /dev/sg0 unload :
#!/bin/sh /etc/bacula/mtx-changer /dev/sg0 unload mt -f /dev/st0 offline /etc/bacula/mtx-changer /dev/sg0 load 3 mt -f /dev/st0 rewind mt -f /dev/st0 weof
Naturellement, si vous avez besoin de la commande offline, vous devriez l'intégrer au script mtx-changer, en n'oubliant pas de préserver le code de sortie du script par l'ajout de exit 0.
Comme indiqué précédemment, plusieurs scripts qui implémentent ces fonctions sont regroupés dans <bacula-source>/examples/devices, ils peuvent vous inspirer pour faire en sorte que le votre fonctionne.
Si Bacula affiche "Rewind error on /dev/nst0. ERR=Input/output error." vous avez probablement besoin d'accroître la pause dans le script mtx-changer
Supposons que vous ayez convenablement défini les directives Device du Storage Daemon, et que vous ayez ajouté la directive Autochanger = yes dans la ressource Storage de votre fichier bacula-dir.conf.
Maintenant, alimentez votre librairie avec quelques cartouches vierges.
Que faire pour que Bacula accède à ces cartouches ?
Une stratégie consiste à pré-étiqueter chacune des cartouches. Pour cela, démarrez Bacula, puis utilisez la commande label dans la console :
./console Connecting to Director rufus:8101 1000 OK: rufus-dir Version: 1.26 (4 October 2002) *label
l'affichage devrait être :
Using default Catalog name=BackupDB DB=bacula
The defined Storage resources are:
1: Autochanger
2: File
Select Storage resource (1-2): 1
Choisissez la librairie (choix 1), vous obtenez :
Enter new Volume name: TestVolume1 Enter slot (0 for none): 1
Ici saisissez TestVolume1 en guise de nom, et 1 pour le slot. On vous demande alors :
Defined Pools:
1: Default
2: File
Select the Pool (1-2): 1
Sélectionnez le pool Default (ce qui est fait automatiquement si vous n'avez que celui-là). Bacula poursuit en déchargeant toute cartouche chargée, en chargeant celle du slot 1 et en l'étiquetant. Dans cet exemple, le lecteur était vide, il en résulte l'affichage :
Connecting to Storage daemon Autochanger at localhost:9103 ... Sending label command ... 3903 Issuing autochanger "load slot 1" command. 3000 OK label. Volume=TestVolume1 Device=/dev/nst0 Media record for Volume=TestVolume1 successfully created. Requesting mount Autochanger ... 3001 Device /dev/nst0 is mounted with Volume TestVolume1 You have messages. *
Vous pouvez continuer à étiqueter les autres volumes, les messages changeront légèrement du fait qu'il y aura cette fois une cartouche à décharger avant de charger la suivante.
Une fois que tous vos volumes sont étiquetés, Bacula est en mesure de les charger lorsqu'il en a besoin.
Pour "voir" votre étiquetage, saisissez la commande list volumes dans la console, vous devriez obtenir quelque chose comme :
*{\bf list volumes}
Using default Catalog name=BackupDB DB=bacula
Defined Pools:
1: Default
2: File
Select the Pool (1-2): 1
+-------+----------+--------+---------+-------+--------+----------+-------+------+
| MedId | VolName | MedTyp | VolStat | Bites | LstWrt | VolReten | Recyc | Slot |
+-------+----------+--------+---------+-------+--------+----------+-------+------+
| 1 | TestVol1 | DDS-4 | Append | 0 | 0 | 30672000 | 0 | 1 |
| 2 | TestVol2 | DDS-4 | Append | 0 | 0 | 30672000 | 0 | 2 |
| 3 | TestVol3 | DDS-4 | Append | 0 | 0 | 30672000 | 0 | 3 |
| ... |
+-------+----------+--------+---------+-------+--------+----------+-------+------+
Bacula utilise les codes barres à travers deux commandes de la console : label barcodes et update slots.
La commande label barcodes ordonne à Bacula de lire tous les codes barres de toutes les cartouches présentes dans la librairie à l'aide de la commande mtx-changer list. Les cartouches sont ensuite montées l'une après l'autre pour être étiqueté du nom de leur code barres.
La commande update slots commence par obtenir du script mtx-changer la liste des cartouches et de leurs codes barres. Ensuite, il confronte chacune des valeurs du catalogues à cette liste afin de le mettre à jour. Notez que si un volume ne figure pas dans le catalogue, il n'y a rien a faire. Cette commande est utile pour synchroniser Bacula avec le contenu de la librairie si vous avez changé de magasin ou déplacé des cartouches.
La directive Cleaning Prefix peut être utilisée dans la ressource Pool pour définir un préfixe de nom de volume qui, s'il correspond au code barres d'un volume confère à ce volume le statut (VolStatus) Cleaning. Ceci évite que Bacula tente d'écrire sur une cartouche de nettoyage.
Bacula appelle le script mtx-changer que vous spécifiez au niveau de la directive Changer Command. En principe, ce sera le script mtx-changer que nous fournissons, mais ce pourrait être n'importe quel programme qui implémente les commandes loaded, load, unload, list, et slots qu'utilise Bacula. Voici le format sous lequel ces commandes doivent retourner les informations :
- Currently the changer commands used are:
loaded -- retourne le num\'ero du slot d'origine de la cartouche charg\'ee,
avec pour base 1 et 0 pour le lecteur.
load -- charge la cartouche du slot sp\'ecifi\'e dans le lecteur.(notez que certains
mat\'eriels requi\`erent une pause de 30 secondes apr\`es cette commande)
unload -- d\'echarge le lecteur (la cartouche retourne dans son slot d'origine).
list -- retourne une ligne par cartouche pr\'esente dans la librairie
au format <slot>:<barcode> o\`u {\bf slot} est un entier non-nul
repr\'esentant le num\'ero du slot, et {\bf barcode} est le code barres,
s'il existe et si la librairie le prend en charge, associ\'e \`a la cartouche
(dans le cas contraire, le champ "barcode" est laiss\'e blanc.
slots -- retourne le nombre total de slots dans la librairie.
Bacula contrôle le code de sortie du programme appelé. Si ce code est 0, les informations sont acceptées. Dans le cas contraire, elles sont ignorées et le lecteur est traité comme s'il n'était pas dans une librairie.
eric 2009-05-06