모든 파일 시스템이 CP에 대한 쓰기시 복사 메커니즘을 구현합니까?


16

프로세스를 포크 할 때 OS가 Copy on Write 최적화를하는 것을 보았습니다. 포크의 대부분이 exec에 의해 진행되기 때문에, 페이지 할당 비용과 불필요하게 발신자 주소 공간에서 데이터를 복사하는 것을 원하지 않습니다.

ext4 또는 xfs (저널링) 파일 시스템이있는 Linux에서 CP를 수행 할 때도 마찬가지입니다. 이 발생하지 않으면 왜 안됩니까?


누군가가이 흥미로운 질문에 대답하기를 바랍니다
Karim Manaouil

그러나 큰 파일을 복사하는 데 시간이 오래 걸리기 때문에 (데이터를 새 블록에 복사하는 경우) 그렇게 생각하지 않습니다. 이러한 파일 시스템에 COW가 있으면 (최소한도 3 / ext4) 시간 지연을 느끼지 못할 것입니다 (이 경우 데이터 블록에 대한 포인터없이 inode를 복제하고 일부 COW 플래그를 표시하는 경우 만).
Karim Manaouil

Copy-on-Write는 ZFS에서 구현되며 실제로 파일 시스템 / 볼륨 복제본이 매우 저렴합니다. ext4 / xfs는 너무 원시적 인 온 디스크 형식을 가지고 있다고 생각합니다.
myaut

답변:


7

검색 할 키워드는 reflink입니다. 최근 XFS에서 구현되었습니다.

편집 : XFS 구현은 처음에 EXPERIMENTAL로 표시되었습니다. 이 경고는 커널 릴리스 4.16에서 위의 :-)를 쓴 후 몇 개월 후에 제거되었습니다.


11

에서 cp man 페이지 :

--reflink [= always]가 지정되면 경량 복사를 수행하십시오. 여기서 데이터 블록은 수정시에만 복사됩니다. 이것이 불가능하면 복사에 실패하거나 --reflink = auto를 지정하면 표준 복사본으로 폴백합니다.

지원하는 파일 시스템에서이 작품 을 복사 -에 - 쓰기 ( reflink는 ) 주로 순간에 BTRFS. XFS reflink 구현이 개발 중입니다 [1] [2] .


1
NFS, CIFS, OCFS2와 같은 일부 네트워크 파일 시스템은 서버로 전달할 수도 있습니다.
Stéphane Chazelas

2

Linux에는 사용자 공간 프로세스가 커널에게 파일의 쓰기 사본에 사본을 작성하도록 지시 할 수있는 시스템 호출이 있습니다. ioctl의 옵션으로 사용되는 FICLONERANGE 및 FICLONE은 파일 및 파일 내 범위의 쓰기 사본에 사본을 작성할 수있게합니다.

cp --reflink는 파일 시스템이이를 지원하는 사본을 만들기 위해 사용합니다.


1

에 대한 시스템 콜을 도입하지 않으면 cp(또는 최소한 블록을 복사하기 위해) OS는 cp프로그램이 작성하려고 하는 데이터가 다른 블록에서 읽은 데이터 와 동일 하다는 것을 알아내는 데 어려움을 겪습니다 . 또한 "여러 파일이 동일한 블록을 공유"시나리오를 관리하기위한 추가 오버 헤드가 있습니다. 몇 블록 만 다른 큰 유사한 파일은 거의 발생하지 않습니다. 따라서 해당 블록을 복사 한 다음 모든 파일 에이 관리 오버 헤드를 추가하는 것이 전체적으로 저렴 합니다.

이제 BTRFS와 같이 파일 시스템의 다른 복제 / 스냅 샷을 추가하여 파일 (많은 파일)을 "복사"하면 상황이 달라집니다. 이제 파일 시스템의 모든 파일을 "복사" 했습니다. 복사시 복사됩니다. 이것은 존재하지만 ext4에는 존재하지 않습니다.

"저널링 (Journalling)"은 그것과는 완전히 독립적 인 개념으로, 계산되는 파일의 관리 구조입니다.


하나의 비트에서 다른 매우 드문 시간의 이진 복사 본인 큰 파일은 단일 비트가 다르며 오류로 인해 발생합니다.
bitifet December

사본에 대한 시스템 호출이 도입되었습니다 (내 답변 참조).
Q 오리너구리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.