existe uma maneira de mover atomicamente o arquivo e o diretório de tempfs para a partição ext4 no eMMC

2

Temos uma placa personalizada com base em beaglebone com 256 MB de RAM e 4 GB de eMMC. Placa executa o kernel Linux 4.9

estamos correndo para uma situação onde criamos um arquivo em tempfs e depois da validação, temos que movê-lo para a partição ext4 do eMMC. Arquivar nada, mas um certificate

em algumas situações, temos vários certs em um diretório, então temos que mover todo o diretório de tempfs para a partição ext4 no eMMC.

Portanto, um dos problemas que nos preocupa é a operação atomicity of mv (move).

De acordo com a chamada de sistema rename , o arquivo de renomeação da página de manual do Linux é uma operação atômica. link

No entanto, não temos certeza se renomear a operação envolve mover arquivos entre dois sistemas de arquivos, a atomicidade ainda está disponível ou não. Então a questão é Está movendo o arquivo de tmpfs para ext4 atomic?

Obviamente, uma solução possível é manter os arquivos em uma pasta diferente na mesma partição (no mesmo sistema de arquivos, obviamente) e renomeá-la usando mv . Para o diretório usando a abordagem abaixo de renomear

SRC_dir  --> TMP_DEST_dir
DEST_dir --> BAK_DEST_dir
TMP_DEST_dir --> DEST_dir
delete BAK_DEST_dir

Alguma sugestão para alternativas?

EDITAR
Depois que eu recebi a resposta eu tentei seguir o código de teste no quadro,

#include <stdio.h>
#include <errno.h>

int main()
{
    int retcode = 0;

    system("touch /tmp/rename_test");

    retcode = rename("/tmp/rename_test", "/home/fs_rename_test");

    if ( retcode < 0) {
        printf("errno : %d\n",errno );
        perror("Error occurred while renaming file");
        return 1;
    }

    return 0;
}

Que retornou após a saída. E confirmou que a renomeação não funciona entre sistemas de arquivos.

errno : 18
Error occurred while renaming file: Invalid cross-device link
    
por AnkurTank 26.06.2018 / 21:04

1 resposta

3

Is moving file from tmpfs to ext4 atomic?

Não. Renomeadas, como tal, funcionam apenas dentro de um sistema de arquivos. A página de manual para rename(2) menciona explicitamente o erro retornado ao tentar renomear os pontos de montagem:

EXDEV oldpath and newpath are not on the same mounted filesystem.

As transferências entre os sistemas de arquivos precisam ser feitas como uma combinação de uma cópia e uma exclusão. mv fará isso para você se o rename() não funcionar, mas não será atômico nesse caso.

A maneira simples de contornar isso seria, de fato, primeiro copiar o arquivo para um local temporário no mesmo sistema de arquivos. Em geral, é mais simples colocar o arquivo temporário no mesmo diretório que o destino final, já que esse é o único lugar que tem garantia de estar no mesmo sistema de arquivos. Claro que isso requer que qualquer processo que trabalhe nos arquivos tenha alguma lógica para ignorar o temporário baseado em seu nome.

Aproximadamente, algo assim deve funcionar para um arquivo:

cp /src/filename /dst/filename.tmp &&
mv /dst/filename.tmp /dst/filename &&
rm /src/filename

Note que o processo que você descreve para um diretório é essencialmente isto:

cp -r /src/dir /dst/dir.tmp && 
mv /dst/dir /dst/dir.bak    &&
mv /dst/dir.tmp /dst/dir    &&
rm -r /dst/dir.bak

O que não é ruim, mas não é atômico. Há um momento entre as duas execuções de mv (ou chamadas para rename() ), quando /dst/dir não existe. Isso poderia ser resolvido acessando o diretório por meio de um link simbólico, já que o link pode ser substituído atomicamente por uma renomeação.

    
por 26.06.2018 / 22:03