Eu tenho um ext4 criptografado com luks em um arquivo que uso para armazenar dados confidenciais (vamos chamar isso de FS "interno"). O arquivo em si está novamente em outro ext4, que reside em um SSD físico. Vamos chamar esse FS de "externo". O Inner FS é montado usando um dispositivo de loopback apontando para o arquivo no Outer FS.
Quando invoco o sync(1), é garantido que todas as gravações pendentes do Inner FS sejam persistidas?
Se a sincronização acontecer em uma ordem infeliz, seria (no meu entendimento) possível que acontecesse o seguinte:
- Os dados são gravados no FS interno.
sync
invocado.- As gravações em cache do FS externo são gravadas no disco.
- As gravações em cache do FS interno são gravadas no arquivo no FS externo.
- As gravações do FS interno no FS externo ainda estão nos caches.
- Acidente acontece.
- As gravações no Inner FS são perdidas apesar de acontecerem antes de um arquivo
sync
.
A sincronização garante que isso não aconteça ou tenho que invocar a sincronização quantas vezes tiver camadas aninhadas de sistemas de arquivos para ter certeza?
Estou pedindo Linux, mas se o POSIX tiver uma palavra sobre isso, eu também estaria interessado nisso.
A página de manual do Debian sync(1)
ou sync(2)
infelizmente não tem informações sobre este caso.
Sim, é garantido.
Você não declara explicitamente como está fazendo o sistema de arquivos aninhado, mas vou assumir que você está usando um dispositivo de loopback de bloco.
Nesse caso, o bit da chave pode ser visto aqui no código-fonte do kernel :
Observe a chamada para
vfs_fsync(file, 0)
. Isso significa que o driver de loopback está invocando explicitamente uma sincronização no arquivo que está apoiando o dispositivo de bloco de loopback.Não há concessão no pedido, mas a maneira mais provável é que o kernel atravesse a tabela de montagem quando
sync(2)
foi chamado. Esse método é usado pelo Solaris e provavelmente também é usado pelo Linux.Isso parece ser o que você não gosta, portanto, deve emitir mais do que uma chamada de sincronização no seu caso.