É garantido que os sistemas de arquivos aninhados são sincronizados antes dos sistemas de arquivos que contêm o sync (1)?

4

Eu tenho um ext4 luks-criptografado em um arquivo que eu uso para armazenar dados sensíveis (vamos chamar isso de FS "interna"). O arquivo em si é novamente em outro ext4, que reside em um SSD físico. Vamos chamar isso de FS "exterior". O Inner FS é montado usando um dispositivo de loopback apontando para o arquivo no FS Externo.

Quando eu invoco sync (1), é garantido que todas as escritas pendentes do Inner FS são persistentes?

Se a sincronização ocorrer em uma ordem infeliz, seria (no meu entender) possível que ocorra o seguinte:

  1. Os dados são gravados no Inner FS.
  2. sync invocado.
  3. Gravações externas em cache do FS são gravadas no disco.
  4. As gravações em cache do Inner FS são gravadas no arquivo no FS Externo.
  5. As gravações do Inner FS no Outer FS ainda estão armazenadas em cache.
  6. Bater acontece.
  7. As gravações no Inner FS são perdidas apesar de acontecer antes de a sync .

A sincronização garante que isso não aconteça, ou eu preciso invocar a sincronização quantas vezes eu aninhar camadas de sistemas de arquivos para ter certeza?

Estou pedindo o Linux, mas se o POSIX tiver uma palavra sobre isso, também me interessaria por isso.

A página de man do Debian em sync(1) ou sync(2) infelizmente não tem informações sobre este caso.

    
por Jonas Schäfer 20.06.2018 / 08:32

2 respostas

3

Sim, é garantido.
Você não diz explicitamente como está fazendo o sistema de arquivos aninhado, mas vou assumir que está usando um dispositivo de loopback de blocos.

Neste caso, o bit da chave pode ser visto aqui no código fonte do kernel :

static int lo_req_flush(struct loop_device *lo, struct request *rq)
{
    struct file *file = lo->lo_backing_file;
    int ret = vfs_fsync(file, 0);
    if (unlikely(ret && ret != -EINVAL))
        ret = -EIO;

    return ret;
}

Anote a chamada para vfs_fsync(file, 0) . Isso significa que o driver de loopback está invocando explicitamente uma sincronização no arquivo que está fazendo o backup do dispositivo de bloco de loopback.

    
por 20.06.2018 / 15:01
0

Não há concessão na ordem, 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, por isso, deve emitir mais do que uma chamada de sincronização no seu caso.

    
por 20.06.2018 / 09:21