동일한 루트 디렉토리를 가진 두 개의 하위 디렉토리가 동일한 마운트된 파일 시스템에 있다는 것이 보장됩니까?

동일한 루트 디렉토리를 가진 두 개의 하위 디렉토리가 동일한 마운트된 파일 시스템에 있다는 것이 보장됩니까?

cpp내가 사용하는 파일은 mkdir( path, ... )경로가 환경 변수(예 getenv( "FOO" );: )에서 오는 디렉토리를 생성합니다.

예를 들어 위에서 생성된 $FOO파일은 `/foo/newPath/' /foo입니다 .path

내 문제 시나리오의 경우 /foo/oldPath/콘텐츠(다른 하위 디렉터리가 없다고 가정)가 있을 수 있으며, 이 경우 파일 /foo/oldPath//foo/newPath.

내 질문은: /foo/newPath/ie 의 하위 디렉토리로 생성되고 동일한 상위 디렉토리를 가지 $FOO므로 두 디렉토리가 모두 동일한 "마운트된 파일 시스템"에 있다는 것이 보장됩니까? Linux의 마운트 지점과 파일 시스템에 대한 나의 이해는 기껏해야 미약합니다./foo/newPath//foo/oldPath/

이 질문의 배경은 다음과 같습니다. 동일한 마운트된 파일 시스템에 있는 경우 다른 대안보다 파일 이동을 더 쉽게 수행할 수 /foo/newPath/있습니다 . 이 함수에 대한 매뉴얼 페이지에는 동일한 "마운트된 파일 시스템"에 있고 그렇지 않은 경우 실패할 것이라고 명시되어 있습니다./foo/oldPath/rename()oldPathnewPath

답변1

그들은 이것을 보장할 수 없습니다. 이는 /foo/oldPath마운트 지점일 수 있습니다.

mount | grep 'on /foo/oldPath'oldPath그러나 이는 "디렉토리가 마운트 지점이 아니라는 것을 나타내는 출력이 없어야 합니다."를 실행하여 쉽게 확인할 수 있습니다.

중첩된 디렉터리를 사용하는 경우 어디에나 마운트 지점이 있을 수 있으므로 더욱 주의해야 합니다.

이것이 자동인지는 확실하지 않지만 마운트의 세 번째 필드(공백으로 구분됨)가 각 행의 마운트 지점이므로 주목할 가치가 있습니다 cut -d ' ' -f 3. 예를 들어 다른 마운트 지점의 하위 문자열이 아닙니다 /foo/oldPath/nested/mountPoint.)

C/C++ 코드로 변환하고 싶다면 이를 사용할 수는 있지만 system("mount | grep 'on /foo/oldPath'")맹세하지는 않습니다. 필요한 경우 StackOverflow에서 더 많은 구현 세부 정보를 얻을 수 있습니다.

답변2

다양한 이유로 이것을 시도해서는 안됩니다 (다른 답변에 자세히 설명되어 있음). /foo/oldPath마운트 지점 자체일 수도 있고 파일 시스템을 덮어쓰고 파일 이동을 방지하는 것이 있을 수도 있습니다. 개별 파일에서 바인드 마운트가 발생할 수도 있으며, 이로 인해 파일 이름을 바꿀 때 문제가 발생할 수도 있습니다.

파일 이름을 바꿀 수 있는지 미리 결정하려고 하지 말고, 대신 파일 이름을 바꾸고 오류를 처리해 보세요.rename오류가 발생하면 -1을 반환하고, 교차 설치 문제로 인해 이름을 바꿀 수 없는 경우 로 errno설정됩니다 . EXDEV그런 다음 다른 방법(복사 및 삭제)을 계속할 수 있습니다.

일반적으로 두 파일 시스템 객체가 동일한 파일 시스템에 있는지 확인하려면 다음을 실행해야 합니다.stat그 위에 있는 장치 식별자( st_dev필드) 를 살펴보세요.struct stat). 동일한 파일 시스템에 있는 두 개의 파일 시스템 개체는 동일한 장치 식별자를 갖습니다.

답변3

overlayfs 에서 실행할 때는 rename()기존 디렉터리 에 의존할 수 없습니다.

범용 파일 관리 도구를 작성하지 않는다면 일반적으로 이 가능성을 무시할 수 있다고 생각합니다.패키지 관리자...이 경우 분명히 고칠 수 없다고 생각할 수도 있고(원자성 이유로) redirect_diroverlayfs의 새로운 형식에 의존하고 싶을 수도 있습니다.

따라서 이것은 이것이 Linux이고 원하지 않으면 POSIX를 준수하지 않을 것이며 "보장"은 매우 강력한 단어임을 알려주는 현학적인 메모에 가깝습니다 :).


https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt

"redirect_dir" 기능을 활성화하지 않으면 하위 디렉터리 또는 병합된 디렉터리의 이름 바꾸기(2)가 EXDEV에서 실패합니다.

Overlayfs는 이미 다른 세부 사항에서 Unix 파일 시스템의 일반적인 기대 사항을 따르지 않습니다.

디렉토리가 아닌 객체(파일, 심볼릭 링크, 장치 특수 파일 등)는 적절하게 상위 또는 하위 파일 시스템에서 렌더링됩니다. 쓰기 액세스 설정, 일부 메타데이터 변경 등 쓰기 액세스가 필요한 방식으로 하위 파일 시스템의 파일에 액세스하면 파일이 먼저 하위 파일 시스템에서 상위 파일 시스템으로 복사됩니다(copy_up). ...

copy_up 작업은 기본적으로 동일한 새 파일을 생성하고 이를 이전 이름으로 이동합니다. 이 inode를 참조하는 열려 있는 모든 파일은 이전 데이터에 액세스합니다.

관련 정보