eMMC의 tempfs에서 ext4 파티션으로 파일과 디렉터리를 원자적으로 이동하는 방법이 있습니까?

eMMC의 tempfs에서 ext4 파티션으로 파일과 디렉터리를 원자적으로 이동하는 방법이 있습니까?

우리는 256MB RAM과 4GB eMMC를 갖춘 비글본 블랙 기반의 맞춤형 보드를 보유하고 있습니다. 마더보드는 Linux 커널 4.9를 실행합니다.

tempfs파일을 생성한 다음 확인 후 eMMC의 ext4 파티션으로 이동해야 하는 상황이 있습니다 . 하나만 보관하세요certificate

어떤 경우에는 한 디렉터리에 여러 인증서가 있으므로 전체 디렉터리를 tempfs에서 eMMC의 ext4 파티션으로 이동해야 합니다.

그래서 우리가 가지고 있는 우려 사항 중 하나는 atomicity( mv모바일) 운영입니다.

rename시스템 호출 에 따르면 Linux 매뉴얼 페이지에서 파일 이름을 바꾸는 것은 원자적 작업입니다.http://man7.org/linux/man-pages/man2/rename.2.html

그러나 이름 바꾸기 작업에 두 파일 시스템 간에 파일을 이동하는 경우 원자성을 계속 사용할 수 있는지 여부는 확실하지 않습니다. 그렇다면 문제는 파일을 원자에서 원자로 이동하는 것 tmpfs입니까 ext4?

분명히 가능한 해결책 중 하나는 파일을 동일한 파티션(분명히 동일한 파일 시스템)의 다른 폴더에 저장하고 mv디렉토리의 경우 다음 이름 바꾸기 방법을 사용하는 것입니다.

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

대안에 대한 제안이 있으십니까?

편집하다
답변을 받은 후 보드에 있는 테스트 코드를 따라해 보았습니다.

#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;
}

다음 출력이 반환됩니다. 그리고 이름 바꾸기가 파일 시스템 전체에서 작동하지 않는 것을 확인했습니다.

errno : 18
Error occurred while renaming file: Invalid cross-device link

답변1

파일을 원자에서 원자로 이동하고 tmpfs있습니까 ext4?

캔트. 이러한 이름 바꾸기는 파일 시스템 내에서만 유효합니다. 매뉴얼 페이지에는 rename(2)마운트 지점 전체에서 이름을 바꾸려고 하면 반환되는 오류가 명확하게 언급되어 있습니다.

EXDEV 오래된 길그리고새로운 길동일한 마운트된 파일 시스템에 있지 않습니다.

파일 시스템 간에 이동하려면 복사와 삭제를 함께 수행해야 합니다. mv작동하지 않으면 자동으로 작동 rename()하지만 이 경우에는 원자적이지 않습니다.

이 문제에 대한 간단한 해결책은 먼저 파일을 동일한 파일 시스템의 임시 위치에 복사하는 것입니다. 일반적으로 가장 쉬운 방법은 최종 대상과 동일한 디렉터리에 임시 파일을 배치하는 것입니다. 이는 동일한 파일 시스템에 있는 유일한 위치이기 때문입니다. 물론 이를 위해서는 파일을 처리하는 모든 프로세스에 이름을 기반으로 임시 파일을 무시하는 논리가 있어야 합니다.

대략적으로 말하면 다음과 같은 것이 파일에 대해 작동해야 합니다.

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

설명하는 프로세스에 유의하세요.목차본질적으로 다음과 같습니다.

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

나쁘지는 않지만아니요원자. 현재 존재하지 않는 두 실행 mv(또는 호출 ) rename()사이의 기간이 있습니다 . /dst/dir이름을 바꾸면 링크가 자동으로 대체될 수 있으므로 기호 링크를 통해 디렉토리에 액세스하면 이 문제를 해결할 수 있습니다.

관련 정보