Off-Site Backups with Bacula
Bacula, the Open Source Network Backup Solution
Bacula is a great Backup Solution for any infrastructure out there, if you don’t know this tool, I really recommend reading about it. I’ve been using it for over 2 years now and when I thought I had learned everything there was to learn about it, I was asked to do one more thing with our backups: store them on a off-site location for security. After all, what’s the point in having data backups stored in your company if a flood or a fire will destroy everything, including your backups?
“What’s the problem?”, you may ask… “Just take your daily backups tapes to an off-site location!”, you might say… If only life was that simple…
I needed those daily backups tapes on-site, since our helpdesk team was constantly asking us to restore some files from the Samba Share server, because the user “swears the file just disappeared from the server”… Yeah, right…
So, how could I possibly have a secure off-site backup of my data and, at the same time, have them available to me to make daily restores in my company?
Bacula and Copy Jobs
Copy Jobs to the rescue! Man, what a great feature. If you’re familiar with Bacula (which I hope you are, since this posts expects you to), you know that every single backup that Bacula does is actually a Job to it.
Basically, a Copy Job is a special Job (like an Admin Job) that takes a list of JobId based on a criteria chosen by you (will see them further on) and makes a copy of those Jobs from their original Pool to a different Pool.
I think you’ll understand better with examples…
The Scenario
Currently, I have the basic three Pools for my Backups: one for my Full Backups (pool.full), one for my Differential Backups (pool.diff) and the last one for my Incremental Backups (pool.inc). Their configurations is as the following:
Pool { Name = pool.full Pool Type = Backup Storage = st.tpc Volume Use Duration = 6 months Volume Retention = 1 year Scratch Pool = scratch.tpc RecyclePool = scratch.tpc File Retention = 1 year Job Retention = 1 year Cleaning Prefix = "CLN" } Pool { Name = pool.diff Pool Type = Backup Storage = st.tpc Volume Use Duration = 1 week Volume Retention = 6 months Scratch Pool = scratch.tpc Recycle Pool = scratch.tpc File Retention = 1 year Job Retention = 1 year Cleaning Prefix = "CLN" } Pool { Name = pool.inc Pool Type = Backup Storage = st.tpa Volume Use Duration = 1 month Volume Retention = 3 months Scratch Pool = scratch.tpa RecyclePool = scratch.tpa File Retention = 1 year Job Retention = 1 year Cleaning Prefix = "CLN" }
The details about my Backup Policy is not important, what you have to know is: I have 3 tape libraries named st.tpa, st.tpb and st.tpc. The first I’m using for my Incremental Backups and the last I’m using for my Differential and Full Backups. The second, st.tpb, I going to use for my Copy Jobs.
This is the first and possibly the most important note there is to know before starting using Copy Jobs: YOU MUST HAVE TWO DIFFERENT STORAGES IN ORDER TO USE COPY JOBS. For example: if you have a File Storage configured in your Bacula Storage Daemon where you send all your backups to, you can copy those jobs to an second File Storage or even to a Tape Storage, but you can’t copy your jobs to same storage location where you send your original jobs.
In my case, I had the Tape Storage st.tpb lying around with no use, so far.
I also had very simple Jobs and Schedules, which will execute a Full Backup twice a year, a Differential backup weekly and a Incremental Backup on a daily basis:
Schedule { Name = sch.default Run = Level=Full Pool=pool.full jan on 1st sat at 21:00 Run = Level=Full Pool=pool.full jul on 1st sat at 21:00 Run = Level=Differential Pool=pool.diff FullPool=pool.full on 1st sat at 21:00 Run = Level=Incremental Pool=pool.inc FullPool=pool.full sun-fri at 21:00 } Client { Name = client.test Address = test.example.dom Catalog = cat.default Password = "SeCrEt" File Retention = 1 year Job Retention = 1 year } Jobs { Name = job.test Type = Backup Client = client.test Write Bootstrap = "/var/spool/bacula/jobs/bootstrap.%c.%n.bsr" FileSet = fs.default Messages = msg.default Pool = pool.full Schedule = sch.default Max Start Delay = 72h Spool Data = yes Allow Duplicate Jobs = no Cancel Lower Level Duplicates = yes }
You can see that the Schedule is what defines which pool to use for each level of backup (Inc, Diff and Full). So, here what we’ve got so far:
- Full Backups go to Pool pool.full, residing on Storage st.tpc (Tape Library);
- Diff Backups go to Pool pool.diff, also residing on Storage st.tpc (Tape Library);
- Inc Backups go to Pool pool.inc, residing on Storage st.tpa (Tape Library);
The Backup of the Backups
Let’s start making Copy Jobs of my Full Backups, you’ll see that applying to the rest of the backups is very trivial. First, we need to create a Pool to throw the Copy Jobs, and here it is:
Pool { Name = pool.offsite Pool Type = Backup Storage = st.tpb Volume Use Duration = 1 day Volume Retention = 6 months Scratch Pool = scratch.tpb RecyclePool = scratch.tpb File Retention = 1 year Job Retention = 1 year Cleaning Prefix = "CLN" }
It is a regular Pool just like any other, with just a few notes: first, I’m using the “st.tpb” Storage for this Pool, remember that I have to use a different Storage for the Copy Jobs.
Second, the “Volume Use Duration” is 1 day because I’ll run the Copy Job once a week and, every week, it will start to use a different tape, because the one from the week before will be mark as “Used”. That’s specifically important to me because I’ll remove the tapes from this Storage to take them to an off-site location and, without this option, I would end up with “mount volume” error messages because Bacula would try to use the Tape that removed the week before on this week’s Copy Job.
How do you tell Bacula to Copy it’s Full Backups to this Pool? First, you must tell the Full Pool where to put the Copy Jobs, by adding the line “Next Pool” to it:
Pool { Name = pool.full Pool Type = Backup Storage = st.tpc Volume Use Duration = 6 months Volume Retention = 1 year Scratch Pool = scratch.tpc RecyclePool = scratch.tpc File Retention = 1 year Job Retention = 1 year Cleaning Prefix = "CLN" Next Pool = pool.offsite }
Second, you must create a special Copy Job:
Job { Name = job.copyjob.full Type = Copy Pool = pool.full Selection Type = PoolUncopiedJobs Messages = msg.default Schedule = sch.none Client = client.none FileSet = fs.none }
For a Copy Job, the parameters “Client” and “FileSet” really don’t matter at all. They are just there because the “Job” entry requires them. That’s it.
What matter is:
- Type: use the special keyword “Copy”;
- Pool: which Pool the Jobs will be copied FROM (the Pool it self tells where they will be copied TO, with the “Next Pool” directive);
- Selection Type: the option “PoolUncopiedJobs” basically tells Bacula to Copy all Jobs on this Pool that yet has not been copied before;
There are other ways of telling Bacula which Jobs it should make a Copy, but for me, making a Copy of every single Job of the Pool was just perfect. But if you like, you can even make a SQL Query to select which Jobs Bacula should make a Copy of.
Running the Bastard!
After configuring all that, since I’m using a fake Schedule directive for my Copy Job, I have to run it manually. I recommend doing this for the first few times just to see if everything goes fine. Dan Langille said this on his blog: walk first, run later.
So, to finally run your Copy Job, just execute on “bconsole”:
*run job=job.copyjob.full Run Copy job JobName: job.copyjob.full Bootstrap: *None* Client: client.none FileSet: fs.none Pool: pool.full (From Job resource) Read Storage: st.tpc (From Pool resource) Write Storage: st.tpb (From Storage from Pool's NextPool resource) JobId: *None* When: Catalog: cat.default Priority: 10 OK to run? (yes/mod/no):
On this output, notice the “JobId”? It’s blank because it will select the JobId’s to make the Copy of at run time. Fantastic, huh? Since I’m using the directive “PoolUncopiedJobs”, this single Job will create a Copy Job for every Full Backup Job that is stored on the the Pool “pool.full”.
Another thing to notice: “Read Storage” and “Write Storage”. Once again, THEY MUST BE DIFFERENT!
Once you strike “yes”, the madness begins! You’ll see something similar to this on your log:
JobId 30: The following 2 JobIds were chosen to be copied: 12,13 JobId 30: Job queued. JobId=31 JobId 30: Copying JobId 31 started. JobId 30: Job queued. JobId=33 JobId 30: Copying JobId 33 started.
By the time I ran this Copy Job, I had two Full Backup on my Pool “pool.full” and, guess what? Their JobId’s were consecutively 12 and 13! Like I said before, Bacula creates a different Copy Job for every Job that needs to be copied. Since I had two Full Backups, it creates two Copy Jobs with JobId 31 and 33.
And that’s it! Now just wait for your Copy Jobs to finish and keep checking your logs for any errors. In my case, I remove the Tapes used for Copy Jobs from the st.tpb Tape Library and take them to the off-site location, and replace them with new ones. Just remember that, every time you replace your Tapes, you must label them with “label barcodes” (or simply “label”, if your Tape Library doesn’t support barcodes) and always, ALWAYS, do an “update slots”, to tell Bacula that those tapes have been replaced on your Tape Library.
What about the Differentials and Incremental backups? They will work exactly the same way as the Full Backups, just add an “Next Pool” directive on their Pool. You can even use the same Pool you’re using for copying the Full Backups, like this:
Pool { Name = pool.diff Pool Type = Backup Storage = st.tpc Volume Use Duration = 1 week Volume Retention = 6 months Scratch Pool = scratch.tpc Recycle Pool = scratch.tpc File Retention = 1 year Job Retention = 1 year Cleaning Prefix = "CLN" Next Pool = pool.offsite } Pool { Name = pool.inc Pool Type = Backup Storage = st.tpa Volume Use Duration = 1 month Volume Retention = 3 months Scratch Pool = scratch.tpa RecyclePool = scratch.tpa File Retention = 1 year Job Retention = 1 year Cleaning Prefix = "CLN" Next Pool = pool.offsite }
Meaning that even your Differential and Incremental Backups stored on the pool.diff and the pool.inc would be copied to the pool.offsite Pool. You just need to create a Copy Job for each one:
Job { Name = job.copyjob.inc Type = Copy Pool = pool.inc Selection Type = PoolUncopiedJobs Messages = msg.default Schedule = sch.none Client = client.none FileSet = fs.none } Job { Name = job.copyjob.diff Type = Copy Pool = pool.diff Selection Type = PoolUncopiedJobs Messages = msg.default Schedule = sch.none Client = client.none FileSet = fs.none }
And run them manually like we did with the “job.copyjob.full” before. Off course, you can create a “real” Schedule resource to automatically run you Copy Jobs daily, for example. I’m just being extra careful, testing if everything is going alright before letting them run in the wild.
Now What?
Now, in case of a disaster and you loose your original Backup Tapes, how do you recover your data from the Copy Jobs Tapes? I’m still figuring it out, but very soon I’ll make a new post talking about it.
That’s it for now! Good luck!
EDIT: I’ve created a post explaining how to restore data from the Copy Jobs, check it out here.
Hello,
trying to implement this in an environment…
however the problem is that we have ~60 clients each with it’s own disk storage device (actually folders on a disk but configured as separate storage devices in bacula) and all go to one pool.
how can i get the copy job to copy from multiple disk storage devices to one tape library device?
thanks
Unfortunately, that’s a Bacula limitation. You CAN’T Migrate or Copy your Jobs from one Storage Daemon to another. Check this link, specifically the “Important Migration Consideration” section, the last item.
I just read elsewhere that if you purge your original tapes from the catalog that your copy was made up with, then Bacula will upgrade the copied tapes to recover from. Does this sound accurate?
(http://www.backupcentral.com/phpBB2/two-way-mirrors-of-external-mailing-lists-3/bacula-25/restore-knock-on-wood-from-copy-jobs-110864/)
Yes, that is accurate, BUT there is a better way that I’ve discovered recently: at the command line, pass the parameter “copies” to the restore command line that Bacula will use the Copy Tapes instead of the original ones. So, the command would look like this:
restore client=YourClientName copies
It works great…
Hei,
trying to implement this in an environment…
But I´m getting the following ERROR:
bacula-dir: ERRRO TEMRINATION at parce_conf.c:479
Could not find config Resource client.none referenced on line 189: client.none
Hi there.
It seems like you forgot to declare a Client Resource with the name “client.none”, or you misspelled it somewhere.
Send you bacula-dir.conf if you like some help.
Good luck!
Dear Rodrigo Reina, thanks for your answer.
I have fix that situation and now I’m stuck on the following Fatal error:
…………………………………………………………………………………………………..
22-Mar 14:46 maria-dir JobId 357: The following 1 JobId was chosen to be copied: 353
22-Mar 14:46 maria-dir JobId 357: Copying using JobId=353 Job=BackupDirector.2014-03-22_14.35.59_24
22-Mar 14:46 maria-dir JobId 357: Bootstrap records written to /var/lib/bacula/maria-dir.restore.2.bsr
22-Mar 14:46 maria-dir JobId 357: Start Copying JobId 357, Job=job.copyjob.2014-03-22_14.46.53_08
22-Mar 14:44 TSTSERVER-sd JobId 357: Fatal error: Device reservation failed for JobId=357:
22-Mar 14:46 maria-dir JobId 357: Fatal error:
Storage daemon didn’t accept Device “FileStorage” because:
3924 Device “FileStorage” not in SD Device resources.
…………………………………………………………………………………………………..
———————————————————————-
Note1: I can comunicate with my “remote bacula-sd”
———————————————————————-
Select daemon type for status (1-4): 2
The defined Storage resources are:
1: File
2: TSTFile
Select Storage resource (1-2): 2
Connecting to Storage daemon TSTFile at TSTSERVER:9103
TSTSERVER-sd Version: 5.0.0 (26 January 2010) x86_64-unknown-linux-gnu ubuntu 12.10
Daemon started 22-Mar-14 14:44, 1 Job run since started.
Heap: heap=135,168 smbytes=16,818 max_bytes=78,549 bufs=72 max_bufs=88
Sizes: boffset_t=8 size_t=8 int32_t=4 int64_t=8
Running Jobs:
No Jobs running.
====
Jobs waiting to reserve a drive:
====
Terminated Jobs:
JobId Level Files Bytes Status Finished Name
===================================================================
338 Full 0 0 Error 22-Mar-14 14:03 job.copyjob
337 Full 0 0 Error 22-Mar-14 14:03 job.copyjob
342 Full 0 0 Error 22-Mar-14 14:03 job.copyjob
341 Full 0 0 Error 22-Mar-14 14:03 job.copyjob
346 Full 0 0 Error 22-Mar-14 14:30 job.copyjob
345 Full 0 0 Error 22-Mar-14 14:30 job.copyjob
350 Full 0 0 Error 22-Mar-14 14:31 job.copyjob
349 Full 0 0 Error 22-Mar-14 14:31 job.copyjob
355 Full 0 0 Error 22-Mar-14 14:35 job.copyjob
357 Full 0 0 Error 22-Mar-14 14:44 job.copyjob
====
Device status:
Device “FileStorage2” (/backup_bacula_test_maria) is not open.
====
Used Volume status:
====
————————————————————————-
Note2: I and performance local backup/restores without problems.
————————————————————————-
/***********************************************************************************************************++
/* ———– CONFIG FILES ——————
/***********************************************************************************************************++
————————————————————————-
Bacula-sd (REMOTE STORAGE)
————————————————————————-
#
# Default Bacula Storage Daemon Configuration file
#
# For Bacula release 5.2.6 (21 February 2012) — ubuntu 12.10
#
# You may need to change the name of your tape drive
# on the “Archive Device” directive in the Device
# resource. If you change the Name and/or the
# “Media Type” in the Device resource, please ensure
# that dird.conf has corresponding changes.
Storage { # definition of myself
Name = TSTSERVER-sd
SDPort = 9103 # Director’s port
WorkingDirectory = “/var/lib/bacula”
Pid Directory = “/run/bacula”
Maximum Concurrent Jobs = 20
}
#
# List Directors who are permitted to contact Storage daemon
#
Director {
Name = maria-dir
Password = “TwdfrcyxrD7FU9yDS0Gk2kphDpSSxCUw9kSyJHvtR0Cr”
}
#
# Restricted Director, used by tray-monitor to get the
# status of the storage daemon
#
Director {
Name = maria-mon
Password = “O7UjKLymJJrjiiz3f611G1oyeUAz0fObxIGCuRC5698U”
Monitor = yes
}
#
# Devices supported by this Storage daemon
# To connect, the Director’s bacula-dir.conf must have the
# same Name and MediaType.
#
Device {
Name = FileStorage2 # This was what exist previously 20140322
Media Type = File
Archive Device = /backup_bacula_test_maria
LabelMedia = yes; # lets Bacula label unlabeled media
Random Access = Yes;
AutomaticMount = yes; # when device opened, read it
RemovableMedia = no;
AlwaysOpen = no;
#Maximum Network Buffer Size = 128000
#Maximum block size = 128000
}
#
# Send all messages to the Director,
# mount messages also are sent to the email address
#
Messages {
Name = Standard
director = maria-dir = all
}
Note: On /backup_bacula_test_maria permitions are 777:
drwxrwxrwx 2 bacula tape 4096 Mar 20 19:56 backup_bacula_test_maria
————————————————————————-
Bacula-dir
————————————————————————-
#
# Default Bacula Director Configuration file
#
# The only thing that MUST be changed is to add one or more
# file or directory names in the Include directive of the
# FileSet resource.
#
# For Bacula release 5.2.5 (26 January 2012) — ubuntu 12.04
#
# You might also want to change the default email address
# from root to your address. See the “mail” and “operator”
# directives in the Messages resource.
#
Director { # define myself
Name = maria-dir
DIRport = 9101 # where we listen for UA connections
QueryFile = “/etc/bacula/scripts/query.sql”
WorkingDirectory = “/var/lib/bacula”
PidDirectory = “/var/run/bacula”
Maximum Concurrent Jobs = 10 # Change from 1 to 10 due to the error is waiting on max Storage jobs
# that happen when running a copy job.
Password = “vOchjaYxGgFnKdbE5me5a3Tp5vs763FyoIhXdqUF733A” # Console password
Messages = Daemon
#DirAddress = 127.0.0.1 #Evitar que o director apenas aceite ligacoes na interface loopback permitindo assim ligacoes dos nossos clientes
}
# Definicoes de Clientes e Jobs
@/etc/bacula/bacula-dir-clients-and-jobs.conf
# Definicoes de arquivos para backup
@/etc/bacula/bacula-dir-filesets.conf # Filesets pois podemos ter mais do que 1 fileset
Schedule {
Name = “WeeklyCycle”
Run = Full 1st sun at 23:05
Run = Differential 2nd-5th sun at 23:05 # Todos os domingos excepto o 1 de cada mes
Run = Incremental mon-sat at 23:05
}
#step 7
Schedule {
Name = “TSTWeeklyCycle”
Run = Incremental sat at 20:05 # Ao sabado corre
}
# Agendamento dos backups do catalogo. Feito sempre depois dos backups
Schedule {
Name = “WeeklyCycleAfterBackup”
Run = Full sun-sat at 23:10
}
# Dispositivo de armazenamento
Storage {
Name = File
# Do not use “localhost” here
Address = backups.scma.pt # N.B. Use a fully qualified name here
SDPort = 9103
Password = “iibe_Uioa5dvFyVURE53p5KP4SuUpxnqW”
Device = FileStorage
Media Type = File
}
# Adding remote TSTServer to the maria director. This is made to test adding a storage a remote storage.
# check mywiki documentation
# step 2 (step3 is adding TSTSERVER on the maria hosts)
Storage {
Name = TSTFile
Address = TSTSERVER
SDPort = 9103
Password = “TwdfrcyxrD7FU9yDS0Gk2kphDpSSxCUw9kSyJHvtR0Cr”
Device = FileStorage2
Media Type = File
}
# Generic catalog service
Catalog {
Name = MyCatalog
# Uncomment the following line if you want the dbi driver
# dbdriver = “dbi:sqlite3”; dbaddress = 127.0.0.1; dbport =
dbname = “bacula”; DB Address = “”; dbuser = “bacula”; dbpassword = “y5R0T3q4HzZq”
}
# Reasonable message delivery — send most everything to email address
# and to the console
Messages {
Name = Standard
#
# NOTE! If you send to two email or more email addresses, you will need
# to replace the %r in the from field (-f part) with a single valid
# email address in both the mailcommand and the operatorcommand.
# What this does is, it sets the email address that emails would display
# in the FROM field, which is by default the same email as they’re being
# sent to. However, if you send email to more than one address, then
# you’ll have to set the FROM address manually, to a single address.
# for example, a ‘no-reply@mydomain.com’, is better since that tends to
# tell (most) people that its coming from an automated source.
#
mailcommand = “/usr/lib/bacula/bsmtp -h localhost -f \”\(Bacula\) \\” -s \”Bacula: %t %e of %c %l\” %r”
operatorcommand = “/usr/lib/bacula/bsmtp -h localhost -f \”\(Bacula\) \\” -s \”Bacula: Intervention needed for %j\” %r”
mail = root@localhost = all, !skipped
operator = root@localhost = mount
console = all, !skipped, !saved
#
# WARNING! the following will create a file that you must cycle from
# time to time as it will grow indefinitely. However, it will
# also keep all your messages if they scroll off the console.
#
append = “/var/lib/bacula/log” = all, !skipped
catalog = all
}
#
# Message delivery for daemon messages (no job).
Messages {
Name = Daemon
mailcommand = “/usr/lib/bacula/bsmtp -h localhost -f \”\(Bacula\) \\” -s \”Bacula daemon message\” %r”
mail = root@localhost = all, !skipped
console = all, !skipped, !saved
append = “/var/lib/bacula/log” = all, !skipped
}
# Default pool definition
Pool {
Name = File_tst # O Job de backup por padrao aponta para o file
Pool Type = Backup
Recycle = yes # Bacula can automatically recycle Volumes
AutoPrune = yes # Prune expired volumes
Volume Retention = 1 month # 1 mes
Volume Use Duration = 23 hours # duracao de uma volume aberto
Maximum Volume Bytes = 100Mb # Tamanho maximo de um volume
Maximum Volumes = 9 # Volume Bytes (100Mb) * Volumes (9) <= tamanho maximo do disco (no nosso caso é de 905M)
# Assim temos 100Mb*9=900MB <= 905MB disponiveis no nosso sdb1 (mnt/backups)
LabelFormat = "vol" # Este label é muito importante pois permite ao nosso bacula colocar nomes auto nos volumes
# Vai criando vol0001 ; vol00002 ……
Next Pool = TstFile # Step 4 of adding a remote pool TSTFILE
}
# step 1
Pool {
Name = TstFile
Pool Type = Backup
Storage = TSTFile
Volume Use Duration = 1 day
Volume Retention = 6 months
# Scratch Pool = scratch.TSTFile # Tenho de avaliar melhor esta questão:w
# RecyclePool = scratch.TSTFile
File Retention = 1 year
Job Retention = 1 year
Cleaning Prefix = "CLN"
}
# Adding remote TSTServer to the maria director. This is made to test adding a storage a remote storage.
# check mywiki documentation
# step 5
#For a Copy Job, the parameters “Client” and “FileSet” really don’t matter at all. They are just there because the “Job” entry requires them. That’s it.
#What matter is:
#Type: use the special keyword “Copy”;
#Pool: which Pool the Jobs will be copied FROM (the Pool it self tells where they will be copied TO, with the “Next Pool” directive);
#Selection Type: the option “PoolUncopiedJobs” basically tells Bacula to Copy all Jobs on this Pool that yet has not been copied before;
#
Job {
Name = job.copyjob
Type = Copy
Pool = File_tst # which Pool the Jobs will be copied FROM. Our Case the pool file have the backup files
Selection Type = PoolUncopiedJobs
# Messages = msg.default
Messages = Standard
Schedule = "TSTWeeklyCycle" #sch.none
#Client = client.none
Client = TSTFile-fd
#FileSet = fs.none
FileSet = "Full Set TST"
#Storage = TSTFile
Storage = File
}
Client {
Name = TSTFile-fd
Address = TSTSERVER
Password = "0LH28Guy00xHTBVtI8RQXacAFTJywDZH0Qn1/NBmfoy/"
@/etc/bacula/basic-client.conf
}
FileSet {
Name = "Full Set TST"
Include {
Options {
signature = MD5
compression = GZIP9
IgnoreCase = yes
}
# Plugin = "C:\\Program Files\\Bacula\\Plugins"
# File = "C:\\path_under_backup"
}
}
#Step 6 – Change Storage on the TSTServer (add this info to the mywiki pag )
# Scratch pool definition
Pool {
Name = Scratch
Pool Type = Backup
}
#
# Restricted console used by tray-monitor to get the status of the director
#
Console {
Name = maria-mon
Password = "k55_ecdHfYmiX_da–YREGpoWyeOiv3-N"
CommandACL = status, .status
}
Dear Rodrigo Reina, thanks for your help. My problem was previously answered by you “You CAN’T Migrate or Copy your Jobs from one Storage Daemon to another” and I have not process well that information :(. So I was use nfs (http://en.wikipedia.org/wiki/Network_File_System) to be able to have a remote copy.