Em nosso servidor, temos um cron job que chama regularmente chown
e chmod
para um diretório em um sistema de arquivos ZFS. Normalmente, isso não altera o usuário e os direitos porque o diretório já tem os mesmos atributos.
Há outra tarefa cron que cria regularmente um instantâneo deste sistema de arquivos.
No Natal, eu estava sozinho no escritório, então não deveria ter havido alterações no servidor, mas descobri que os instantâneos do ZFS não estavam vazios.
Os seguintes atributos foram definidos para o pool e o conjunto de dados:
compression=on (lz4)
atime=off
xattr=sa
acltype=posixacl
Por que o instantâneo não está vazio se a chamada chown
and chmod
não altera nada?
Existe alguma maneira de evitar isso?
(Não, não posso desabilitar essa tarefa cron.)
A razão pela qual isso está acontecendo é devido a uma combinação de duas coisas.
Ao usar chmod para definir as permissões para o que elas já são (forçando), chmod imprime uma mensagem, mas na verdade ainda executa a chamada para definir o modo alterado no arquivo. Podemos ver isso com strace
Observe na linha 31 acima a chamada para
fchmodat()
. Isso faz com que o sistema operacional grave novos bits de modo no inode. O ZFS mantém informações do inode como todas as outras informações dentro do zpool, e também é copy-on-write. O bloco é lido, modificado e então gravado de volta no disco, e os metadados são cascateados para o nó raiz.Essa é a mudança que fica visível no instantâneo, mesmo que nenhuma mudança real seja necessária.
Dependendo da implementação real do chmod, isso pode ou não acontecer em outros sistemas operacionais.
EDIT: Removido o comentário sobre o rastreamento de tempo, pois a pergunta informa que ele já está desabilitado.
Mas eles fazem. Se você reescrever os valores anteriores, eles ainda serão escritos e a entrada do arquivo será escrita. Isso é uma mudança.
Para evitar essas alterações "nulas", você precisa ler os valores atuais, compará-los com o estado desejado e escrever somente se uma alteração for necessária.
Como @paladin destacou, provavelmente existe uma maneira muito melhor de lidar com permissões de arquivo.