Estou trabalhando em um pequeno script de backup usando robocopy e hardlinks. Meu objetivo é ter backups diferenciais usando conceito semelhante ao --link-dest
do rsync sem precisar recorrer a ferramentas de terceiros. Para aqueles que não estão familiarizados, o conceito é que o primeiro backup seja considerado completo, e os backups subseqüentes vinculem arquivos inalterados do backup anterior usando hardlinks e copiem apenas os arquivos que foram alterados, deixando vários backups completos diretórios de backup point-in-time, ocupando muito menos espaço em disco (devido ao hardlinking) do que os backups completos.
Meu problema é que, sempre que eu participo um arquivo, o robocopy relata o arquivo com link físico como modificado , embora eu presumivelmente não o tenha alterado de nenhuma maneira. No começo, suspeitei que o tempo de acesso poderia ter mudado, mas esse não é o caso, pois o arquivo é reportado como modificado apenas quando tento copiar ACLs ou informações do proprietário ( /COPY:S
ou /COPY:O
).
É assim que eu estou tentando fazer isso:
Tenha uma estrutura de diretório de origem que você queira copiar
mkdir C:\BackupSource
type nul > C:\BackupSource\myfile.txt
Tenha um diretório raiz de destino para backup
mkdir C:\BackupTarget
Execute o primeiro backup completo
Estou usando mais sinalizadores no script, mas eles são suficientes para acionar o comportamento.
robocopy C:\BackupSource C:\BackupTarget /MIR /COPY:DATSO
Verifique se os arquivos estão atualizados. (não faz parte do roteiro, apenas por causa da pergunta)
robocopy C:\BackupSource C:\BackupTarget /MIR /COPY:DATSO /L
Isso me diz que o arquivo foi pulado, o que faz sentido porque neste ponto ele não foi modificado.
Crie uma estrutura de diretórios para backup subseqüente. Isso criará uma estrutura de diretório vazia idêntica ao backup anterior. Estou atravessando o backup anterior e criando os hardlinks na próxima etapa.
robocopy C:\BackupTarget C:\BackupTarget /MIR /CREATE /DCOPY:DAT /XF *
Hardlink the files
Esta parte é obviamente um pouco mais complicada no script quando desce para os subdiretórios, mas um arquivo é suficiente para o propósito da questão.
mklink /H C:\BackupTarget\myfile.txt C:\BackupTarget\myfile.txt
Agora, neste momento, acho que não fiz nenhuma modificação nos arquivos em nenhum dos diretórios. A documentação da função CreateHardLinkW (que é a que eu m realmente usando no script) diz
The security descriptor belongs to the file to which a hard link points...
You cannot give a file different security descriptors on a per-hard-link basis...
This function does not modify the security descriptor of the file to be linked to ...
No entanto, quando eu agora verifico se o arquivo foi modificado, o robocopy informa que tanto o hardlink quanto o arquivo do backup original para o qual ele aponta foram modificados.
robocopy C:\BackupSource C:\BackupTarget /MIR /COPY:DATSO /L
robocopy C:\BackupSource C:\BackupTarget /MIR /COPY:DATSO /L
Eu verifiquei os atributos padrão, horários de criação / modificação / acesso, ACLs e proprietário, e eles são exatamente os mesmos. Se eu usar apenas /COPY:DAT
(que é o padrão), o robocopy me diz que não houve modificações, o que me leva a acreditar que o hardlinking faz alterar algo nos descritores de segurança.
Quando executo o comando para backup subsequente, como faria normalmente
robocopy C:\BackupSource C:\BackupTarget /MIR /COPY:DATSO
O robocopy me diz que modificou todos os meus arquivos, mas eu suponho que ele consertou apenas os descritores de segurança, já que o backup é muito mais rápido que o primeiro completo. Além disso, quando eu verificar o hardlink com
fsutil hardlink list C:\BackupTarget\myfile.txt
relata que o arquivo ainda é um hardlink apontando para o mesmo arquivo que eu apontei antes. Pode parecer que o problema é puramente estético, mas quando o robocopy relata todos os arquivos modificados em cada backup, o valor de tais logs é bastante reduzido.
Por que o robocopy acha que os descritores de segurança de um arquivo foram modificados quando aponto um link para ele? Como posso preveni-lo ou corrigi-lo após o hardlinking e antes que a robocopy subseqüente seja iniciada?