쓰기 시 디렉터리 복사?

쓰기 시 디렉터리 복사?

일부 파일 시스템(특히 XFS 및 btrfs)은 파일 블록 수준에서 쓰기 중 복사를 지원합니다. 이는 파일이 수정될 때까지 파일 간에 공유되는 기본 블록을 다시 연결함으로써 수행됩니다.

디렉토리는 본질적으로inode에 대한 연관 배열 매핑 파일 이름디렉토리와 유사한 작업을 수행하는 것은 간단해야 합니다.

Linux(또는 다른 Unix 계열 시스템)에서 이 기능을 지원할 수 있는 파일 시스템이 개발되었습니까?

아마도 relink를 사용하는 것과 마찬가지로 커널 지원이 필요할 것입니다. 이런 호출이군요파일 범위 복사()는 디렉토리에 적용됩니다.

이 작업을 적극적으로 수행하는 사람이 있나요? 아직 아무도 하고 싶어하지 않기 때문인가요, 아니면 이것이 나쁜 생각이거나 불필요한 이유가 있나요?

극복해야 할 구체적인 기술적 장애물이 있나요?

당신은 또한 볼 수 있습니다https://serverfault.com/questions/129969/is-there-a-way-to-create-a-copy-on-write-copy-of-a-directory 이것은 실제로 질문에 대답하지 않습니다.

답변1

극복해야 할 구체적인 기술적 장애물이 있나요?

한 가지 장애물은 의미론적 차이입니다. 디렉터리를 복사하면(대상이 아직 존재하지 않는 경우) 모든 콘텐츠의 복사본은 물론 모든 콘텐츠를 가리키는 새 디렉터리도 만들어집니다. 특히 이는 소스 및 대상 디렉토리가 궁극적으로 동일한 이름을 포함하더라도 각 이름의 대상 inode가 다르다는 것을 의미합니다.

파일을 복제하는 것과 같은 방식으로 디렉토리를 복제하면 내용이 동일한 inode를 가리키는 두 개의 디렉토리가 생성됩니다. 실제로 원본 디렉토리의 내용에 대한 하드 링크가 포함된 디렉토리가 생성됩니다. 이는 디렉토리에서는 작동하지 않으며 파일에 대한 놀라운 의미를 생성합니다. as를 dira포함하는 복제본은 편집 도 편집한다는 의미 file인데 , 이는 원래 의도가 아닐 수도 있습니다.dirbdirb/filedira/file

따라서 이는 디렉터리 복사본의 공유 저장소가 일반적으로 작동하지 않으며 일부 경우에만 유용하다는 것을 의미합니다.

copy_file_range그리고FICLONE ioctl에스그러나 기본 스토리지가 공유될 것이라고 가정하지 마십시오. "커널, 이 파일의 일부를 복사해 주세요" 형식의 요청입니다. 저장소를 공유할 수 있고 위임된 복사가 읽기 및 쓰기보다 효율적이라는 장점이 있습니다. 예를 들어, 네트워크 파일 시스템에서는 서버에서 복제를 처리할 수 있으며 이는 클라이언트 기반 복사본보다 훨씬 효율적입니다. 기본 저장소를 공유하지 않고도 디렉터리 복사본에 이 추론을 적용하는 것이 유용할 수 있습니다.

유용한 시나리오에서도 커널 작업은 구현하고 사용하기가 복잡할 수 있습니다.

파일 복제 작업을 수행하려면 처음에 단일 파일 시스템에 있는 단일 파일을 처리해야 합니다. 그럼에도 불구하고 여러 파일 시스템에 걸쳐 복제본을 처리하는 규모가 확장 copy_file_range되면서몇 가지 문제.

디렉토리의 "복제" 작업은 훨씬 더 복잡합니다. 디렉터리 복사에는 디렉터리 자체를 복사하는 것 이상의 작업이 포함됩니다(파일 이름을 inode로 매핑) 및 디렉토리 내용. 이미 언급했듯이 파일을 하드링크할 수는 없습니다. 이것이 허용 가능한 단순화라고 해도 복제하려는 디렉터리 내의 디렉터리와 같이 하드링크할 수 없는 항목을 처리해야 합니다. 그런 다음 마운트 지점이 생겼고 "재미" 수준이 크게 높아졌습니다. 물론 이 모든 것은 권한을 다룰 때 발생합니다.

누군가 이 모든 것을 구현한다고 가정하면 기존 코드를 폴백으로 사용하여 새로운 작업을 사용하도록 관련 사용자 공간 프로그램을 업데이트해야 합니다. 단일 파일 복제와는 달리 의미 체계가 상당히 다르며 모든 경우에 새로운 기능을 결합하는 것이 쉽지 않을 수 있습니다. 결과 파일 시스템 의미도 다릅니다(아마도 가치가 있다면 세상을 무너뜨리지 않고 변경할 수 있습니다. relatime및 참조 noatime).

아직 생각하지 못한 다른 장애물이 있을 수 있지만 첫 번째 장애물은 디렉터리가 실제로 저장소를 공유할 가능성이 거의 없음을 보여줍니다.

관련 정보