Atualizado: 25/10/2016
Uma das dificuldades encontradas na implantação do Bacula quando se utiliza múltiplos discos, é o fato de ser necessário criar Pools específicas para cada disco e fazer um balanceamento manual dos Jobs de Backup para essas Pools. Isso é um trabalho meio cansativo e muitas vezes os discos são mal utilizados.
Apesar do Bacula suportar nativamente a configuração de autochangers virtuais, existe uma limitação, pois o ele requer a configuração de um único “Media Type” na configuração do Storage e que o “Archive Device” esteja configurado no mesmo diretório.
Buscando uma solução para este problema, encontrei o “vchanger“, que pode ser considerado um emulador de fitas (“tape library“) baseado em discos para utilizar com o Bacula. A última versão do vchanger é a 1.0.1 e pode ser encontrada em:
https://sourceforge.net/projects/vchanger/ ou então em
https://github.com/wanderleihuttel/vchanger. (A versão do git possui uma alteração no vchanger onde ele altera o arquivo que cria os volumes, podendo utilizar o próprio vchanger para a criação de volumes mais “amigáveis”, ou ordenados corretamente no bconsole).
Vamos utilizar neste tutorial que já temos um servidor do Bacula rodando com 3 Pools (Daily, Weekly e Monthly), com apenas 1 Storage salvando os volumes em “/mnt/disco01”, e gostaríamos de adicionar um segundo disco “/mnt/disco02” para aumentar a retenção dos backups.
Para efetuar a instalação do vchanger, execute os passos abaixo:
cd /usr/src wget -c https://sourceforge.net/projects/vchanger/files/vchanger/1.0.1/vchanger-1.0.1.tar.gz tar xvzf vchanger-1.0.1.tar.gz cd vchanger ./configure make -j 8 make install-strip
Se não ocorrer nenhum erro de compilação, o vchanger será instalado por padrão em “/usr/local/bin/”.
Criar o arquivo de configuração do vchanger:
#/etc/vchanger/vchanger.conf Storage Resource = "StorageVirtualChanger" # Nome do Storage no Bacula User = root Group = root Work Dir = "/var/spool/vchanger" # Diretório de execução do vchanger logfile = "/var/log/vchanger.log" # Arquivo de log do vchanger bconsole = "/sbin/bconsole" # Binário do bconsole bconsole config = "/etc/bacula/bconsole.conf" # configuração do bconsole Magazine = "/mnt/disco01" # Caminho do Disco01 Magazine = "/mnt/disco02" # Caminho do Disco02
Criar uma pasta para salvar as configurações do vchanger
mkdir /etc/vchanger mkdir /var/spool/vchanger * Caso utilize um usuário diferente de root para rodar o vchanger deve-se dar permissão no diretório /var/spool/vchanger para o usuário do bacula
Para testar se o vchanger está funcionando digite o seguinte comando:
vchanger /etc/vchanger/vchanger.conf listmags 0:0:0:/mnt/disco01 1:0:0:/mnt/disco02
Configurar um autochanger no /etc/bacula/bacula-sd.conf conforme abaixo:
Autochanger { Name = "VirtualChanger" Device = vc-disk01 Changer Command = "/usr/local/bin/vchanger %c %o %S %a %d" Changer Device = "/etc/vchanger/vchanger.conf" } # Disco01 = DriveIndex0 Device { Name = "vc-disk01" DriveIndex = 0 Autochanger = yes DeviceType = File MediaType = File LabelMedia = no ArchiveDevice = "/var/spool/vchanger/0" RemovableMedia = no RandomAccess = yes } # Não é necessário configurar um segundo Device (drive), somente se você utilizar Jobs concorrentes em pool distintas # Disco02 = DriveIndex1 Device { Name = "vc-disk02" DriveIndex = 1 Autochanger = yes DeviceType = File MediaType = File LabelMedia = no ArchiveDevice = "/var/spool/vchanger/1" RemovableMedia = no RandomAccess = yes }
Configurar um segundo Storage no /etc/bacula/bacula-dir.conf, e configurar o Device com o nome do autochanger:
Storage { Name = "StorageVirtualChanger" Address = 192.168.1.1 SDPort = 9103 Password = "password" Device = "VirtualChanger" Media Type = File Maximum Concurrent Jobs = 50 Heartbeat Interval = 1 Minute Autochanger = yes }
O nome do Storage deve ser o mesmo que foi definido na configuração do arquivo do “vchanger.conf”.
Configuração das Pools
Quando se utiliza backup em fitas, não é necessário configurar delimitadores como “Maximum Volumes Bytes” ou “Maximum Volumes“, pois cada fita é utilizada como 1 volume único e como a compactação é feita via hardware, o tamanho pode variar a cada backup.
No caso de backup em disco utilizando o vchanger, também é possível deixar sem estes delimitadores, porém acredito que seja mais fácil para gerenciar a quantidade de volumes x bytes posteriormente.
Eu geralmente configuro o Storage na própria Pool, então deve-se comentar ou remover da configuração de cada Pool o “Label Format“, e alterar o “Storage” anterior para o novo autochanger:
Pool{ Name = "Daily" Pool Type = Backup Recycle = yes Autoprune = yes #LabelFormat = "Volume-Daily-${NumVols+:p/4/0/r}" Volume Retention = 1 year Maximum Volume Bytes = 4GB Maximum Volumes = 15 #Storage = "StorageLocal" Storage = "StorageVirtualChanger" } Pool{ Name = "Weekly" Pool Type = Backup Recycle = yes Autoprune = yes #LabelFormat = "Volume-Weekly-${NumVols+:p/4/0/r}" Volume Retention = 1 year Maximum Volume Bytes = 4GB Maximum Volumes = 25 #Storage = "StorageLocal" Storage = "StorageVirtualChanger" } Pool{ Name = "Monthly" Pool Type = Backup Recycle = yes Autoprune = yes #LabelFormat = "Volume-Monthly-${NumVols+:p/4/0/r}" Volume Retention = 1 year Maximum Volume Bytes = 4GB Maximum Volumes = 70 #Storage = "StorageLocal" Storage = "StorageVirtualChanger" }
Como as Pools estavam configuradas usando o Storage anterior, precisamos alterar manualmente algumas informações dos volumes. (Os campos StorageId e InChanger).
Para isso, é preciso acessar o bconsole e executar o comando sqlquery.
(Após realizar estes procedimentos sair do bconsole e reiniciar o bacula)
# SQL para listar os Storages, pegar o StorageId do StorageVirtualChanger Enter SQL query: select * from Storage; +-----------+-----------------------+-------------+ | StorageId | Name | AutoChanger | +-----------+-----------------------+-------------+ | 1 | StorageLocal | 0 | | 2 | StorageVirtualChanger | 1 | +-----------+-----------------------+-------------+ # SQL para listar os Volumes e o Storage # Todos os volumes estão no StorageLocal e não estão no autochanger (InChanger) Enter SQL query: select Media.MediaId, Media.VolumeName, Media.Slot, Media.PoolId, Pool.Name, Media.Inchanger, Media.StorageId, Storage.Name from Media, Pool, Storage where (Media.PoolId = Pool.PoolId and Media.StorageId = Storage.StorageId); +-------+--------------------+----+------+--------+---------+---------+------------+ |MediaId|VolumeName |Slot|PoolId|Name |Inchanger|StorageId|Name | +-------+--------------------+----+------+--------+---------+---------+------------+ | 1|Volume-Daily-0001 | 0 | 1|Daily | 0| 1|StorageLocal| | 2|Volume-Daily-0002 | 0 | 1|Daily | 0| 1|StorageLocal| | 3|Volume-Daily-0003 | 0 | 1|Daily | 0| 1|StorageLocal| | 4|Volume-Daily-0004 | 0 | 1|Daily | 0| 1|StorageLocal| | 5|Volume-Daily-0005 | 0 | 1|Daily | 0| 1|StorageLocal| | 6|Volume-Daily-0006 | 0 | 1|Daily | 0| 1|StorageLocal| | 7|Volume-Daily-0007 | 0 | 1|Daily | 0| 1|StorageLocal| | 8|Volume-Daily-0008 | 0 | 1|Daily | 0| 1|StorageLocal| | 9|Volume-Daily-0009 | 0 | 1|Daily | 0| 1|StorageLocal| | 10|Volume-Daily-0010 | 0 | 1|Daily | 0| 1|StorageLocal| | 11|Volume-Weekly-0001 | 0 | 3|Weekly | 0| 1|StorageLocal| | 12|Volume-Weekly-0002 | 0 | 3|Weekly | 0| 1|StorageLocal| | 13|Volume-Weekly-0003 | 0 | 3|Weekly | 0| 1|StorageLocal| | 14|Volume-Weekly-0004 | 0 | 3|Weekly | 0| 1|StorageLocal| | 15|Volume-Weekly-0005 | 0 | 3|Weekly | 0| 1|StorageLocal| | 16|Volume-Weekly-0006 | 0 | 3|Weekly | 0| 1|StorageLocal| | 17|Volume-Weekly-0007 | 0 | 3|Weekly | 0| 1|StorageLocal| | 18|Volume-Weekly-0008 | 0 | 3|Weekly | 0| 1|StorageLocal| | 19|Volume-Weekly-0009 | 0 | 3|Weekly | 0| 1|StorageLocal| | 20|Volume-Weekly-0010 | 0 | 3|Weekly | 0| 1|StorageLocal| | 21|Volume-Monthly-0001 | 0 | 2|Monthly | 0| 1|StorageLocal| | 22|Volume-Monthly-0002 | 0 | 2|Monthly | 0| 1|StorageLocal| | 23|Volume-Monthly-0003 | 0 | 2|Monthly | 0| 1|StorageLocal| | 24|Volume-Monthly-0004 | 0 | 2|Monthly | 0| 1|StorageLocal| | 25|Volume-Monthly-0005 | 0 | 2|Monthly | 0| 1|StorageLocal| | 26|Volume-Monthly-0006 | 0 | 2|Monthly | 0| 1|StorageLocal| | 27|Volume-Monthly-0007 | 0 | 2|Monthly | 0| 1|StorageLocal| | 28|Volume-Monthly-0008 | 0 | 2|Monthly | 0| 1|StorageLocal| | 29|Volume-Monthly-0009 | 0 | 2|Monthly | 0| 1|StorageLocal| | 30|Volume-Monthly-00010| 0 | 2|Monthly | 0| 1|StorageLocal| +-------+--------------------+----+------+--------+---------+---------+------------+ # SQL para atualizar o StorageId e o InChanger # Utilizar o código do StorageId obtido na primeira consulta, e o InChanger usa-se 1. Enter SQL query: update Media set StorageId=2, InChanger=1; # SQL para listar os Volumes e o Storage # Todos os volumes agora estão no StorageVirtualChanger e estão como InChanger = 1. Enter SQL query: select Media.MediaId, Media.VolumeName, Media.Slot, Media.PoolId, Pool.Name, Media.Inchanger, Media.StorageId, Storage.Name from Media, Pool, Storage where (Media.PoolId = Pool.PoolId and Media.StorageId = Storage.StorageId); +-------+--------------------+----+------+--------+---------+---------+--------------+ |MediaId|VolumeName |Slot|PoolId|Name |Inchanger|StorageId|Name | +-------+--------------------+----+------+--------+---------+---------+--------------+ | 1|Volume-Daily-0001 | 0 | 1|Daily | 1| 1|StorageVirtual| | 2|Volume-Daily-0002 | 0 | 1|Daily | 1| 1|StorageVirtual| | 3|Volume-Daily-0003 | 0 | 1|Daily | 1| 1|StorageVirtual| | 4|Volume-Daily-0004 | 0 | 1|Daily | 1| 1|StorageVirtual| | 5|Volume-Daily-0005 | 0 | 1|Daily | 1| 1|StorageVirtual| | 6|Volume-Daily-0006 | 0 | 1|Daily | 1| 1|StorageVirtual| | 7|Volume-Daily-0007 | 0 | 1|Daily | 1| 1|StorageVirtual| | 8|Volume-Daily-0008 | 0 | 1|Daily | 1| 1|StorageVirtual| | 9|Volume-Daily-0009 | 0 | 1|Daily | 1| 1|StorageVirtual| | 10|Volume-Daily-0010 | 0 | 1|Daily | 1| 1|StorageVirtual| | 11|Volume-Weekly-0001 | 0 | 3|Weekly | 1| 1|StorageVirtual| | 12|Volume-Weekly-0002 | 0 | 3|Weekly | 1| 1|StorageVirtual| | 13|Volume-Weekly-0003 | 0 | 3|Weekly | 1| 1|StorageVirtual| | 14|Volume-Weekly-0004 | 0 | 3|Weekly | 1| 1|StorageVirtual| | 15|Volume-Weekly-0005 | 0 | 3|Weekly | 1| 1|StorageVirtual| | 16|Volume-Weekly-0006 | 0 | 3|Weekly | 1| 1|StorageVirtual| | 17|Volume-Weekly-0007 | 0 | 3|Weekly | 1| 1|StorageVirtual| | 18|Volume-Weekly-0008 | 0 | 3|Weekly | 1| 1|StorageVirtual| | 19|Volume-Weekly-0009 | 0 | 3|Weekly | 1| 1|StorageVirtual| | 20|Volume-Weekly-0010 | 0 | 3|Weekly | 1| 1|StorageVirtual| | 21|Volume-Monthly-0001 | 0 | 2|Monthly | 1| 1|StorageVirtual| | 22|Volume-Monthly-0002 | 0 | 2|Monthly | 1| 1|StorageVirtual| | 23|Volume-Monthly-0003 | 0 | 2|Monthly | 1| 1|StorageVirtual| | 24|Volume-Monthly-0004 | 0 | 2|Monthly | 1| 1|StorageVirtual| | 25|Volume-Monthly-0005 | 0 | 2|Monthly | 1| 1|StorageVirtual| | 26|Volume-Monthly-0006 | 0 | 2|Monthly | 1| 1|StorageVirtual| | 27|Volume-Monthly-0007 | 0 | 2|Monthly | 1| 1|StorageVirtual| | 28|Volume-Monthly-0008 | 0 | 2|Monthly | 1| 1|StorageVirtual| | 29|Volume-Monthly-0009 | 0 | 2|Monthly | 1| 1|StorageVirtual| | 30|Volume-Monthly-0010 | 0 | 2|Monthly | 1| 1|StorageVirtual| +-------+--------------------+----+------+--------+---------+---------+--------------+
Como foram alteradas informações de Volumes e Pools é preciso executar um reload no bconsole pra recarregar as configurações das Pools e após executar o comando update:
– update, opção 2: Pool from resource (Daily, Weekly e Monthly)
– update, opção 1: Volume parameters – opção 14: All Volumes from all Pools
Executando o vchanger com a opção “listall“, ele vai listar os volumes já existentes em seus respectivos slots, como se fossem fitas. Neste exemplo temos 10 volumes em cada Pool.
vchanger /etc/vchanger/vchanger.conf listall D:0:E S:1:F:Volume-Daily-0001 S:2:F:Volume-Daily-0002 S:3:F:Volume-Daily-0003 S:4:F:Volume-Daily-0004 S:5:F:Volume-Daily-0005 S:6:F:Volume-Daily-0006 S:7:F:Volume-Daily-0007 S:8:F:Volume-Daily-0008 S:9:F:Volume-Daily-0009 S:10:F:Volume-Daily-0010 S:11:F:Volume-Monthly-0001 S:12:F:Volume-Monthly-0002 S:13:F:Volume-Monthly-0003 S:14:F:Volume-Monthly-0004 S:15:F:Volume-Monthly-0005 S:16:F:Volume-Monthly-0006 S:17:F:Volume-Monthly-0007 S:18:F:Volume-Monthly-0008 S:19:F:Volume-Monthly-0009 S:20:F:Volume-Monthly-0010 S:21:F:Volume-Weekly-0001 S:22:F:Volume-Weekly-0002 S:23:F:Volume-Weekly-0003 S:24:F:Volume-Weekly-0004 S:25:F:Volume-Weekly-0005 S:26:F:Volume-Weekly-0006 S:27:F:Volume-Weekly-0007 S:28:F:Volume-Weekly-0008 S:29:F:Volume-Weekly-0009 S:30:F:Volume-Weekly-0010
Os valores retornados pelo comando “vchanger listall” são separados por “:” (dois pontos), onde o formato é basicamente “tipo:número:status:código_de_barras”.
1º campo: D ou S (drive ou slot)
2º campo: Número do drive ou do slot
3º campo: Status do drive ou slot (E=vazio e F=cheio)
4º campo: Código de barras (Label)
Caso seja apagado ou movido algum volume entre os discos, é preciso executar o comando para atualizar os slots no bconsole:
*update slots storage=StorageVirtualChanger drive=0
Comando para listar o status dos slots no bconsole:
*status slots storage=StorageVirtualChanger drive=0 Connecting to Storage daemon StorageVirtualChanger at 192.168.1.1:9103 ... 3306 Issuing autochanger "slots" command. Device "VirtualChanger" has 31 slots. Connecting to Storage daemon StorageVirtualChanger at 192.168.1.1:9103 ... 3306 Issuing autochanger "list" command. +------+---------------------+--------+------------+---------+ | Slot | Volume Name |Status | Media Type | Pool | +------+---------------------+--------+------------+---------+ | 1 | Volume-Daily-0001 | Full | File | Daily | | 2 | Volume-Daily-0002 | Full | File | Daily | | 3 | Volume-Daily-0003 | Full | File | Daily | | 4 | Volume-Daily-0004 | Full | File | Daily | | 5 | Volume-Daily-0005 | Full | File | Daily | | 6 | Volume-Daily-0006 | Full | File | Daily | | 7 | Volume-Daily-0007 | Full | File | Daily | | 8 | Volume-Daily-0008 | Append | File | Daily | | 9 | Volume-Daily-0009 | Full | File | Daily | | 10 | Volume-Daily-0010 | Full | File | Daily | | 11 | Volume-Monthly-0001 | Full | File | Monthly | | 12 | Volume-Monthly-0002 | Full | File | Monthly | | 13 | Volume-Monthly-0003 | Full | File | Monthly | | 14 | Volume-Monthly-0004 | Append | File | Monthly | | 15 | Volume-Monthly-0005 | Full | File | Monthly | | 16 | Volume-Monthly-0006 | Full | File | Monthly | | 17 | Volume-Monthly-0007 | Full | File | Monthly | | 18 | Volume-Monthly-0008 | Full | File | Monthly | | 19 | Volume-Monthly-0009 | Full | File | Monthly | | 20 | Volume-Monthly-0010 | Full | File | Monthly | | 21 | Volume-Weekly-0001 | Full | File | Weekly | | 22 | Volume-Weekly-0002 | Full | File | Weekly | | 23 | Volume-Weekly-0003 | Full | File | Weekly | | 24 | Volume-Weekly-0004 | Full | File | Weekly | | 25 | Volume-Weekly-0005 | Full | File | Weekly | | 26 | Volume-Weekly-0006 | Full | File | Weekly | | 27 | Volume-Weekly-0007 | Full | File | Weekly | | 28 | Volume-Weekly-0008 | Full | File | Weekly | | 29 | Volume-Weekly-0009 | Append | File | Weekly | | 30 | Volume-Weekly-0010 | Full | File | Weekly | | 31*| | ? | ? | ? | +------+---------------------+--------+------------+---------+
Para criar novos volumes é possível utilizar o vchanger com a opção “createvols“, porém os labels gerados por ele atualmente não são muito amigáveis. Neste exemplo vamos criar manualmente os volumes. Os volumes podem ser criados em qualquer um dos discos do autochanger sem a necessidade de volumes de uma mesma Pool estarem no mesmo disco.
Para exemplificar vamos criar 2 novos volumes, 1 em cada disco.
Acesse o bconsole para verificar qual o último volume utilizado em uma determinada Pool e saia.
*list media pool=Daily Using Catalog "MyCatalog" +---------+-------------------+-----------+---------+ | MediaId | VolumeName | VolStatus | Enabled | +---------+-------------------+-----------+---------+ | 1 | Volume-Daily-0001 | Full | 1 | | 2 | Volume-Daily-0002 | Full | 1 | | 3 | Volume-Daily-0003 | Full | 1 | | 4 | Volume-Daily-0004 | Full | 1 | | 5 | Volume-Daily-0005 | Full | 1 | | 6 | Volume-Daily-0006 | Full | 1 | | 7 | Volume-Daily-0007 | Full | 1 | | 8 | Volume-Daily-0008 | Full | 1 | | 9 | Volume-Daily-0009 | Full | 1 | | 10 | Volume-Daily-0010 | Append | 1 | +---------+-------------------+-----------+---------+
O último volume da Pool “Daily” é o volume “Volume-Daily-0010“, então os próximos serão “Volume-Daily-0011” e “Volume-Daily-0012“. Para criar os volumes utilize simplesmente o comando touch, conforme abaixo:
touch /mnt/disk01/Volume-Daily-0011 touch /mnt/disk02/Volume-Daily-0012
Vamos listar novamente o estado dos slots no vchanger:
vchanger /etc/vchanger/vchanger.conf listall D:0:E S:1:F:Volume-Daily-0001 S:2:F:Volume-Daily-0002 S:3:F:Volume-Daily-0003 S:4:F:Volume-Daily-0004 S:5:F:Volume-Daily-0005 S:6:F:Volume-Daily-0006 S:7:F:Volume-Daily-0007 S:8:F:Volume-Daily-0008 S:9:F:Volume-Daily-0009 S:10:F:Volume-Daily-0010 S:11:F:Volume-Daily-0011 S:12:F:Volume-Monthly-0001 S:13:F:Volume-Monthly-0002 S:14:F:Volume-Monthly-0003 S:15:F:Volume-Monthly-0004 S:16:F:Volume-Monthly-0005 S:17:F:Volume-Monthly-0006 S:18:F:Volume-Monthly-0007 S:19:F:Volume-Monthly-0008 S:20:F:Volume-Monthly-0009 S:21:F:Volume-Monthly-0010 S:22:F:Volume-Weekly-0001 S:23:F:Volume-Weekly-0002 S:24:F:Volume-Weekly-0003 S:25:F:Volume-Weekly-0004 S:26:F:Volume-Weekly-0005 S:27:F:Volume-Weekly-0006 S:28:F:Volume-Weekly-0007 S:29:F:Volume-Weekly-0008 S:30:F:Volume-Weekly-0009 S:31:F:Volume-Weekly-0010 S:32:F:Volume-Daily-0012 S:33:E
É possível notar que o que os novos volumes “Volume-Daily-0011” e “Volume-Daily-0012” estão nos slots 11 e 32. Com os volumes inseridos no vchanger, precisamos acessar o bconsole e executar o comando “label barcodes“.
*label barcodes storage=StorageVirtualChanger pool=Diaria drive=0 slots=11,32 Connecting to Storage daemon StorageVirtualChanger at 192.168.1.1:9103 ... 3306 Issuing autochanger "slots" command. Device "VirtualChanger" has 33 slots. Connecting to Storage daemon StorageVirtualChanger at 192.168.1.1:9103 ... 3306 Issuing autochanger "list" command. The following Volumes will be labeled: Slot Volume ============== 11 Volume-Daily-0011 32 Volume-Daily-0012 Do you want to label these Volumes? (yes|no): yes Connecting to Storage daemon StorageVirtualChanger at 192.168.1.1:9103 ... Sending label command for Volume "Volume-Daily-0011" Slot 11 ... 3304 Issuing autochanger "load slot 11, drive 0" command for vol Volume-Daily-0011. 3305 Autochanger "load slot 11, drive 0", status is OK for vol Volume-Daily-0011. 3000 OK label. VolBytes=205 VolABytes=0 VolType=1 Volume="Volume-Daily-0011" Device="vc-disk01" (/var/spool/vchanger/0) Catalog record for Volume "Volume-Daily-0011", Slot 11 successfully created. Sending label command for Volume "Volume-Daily-0012" Slot 32 ... 3307 Issuing autochanger "unload slot 11, drive 0" command for vol Volume-Daily-0012. 3304 Issuing autochanger "load slot 32, drive 0" command for vol Volume-Daily-0012. 3305 Autochanger "load slot 32, drive 0", status is OK for vol Volume-Daily-0012. 3000 OK label. VolBytes=205 VolABytes=0 VolType=1 Volume="Volume-Daily-0012" Device="vc-disk01" (/var/spool/vchanger/0) Catalog record for Volume "Volume-Daily-0012", Slot 32 successfully created.
Quando se cria novos volumes, o vchanger automaticamente coloca no drive o último volume criado, então para evitar que seja gravado neste último volume ao invés do volume correto, deve-se retirar o volume do drive, antes de realizar qualquer backup.
Listar o volume que está no drive:
(Pode-se ver que no Drive 0 está carregado o Slot 32)
vchanger /etc/vchanger/vchanger.conf listall D:0:F:32:Volume-Daily-0012 S:1:F:Volume-Daily-0001 S:2:F:Volume-Daily-0002 S:3:F:Volume-Daily-0003 S:4:F:Volume-Daily-0004 S:5:F:Volume-Daily-0005 S:6:F:Volume-Daily-0006 S:7:F:Volume-Daily-0007 S:8:F:Volume-Daily-0008 S:9:F:Volume-Daily-0009 S:10:F:Volume-Daily-0010 S:11:F:Volume-Daily-0011 S:12:F:Volume-Monthly-0001 S:13:F:Volume-Monthly-0002 S:14:F:Volume-Monthly-0003 S:15:F:Volume-Monthly-0004 S:16:F:Volume-Monthly-0005 S:17:F:Volume-Monthly-0006 S:18:F:Volume-Monthly-0007 S:19:F:Volume-Monthly-0008 S:20:F:Volume-Monthly-0009 S:21:F:Volume-Monthly-0010 S:22:F:Volume-Weekly-0001 S:23:F:Volume-Weekly-0002 S:24:F:Volume-Weekly-0003 S:25:F:Volume-Weekly-0004 S:26:F:Volume-Weekly-0005 S:27:F:Volume-Weekly-0006 S:28:F:Volume-Weekly-0007 S:29:F:Volume-Weekly-0008 S:30:F:Volume-Weekly-0009 S:31:F:Volume-Weekly-0010 S:32:E S:33:E
Para retirar o volume do drive, executamos o vchanger com o comando unload
vchanger /etc/vchanger/vchanger.conf unload 32 /dev/null 0
Como o comando “createvols” do vchanger cria os volumes com nomes, que particularmente eu não gosto, pelo fato de que quando executamos o comando “list media” no bconsole eles não ficam ordenados na sequencia correta. Então eu criei um script para realizar a criação dos volumes.
Script de criação automática de volumes:
#!/bin/bash #/usr/local/bin/vchanger.sh if [ $# -lt 5 ]; then echo -e "Parameters are missing!" echo -e " vchanger.sh create MagazineNumber PoolName LabelPrefix StartVolume NumberVols" echo -e " vchanger.sh update MagazineNumber PoolName LabelPrefix StartVolume NumberVols\n" exit fi # default config BCONSOLE="/sbin/bconsole" VCHANGER="/usr/local/bin/vchanger" VCONF="/etc/vchanger/vchanger.conf" STORAGE="StorageVirtualChanger" DRIVE="0" path=`$VCHANGER $VCONF listmags | grep "^$2" | cut -d":" -f4` if [ "$path" == "" ]; then echo "Magazine not found!" exit else cd $path fi # params OPTION=$1 POOL=$3 PREFIX=$4 A=$5 B=`expr $A + $6` if [ "$OPTION" != "createvols" ] && [ "$OPTION" != "updatevols" ]; then echo -e "Error: Param 1 must have 'createvols' or 'updatevols'" exit fi ## Creating Volumes ## if [ "$OPTION" == "createvols" ]; then echo "Creating Volumes in Pool: \"$POOL\"" for i in $(eval echo {$A..$B}) do volume=`printf "$PREFIX%04d" $i` echo "Volume \"$volume\" created successfully!" touch $volume slot="`$VCHANGER $VCONF listall | grep "D:" | cut -d":" -f4`" if [ "$slot" != "" ]; then $VCHANGER $VCONF unload $slot /dev/null 0 fi slot="`$VCHANGER $VCONF listall | grep "S:.*$volume" | cut -d":" -f2`" echo "$slot" echo -e "label barcodes storage=$STORAGE drive=$DRIVE pool=$POOL slot=$slot yes" | $BCONSOLE done ## Update Volumes ## elif [ "$OPTION" == "updatevols" ]; then echo "Update Volumes in Pool: $POOL" for i in $(eval echo {$A..$B}) do volume=`printf "update volume=$PREFIX%04d pool=$POOL" $i` echo "Command: \"$volume\"" echo $volume | $BCONSOLE done else echo "Wrong option!" fi echo "Script terminated!"
Exemplo de execução
/usr/local/bin/vchanger.sh createvols 0 Monthly Volume-Monthly- 1 25 /usr/local/bin/vchanger.sh updatevols 0 Monthly Volume-Monthly- 1 25
Caso tenha utilizado a versão do git, é possível criar os volumes com nomes mais amigáveis utilizando o próprio vchanger. (a versão original também é possível criar, mas os volumes não ficam ordenados corretamente no bconsole
(leia o arquivo REAME no repositório e entenda um pouco melhor:
https://github.com/wanderleihuttel/vchanger/blob/master/README)
vchanger /etc/vchanger/vchanger.conf createvols Drive Quantidade_Volumes Iniciando_Em --label=Volume-Monthly- --pool=Monthly vchanger /etc/vchanger/vchanger.conf createvols 0 10 1 --label=Volume-Monthly- --pool=Monthly vchanger /etc/vchanger/vchanger.conf createvols 0 10 1 --label=Volume_Monthly_ --pool=Monthly
Sempre que for adicionar, excluir ou mover volumes entre os discos, não esqueça de executar o comando “update slots storage=StorageVirtualChanger drive=0” para atualizar a posição de cada slot.
Boa tarde Huttel, segui seu tutorial para configura o autochanger mas não estava tendo sucesso quando ia verificar os slots, mostrava “no slots” :
3306 Issuing autochanger “slots” command.
Device “VirtualChanger” has 0 slots.
No slots in changer to scan.
*
Depois de um tempo quebrando a cabeça , vi que o usuário do bacula não tinha permissão no arquivo de log e na pasta /var/spool/vchanger :
Sep 20 13:07:55: could not access work directory ‘/var/spool/vchanger’
Sep 20 13:09:25: ERROR! cannot open dynamic.conf file for restore (errno=13)
Sep 20 13:09:25: ERROR! cannot open magazine 0 state file for reading: Permission denied
Sep 20 13:09:25: ERROR! cannot open magazine 0 state file for writing: Permission denied
Sep 20 13:09:25: ERROR! cannot open dynamic.conf file for writing (errno=13)
Depois de configurar as devidas permissões, rodou normalmente !
Obrigado pela excelente contribuição !