mv는 내 fs에 원자입니까?


13

mv내 fs (ext4)의 원자 인지 어떻게 확인할 수 있습니까?

OS는 Red Hat Enterprise Linux Server 릴리즈 6.8입니다.

일반적으로 어떻게 확인할 수 있습니까? 주변을 둘러 보았고 OS가 표준 POSIX인지 찾지 못했습니다.


시도 했습니까 strace?
와일드 카드

답변:


9

흥미롭게도 대답은 "그것은 달려있다"고 생각됩니다.

명확하게하기 위해, mv지정

mv유틸리티에 해당 작업을 수행해야한다 rename() 기능을

이름 바꾸기 기능 사양 상태 :

rename()기능은 일반 파일에서 ISO C 표준으로 정의 된 것과 동일합니다. 여기에 포함하면 해당 정의가 확장되어 디렉토리에 대한 조치가 포함되고 새 매개 변수가 이미 존재하는 파일의 이름을 지정할 때 동작을 지정합니다. 이 사양에서는 함수의 동작이 원 자성이어야합니다.

그러나 주에 대한 최신 ISO C 사양rename()다음과 같습니다.

7.21.4.2 rename기능

개요

#include <stdio.h>
int rename(const char *old, const char *new);

기술

rename함수는 이름이 가리키는 문자열 인 파일을 old이후에 가리키는 문자열이 지정한 이름으로 알려지게합니다 new. 이름 old이 지정된 파일은 해당 이름 으로 더 이상 액세스 할 수 없습니다. 로 표시된 문자열로 명명 된 파일 newrename함수를 호출하기 전에 존재 하면 동작이 구현 정의됩니다.

보고

rename작업이 성공하면 이 함수는 0을, 실패하면 0이 아닌 값을 반환합니다.이 경우 파일이 이전에 존재 한 경우 여전히 원래 이름으로 알려집니다.

놀랍게도 원자성에 대한 명시적인 요구 사항이 없다는 점에 유의하십시오. 공개적으로 사용 가능한 최신 C 표준 어딘가에 필요할 수 있지만 찾을 수 없었습니다. 누구든지 그러한 요구 사항을 찾을 수 있다면 편집 및 의견을 환영합니다.

또한 rename ()이 원 자성입니까?를 참조하십시오 .

리눅스 맨 페이지 :

newpath이미 존재하는 경우 원자 적으로 대체되므로 액세스하려는 다른 프로세스 newpath가 누락 된 지점 이 없습니다. 그러나 아마 모두있는 창이있을 것입니다 oldpathnewpath파일을 참조 이름이 변경된다.

리눅스 매뉴얼 페이지 는 파일 교체 가 원자 적이라고 주장한다 .

그러나 원자력을 테스트 하고 확인 하는 것이 얼마나 멀리해야하는지 매우 어려울 수 있습니다. "mv가 원자 적인지 어떻게 확인할 수 있는지"를 사용할 때의 의미에 대해서는 명확하지 않습니다. 원자 성인 요구 사항 / 사양 / 문서를 원 하십니까? 아니면 실제로 테스트 해야합니까?

또한 위 의 두 피연산자 파일 이름이 동일한 파일 시스템에 있다고 가정 합니다. mv유틸리티 에 대한 표준 제한을 찾을 수 없습니다 .


나는 움직임이 원자 적인지 확인해야한다. 테스트하기에 충분합니까? 말할 수 없습니다. 예, 동일한 fs (ext4에서 ext4)로 작업하고 있습니다.
Tizianoreica

1
POSIX는 원 자성을 보장하지는 않지만 대부분의 유닉스 변형과 마찬가지로 Linux는 ext4와 같은“기본”파일 시스템에 대해 원 자성을 보장합니다.
Gilles 'SO- 악마 그만

1
ISO C가 전체 시스템이 아닌 하나의 프로그램의 동작 만 정의한다는 점을 감안할 때 rename원자성에 대해 언급하는 것은 이상 할 것 입니다.
Gilles 'SO- 악마 중지

3
POSIX doc의 이전 부분을 참조하는 이전 문장 ( "새 포함 매개 변수는 이미 존재하는 파일의 이름을 지정할 때의 동작을 지정합니다")을 참조하여 "해당 스펙"을 읽었습니다. 전체에 걸쳐 다른 스레드에 계속 표시되며 new 또는 old에서 참조하는 파일을 참조하십시오 ... "). 다시 말해 POSIX는 ISO C 표준을 구현하겠다고 약속하고 ISO C가 제공하는 것 이상의 추가 보증을합니다. 그 해석이 도움이됩니까?
SimonJ

1
@Tizianoreica 나는 이것이 고대 게시물이라는 것을 알고 있지만 방금 당신의 의견을 보았고 명확히해야한다고 생각했습니다. 실제 파일 시스템은 이름이 원자가되도록 동일해야합니다. 동일한 유형 의 파일 시스템이 아닙니다 . 예를 들어 /ext4 fs와 /tmp다른 ext4 fs를 가지고 있다면 , 원자 적으로 mv를 mv 할 수 없습니다 .
Wodin

0

mvrename시스템 호출을 기반으로 하며 rename()원자 적입니다. 맨 페이지를 볼 수 rename(2)있습니다.

당신 은 rename () atomic? 에 대한 답변을 찾을 수 있습니다 스택 오버 플로우.

어떤 종류의 fs를 사용 했습니까?


fs는 ext4-os가 이미 지정되었습니다.
Tizianoreica

-1

시스템 호출과 그 원 자성을 확인하는 것 외에도 inotify-tools테스트가 될 수 있지만 원자 성의 보장 증거인지 확실하지 않습니다.

껍질 2 개를 엽니 다. 다음 중 하나의 이동 대상 디렉토리를보십시오.

inotifywait -m target/

파일을 다른 디렉토리로 이동하십시오.

mv foobar target/

inotifywait하나 개의 라인을 표시해야합니다 :

target/ MOVED_TO foobar

ls target/and 에 대한 응답 과 비교하여 원자 적으로 보입니다 touch target/a.

# the response to ls target/
target/ OPEN,ISDIR 
target/ ACCESS,ISDIR 
target/ CLOSE_NOWRITE,CLOSE,ISDIR 

추신

적어도 파일에 대한 비동기 다중 프로세스 협력이 inotify(실제로 원자 적) 안전하다는 것을 보여줍니다 . 어쨌든 inotify작업 후 최종 신호를 준 후에 만 응답 합니다. 예를 들어, 생산자-소비자 설정은으로 쉽고 안전하게 구현할 수 있습니다 inotify.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.