질문

질문

XUnix에서 파일을 안전하고 원자적으로 작성하는 일반적인 방법은 다음과 같습니다.

  1. 새 파일 내용을 임시 파일에 씁니다 Y.
  2. rename(2) Y도착하다X

이 두 단계에서 우리는 X"내부" 변경만 수행하는 것 같습니다.

경쟁 조건 및 예기치 않은 데이터 손실(손상되었지만 불완전하거나 손상됨)로부터 보호 X합니다 Y.

X이 경우의 단점은 참조된 inode를 제자리에 쓰지 않고 참조를 새로운 inode 번호로 rename(2)만든다는 것 입니다.X

X파일의 링크 수가 1보다 크면(명시적 하드 링크) 이제 더 이상 이전과 동일한 inode를 참조하지 않으며 하드 링크가 끊어집니다 .

이러한 단점을 제거하는 확실한 방법은 파일을 제자리에 쓰는 것입니다. 그러나 이는 원자적이지 않고 실패할 수 있으며 데이터 손실 등이 발생할 수 있습니다.

rename(2)이를 원자적으로 수행 하되 하드 링크를 유지하는 방법이 있습니까 ?

임시 파일의 inode 번호를 Y동일하게 변경 X하고 X이름을 지정할까요? Inode 수준 "이름 바꾸기".

X이는 에서 참조하는 inode의 새 내용을 효과적으로 작성 Y하지만 하드 링크 속성을 삭제하지 않고 이전 이름을 유지합니다.

가상의 inode "이름 바꾸기"가 원자성이라면 이것이 원자성이고 데이터 손실/경합을 방지할 것이라고 생각합니다.

답변1

질문

(대부분) 완전한 시스템 호출 목록이 있습니다.여기.

"이 inode의 내용을 교체하십시오" 호출이 없다는 것을 알 수 있습니다. 이 콘텐츠를 수정한다는 것은 항상 다음을 의미합니다.

  1. 열리는파일 설명자를 가져오는 파일입니다.
  2. 임의로 선택할 수 있는 찾다원하는 쓰기 오프셋으로
  3. 글쓰기파일로.
  4. 임의로 선택할 수 있는 자르기새 데이터가 더 작은 경우 오래된 데이터입니다.

4단계는 미리 완료할 수 있습니다. 다음과 같은 단축키도 있습니다.쓰다, 단계 #2와 #3을 결합하여 지정된 오프셋에 직접 쓰거나, 또는느슨한 쓰기.

또 다른 방법은메모리 맵, 그러나 작성된 각 바이트가 기본 파일에 독립적으로 전송될 수 있기 때문에 상황은 더욱 악화됩니다(개념적으로 각 쓰기가 1바이트 write호출인 것처럼).

→ 요점은 당신이 가질 수 있는 최선의 시나리오는 여전히 2개의 연산, 즉 1 write과 1 이라는 것입니다 truncate.

어떤 순서로 실행하든 다른 프로세스가 중간 파일을 망쳐 결국 파일이 손상될 위험이 있습니다.

해결책

일반 솔루션

당신이 지적한 대로, 이것이 표준적인 방법이 당신이 유일한 작성자라는 것을 알고 있는 새 파일을 만드는 것입니다 O_TMPFILE.linkat) 이전 이름을 새 파일로 자동 리디렉션합니다.

두 가지 다른 옵션이 있지만 둘 다 어떤 면에서는 실패합니다.

강제 잠금

특별한 플래그 조합을 설정하여 다른 프로세스에 대한 파일 액세스를 거부합니다. 작업을 위한 도구처럼 들리죠? 하지만:

  • 파일 시스템 수준에서 활성화해야 합니다(설치 시 플래그임).
  • 경고하다:Linux의 강제 잠금 구현은 신뢰할 수 없습니다.

    Linux 4.5부터 강제 잠금이 선택 기능이 되었습니다. 이는 이 기능을 완전히 제거하기 위한 첫 번째 단계입니다.

Unix는 항상 잠금 사용을 피했기 때문에 이는 논리적입니다. 오류가 발생하기 쉬우며 모든 극단적인 경우를 포괄하고 교착 상태가 없음을 보장하는 것은 불가능합니다.

권고 잠금

그것은 사용하고있다포캉트르시스템 호출. 그러나 이는 단지 권고사항일 뿐이며 대부분의 프로그램은 이를 무시합니다.

실제로 이는 여러 협력 프로세스 간의 공유 파일에 대한 잠금을 관리하는 데에만 적합합니다.

결론적으로

rename(2)처럼 이를 원자적으로 수행하되 하드 링크를 유지하는 방법이 있습니까?

아니요.

Inode는 낮은 수준이며 거의 구현 세부 사항입니다. 자신의 존재를 인정하는 API는 거의 없습니다( stat콜 패밀리가 유일한 API라고 생각합니다 ).

무엇을 시도하든 아마도 Unix 파일 시스템의 설계를 남용하거나 단순히 너무 많은 것을 요구하고 있을 것입니다.

이것은 다음과 같을 수 있습니다XY 문제?

관련 정보