Configurando um autochanger virtual com múltiplos discos

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.

FacebooktwitterlinkedinFacebooktwitterlinkedinby feather

2 comentários sobre “Configurando um autochanger virtual com múltiplos discos

  1. Diego Ricarte disse:

    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 !

Os comentários estão fechados.