Estou procurando um utilitário de backup com backups incrementais, mas de uma maneira mais complicada.
Eu tentei rsync, mas não parece ser capaz de fazer o que eu quero, ou mais provavelmente, eu não sei como fazer isso.
Então este é um exemplo do que eu quero alcançar com isso. Tenho os seguintes arquivos:
testdir
├── picture1
├── randomfile1
├── randomfile2
└── textfile1
Eu quero executar o utilitário de backup e basicamente criar um arquivo (ou um tarball) de todos esses arquivos em um diretório diferente:
$ mystery-command testdir/ testbak
testbak
└── 2020-02-16--05-10-45--testdir.tar
Agora, digamos que no dia seguinte, eu adicione um arquivo, de modo que minha estrutura se pareça com:
testdir
├── picture1
├── randomfile1
├── randomfile2
├── randomfile3
└── textfile1
Agora, quando executo o comando misterioso, obterei outro tarball para esse dia:
$ mystery-command testdir/ testbak
testbak
├── 2020-02-16--05-10-45--testdir.tar
└── 2020-02-17--03-24-16--testdir.tar
Aqui está o kicker: eu quero que o utilitário de backup detecte o fato de que picture1
, randomfile1
, randomfile2
e textfile1
não foram alterados desde o último backup, e apenas faça backup dos arquivos novos/alterados, que neste caso é randomfile3
, de modo que:
tester@raspberrypi:~ $ tar -tf testbak/2020-02-16--05-10-45--testdir.tar
testdir/
testdir/randomfile1
testdir/textfile1
testdir/randomfile2
testdir/picture1
tester@raspberrypi:~ $ tar -tf testbak/2020-02-17--03-24-16--testdir.tar
testdir/randomfile3
Então, como último exemplo, digamos que no dia seguinte eu mudei textfile1
e adicionei picture2
e picture3
:
$ mystery-command testdir/ testbak
testbak/
├── 2020-02-16--05-10-45--testdir.tar
├── 2020-02-17--03-24-16--testdir.tar
└── 2020-02-18--01-54-41--testdir.tar
tester@raspberrypi:~ $ tar -tf testbak/2020-02-16--05-10-45--testdir.tar
testdir/
testdir/randomfile1
testdir/textfile1
testdir/randomfile2
testdir/picture1
tester@raspberrypi:~ $ tar -tf testbak/2020-02-17--03-24-16--testdir.tar
testdir/randomfile3
tester@raspberrypi:~ $ tar -tf testbak/2020-02-18--01-54-41--testdir.tar
testdir/textfile1
testdir/picture2
testdir/picture3
Com este sistema, eu economizaria espaço apenas fazendo backup das alterações incrementais entre cada backup (com obviamente o backup mestre que tem todos os arquivos iniciais), e teria backups das alterações incrementais, por exemplo, se eu fizesse uma alteração no dia 2, e alterei a mesma coisa novamente no dia 3, ainda consigo obter o arquivo com a alteração do dia 2, mas antes da alteração do dia 3.
Eu acho que é meio como o GitHub funciona :)
Eu sei que provavelmente poderia criar um script que executasse um diff e selecionasse os arquivos para backup com base no resultado (ou mais eficientemente, basta obter uma soma de verificação e comparar), mas quero saber se há algum utilitário que possa fazer isso ta mais facil :)
rsync
is precisely that program that copies based on a diff. By default, it copies only when there is a difference in last-modified time or size, but it can even compare by checksum with-c
.The trouble here is that you're
tar
'ing the backups. This becomes easier if you don't do that. I don't even know why you're doing it. It might make sense if you're compressing them, but you're not even doing that.The Wikipedia article for Incremental Backups has an example
rsync
command that goes roughly:What it does is to hardlink files from the previous backup when they are unchanged from the source. There's also
--copy-dest
if you want it to copy instead (it's still faster when$dst
is a remote or on a faster drive).If you use a filesystem with subvolumes like btrfs, you can also just snapshot from the previous backup before rsync'ing. Snapshots are instantaneous and don't take additional space[1].
Or if you're using a filesystem that supports reflinks, then you can also do that. Reflinks are done by making a new inode but referring to the same blocks as the source file, implementing COW support. It's still faster than regular copy because it doesn't read and write the data, and it also doesn't take additional space[1].
Anyway, once having done something like that you can just do a regular
rsync
to copy the differences:Though, you might want to add
--delete
, which would cause rsync to delete files from the destination that are no longer present in the source.Another useful option is
-i
or--itemize-changes
. It produces succinct, machine readable output that describes what changes rsync is doing. I normally add that option and pipe like:to keep record of the changes via easily
grep
able files. The|&
is to pipe both stdout and stderr.The
-P
is short for--partial
and--progress
.--partial
keeps partially transferred files, but more importantly--progress
reports per-file progress.How this compares to archiving changes with tar
The above solutions result in directories that seem to hold everything. Even though that's the case, in total for any amount/frequency of backups, they would occupy around the same amount of space as having plain tar archives with only changes. That's because of how hardlinks, reflinks, and snapshots work. The use of bandwidth when creating the backups would also be the same.
The advantages are:
foo
, mark itfoo.DELETED
or do something complicated. I've never used duplicity for example, but looking at its documentation, it seems it encodes deletions by adding an empty file of the same name in the new tar and holding the original signature of the file in a separate .sigtar file. I imagine it compares the original signature with that of an empty file to differentiate between a file deletion and a change to an actual empty file.If one still wants to setup each backup as only holding the files that are different (added or modified), then one can use the
--link-dest
solution described above and then delete the hardlinks using something like the following:[1] Strictly speaking, they do use additional space in the form of duplicate metadata, like the filename and such. However, I think anyone would consider that insignificant.
Although
tar
does have an incremental mode there are a couple of more comprehensive tools to do the job:They not only support incremental backups, it's easy to configure a schedule on which a full backup needs to be taken. For example in
duplicity
:duplicity --full-if-older-than 1M
will make sure a full backup has run. They also support going back in time to a specific file, with plain tar you'll have to go through all incremental files till you found one which contains the right file.Additionally they do support encryption and uploading to a variety of backends (like sftp, blob storage, etc). Obviously if you encrypt, don't forget to make a good backup of your keys to a secondary backup!
Another important aspect is that you can verify the integrity of your backups, ensuring you can restore, eg using
duplicity verify
.I would negatively advise on a git based backup strategy. Large restores take significant time.
E por que você não está se considerando
git
?A estratégia que você descreve, após um backup completo e dois incrementais, tem suas complicações quando você continua. É fácil cometer erros e pode se tornar muito ineficiente, dependendo das mudanças. Teria que haver uma espécie de rodízio, ou seja, de vez em quando você faz um novo backup completo - e depois quer manter o antigo ou não?
Dado um diretório de trabalho "testdir" contendo algum projeto (arquivos e subdiretórios),
git
torna por padrão um.git
subdiretório oculto para os dados. Isso seria para os recursos de controle de versão locais e adicionais . Para backup, você pode arquivá-lo/copiá-lo para uma mídia ou cloná-lo via rede.O controle de revisão que você obtém (sem pedir) é um efeito colateral do armazenamento diferencial do git.
Você pode deixar de fora toda a bifurcação/ramificação e assim por diante. Isso significa que você tem uma ramificação chamada "mestre".
Antes de fazer o commit (na verdade, gravar no git archive/repo), você precisa configurar um usuário mínimo para o arquivo de configuração. Então você deve primeiro aprender e testar em um subdiretório (talvez tmpfs). O Git é tão complicado quanto o tar, às vezes.
Enfim, como diz um comentário: fazer backup é fácil, o difícil é restaurar.
As desvantagens do git seriam apenas a pequena sobrecarga/exagero.
As vantagens são: o git rastreia o conteúdo e os nomes dos arquivos. Ele salva apenas o necessário, com base em um diff (pelo menos para arquivos de texto).
Exemplo
Eu tenho 3 arquivos em um dir. Depois
git init
,git add .
egit commit
eu tenho um.git
dir de 260K.Então eu
cp -r .git /tmp/abpic.git
(um bom lugar para salvar um backup:). Eurm
o jpg de 154K, e também altero um arquivo de texto. eu tambémrm -r .git
.Antes de restaurar os arquivos, posso obter as diferenças precisas:
Aqui eu quero seguir a
git restore
dica.Depois
git --git-dir=/tmp/abpic.git/ restore \*
:O jpeg está de volta e o arquivo de texto não
btext
foi atualizado (mantém o carimbo de data/hora). As modificações em são sobrescritas.atext
Para reunir o repositório e o diretório (de trabalho), basta copiá-lo de volta.
Os arquivos no diretório atual são idênticos ao
.git
arquivo (após orestore
). Novas alterações serão exibidas e podem ser adicionadas e confirmadas, sem qualquer planejamento. Você só precisa armazená-lo em outra mídia, para fins de backup.Depois que um arquivo é modificado, você pode usar
status
oudiff
:E assim como
git
sabe sobre "+more" no arquivo 'btext', ele também armazenará essa linha de forma incremental.Após
git add .
(ougit add btext
) ostatus
comando muda de vermelho para verde ecommit
fornece a informação.E você pode realmente acessar o conteúdo, de alguma forma:
E então os primeiros 4 dígitos de hash hexadecimal
Para viajar de volta no tempo por um commit é:
O blob do btext tem um hash diferente antes do último commit, os outros têm o mesmo.
Uma visão geral seria:
Em vez de arquivos tar com data e hora manualmente, você tem commits com uma mensagem e data (e um autor). Logicamente anexados a esses commits estão as listas de arquivos e o conteúdo.
Simples
git
é 20% mais complicado do quetar
, mas você obtém 50% mais funcionalidades decisivas dele.Eu queria fazer a terceira alteração do OP: alterar um arquivo mais dois novos arquivos de 'imagem'. Eu fiz, mas agora eu tenho:
Então, o que o Cara do Seu Nome fez exatamente, em seus dois commits, pouco antes das 18h?
Os detalhes do último commit são:
E para verificar o penúltimo commit, cuja mensagem anuncia duas fotos:
Isso aconteceu porque tentei
git commit -a
atalhogit add .
e os dois arquivos eram novos (não rastreados). Ele apareceu em vermelho comgit status
, mas como eu disse git não é menos complicado que tar ou unix."Your debutante just knows what you need, but I know what you want" (or the other way round. Point is it's not always the same)
Atualizar:
Por favor, veja algumas advertências aqui: É possível usar o tar para backups completos do sistema?
De acordo com essa resposta, a restauração de backups incrementais com tar é propensa a erros e deve ser evitada. Não use o método abaixo, a menos que tenha certeza absoluta de que pode recuperar seus dados quando precisar.
De acordo com a documentação, você pode usar a opção -g/--listed-incremental para criar arquivos tar incrementais, por exemplo.
Então da próxima vez faça algo como
Onde data.inc são seus metadados incrementais e DATE-data.tar são seus arquivos incrementais.
I recommend
star
for incremental backups, sincestar
has been verified to reliably support incremental dumps and restores. The latter is what does not work with GNU tar when you rename directories even though it is advertized since 28 years.Please read the
star
man page at http://schilytools.sourceforge.net/man/man1/star.1.htmlThe section about incremental backups is currently starting at page 53.
To download the source, get the schilytools tarball from http://sourceforge.net/projects/schilytools/files/
Check Is it possible to use tar for full system backups? for a verification of the GNU tar bug.
I would recommend you get a look at Borg Backup.
This will handle backups that:
Are deduplicated. This indirectly makes it differential backups, but has more advantages:
Are compressed
It will manage pruning of old backups using rules such as "keep one daily backup for a week, one weekly backup for a month, one monthly backup for a year"
It's really easy to set up and use.
Take a look at restic. It does incremental back ups using an algorithm called deduplication. It's also very easy to use so its great for a beginner or advanced command line user.
Você pode tentar o BackupPC .
Ele permite backups incrementais, você pode decidir com que frequência fazê-los, quantos manter e, ao olhar para eles, pode vê-los consolidados ou apenas o backup incremental real. Também deduplica arquivos completos, caso estejam presentes em diferentes backups do mesmo ou de diferentes hosts.
Provavelmente já está empacotado para sua distribuição.
This is not exactly what you are requesting, because it doesn't use tar. But it does use rsync, and it has worked very well for me. On of the abilities that I really like is the ability to drop incremental restore points over time without loosing points before or after the one I am dropping. This allows me to, for example, have daily backups for the last 2 weeks, then thin those out once they get 2 weeks old so they are weekly for a couple months, then further thin those out until they are monthly for a quarter or two, then thin those out to about quarterly over the timespan of years. I have a python script that I can share that can prune these automatically if you want. (Obviously, it comes with NO WARRANTY as letting a computer automatically delete backups sounds a bit scary.)
What I do is use a ZFS pool & filesystem for storing backups. With the ZFS filesystem, which is (thankfully!) now usable on linux, you can take snapshots. When you write to a filesystem that has been snapshotted, it (smartly) writes a new version of only the changed blocks, thus making it an incremental backup. Even easier is that all of your snapshots can be mounted as a full (read only) Unix filesystem, that you can use all of your normal tools on to look at and copy from. Want to see what that file looked like 2 months ago? Just cd to the right folder and use less or vim or whatever to look at it. Want to see when a (hacked) wordpress install you were backing up went off the rails? Just do a grep for an identifying mark with something like
grep -in /zfsbackup/computername/.zfs/snapshots/*/var/www/html/wp-config.php" "somebadstring"
You can even use Linux's LUKS system to do disk encryption and then present the mapped device as "drives" to ZFS, giving you an encrypted backup.
If you ever need to migrate your backups to a new drive, you can use zfs send & receive to move the entire filesystem.
It has been a year or two since I've set it up (I just keep adding on incremental backups and haven't needed to upgrade my backup drive for a while), so these will be rough instructions. Bear with me, or better yet, edit them.
First, make sure you have zfs, rsync, and, if you want to encrypt your backups, the LUKS tools installed.
First, create any partition layout you might want on your backup drive. (You may want to make a small unencrypted partition that has scripts for running the backup.)
Then, if you want disk encryption, encrypt the partition with LUKS (example assumes a backup drive of /dev/sde and a partition /dev/sde2 since /dev/sde1 is probably scripts):
(Put in a nice strong passphrase).
If you are doing disk encryption, now you need to open the volume:
(Now an unencrypted version of the raw device should be available (mapped) at /dev/mapper/zfsbackuppart1).
Now, create you ZFS pool (group of drive(s) holding data, multiple drives/devices can be used for RAID if you wish):
This will create a ZFS pool named "zfsbackup".
Now, create a filesystem for each machine you are backing up:
And create a folder for each partition you want to back up from the source machine:
Then, use rsync to copy files to there:
Take a snapshot:
To disconnect the drive when you are done:
And to set it up when taking another backup in the future, before the above rsync commands:
Let me know if you need more info on this approach, or are interested in a script to thin out backups as they get farther back in time.
And, yes, you can backup a whole system this way -- you just have to create partitions/filesystems (which don't have to match the original layout -- a great way to migrate stuff!), tweak /etc/fstab, and install GRUB & have it rescan/rebuild the GRUB config.
Uma possibilidade é o AMANDA, o Advanced Maryland Automatic Network Disk Archiver , que entre muitos outros recursos, também suporta backups incrementais.