example.log
ZFS에 호출된 대용량 파일(8GB)이 있다고 가정해 보겠습니다 . 저는 cp example.log example.bak
복사 목적으로 이 작업을 수행합니다. 그런 다음 원본 파일에 일부 바이트를 추가하거나 수정합니다. 무슨 일이야?
ZFS는 전체 8GB 파일을 복사합니까, 아니면 변경된 블록(및 파일 설명자에서 해당 블록을 가리키는 모든 inode 체인)만 복사합니까?
答え1
내가 아는 한, FreeBSD ZFS는 cp를 사용한 쓰기 중 복사를 지원하지 않습니다. 기본 cp에는 이러한 경량 복사본에 대한 옵션이 없는 것 같습니다. 그리고 --reflink
ZFS 시스템에서 GNU cp를 시도할 때 오류가 발생합니다. "cp: 'example.log'에서 'example.bak'을 복제할 수 없습니다. '지원되지 않는 작업'이라는 오류 메시지를 사용해 보았습니다.
어떤 제안자는 Solaris cp에 -z
그러한 복사를 수행할 수 있는 스위치가 있다고 언급했습니다.
그러나 이것이 쓰기 중 복사라는 근본적인 질문에 대한 답변이 되기를 바랍니다.예파일 시스템 스냅샷의 경우: 1000GB의 여유 공간 중 900GB를 사용한다고 가정하면 실제로 900GB를 차지하지 않는 해당 파일 시스템의 스냅샷을 생성하는 데 방해가 되지 않습니다. 처음에는 모두 .
포함된 원본 파일 시스템의 스냅샷을 생성하면
example.log
스냅샷의 읽기 전용 버전과 원래 위치의 라이브 버전이라는 두 개의 "사본"이 생성됩니다. 추가 또는 내부 변경을 통해 복사본이 수정되면 어떻게 되나요? 여기서 마법이 발생합니다. 변경된 블록만 복사되고 공간이 부족해지기 시작합니다. 파일이 변경되자마자 전체가 복사되는 것은 아닙니다.
答え2
이 cp
명령은 새 파일을 생성하여 각 블록의 복사본이 있게 됩니다. 원본 파일에서 몇 바이트를 수정하면 ZFS는 먼저 해당 바이트가 포함된 블록을 디스크에서 RAM으로 복사하고 새 바이트를 여기에 적용한 다음 블록을 디스크의 새 위치에 씁니다. 원래 블록이 해제됩니다(여기에서는 단순화되었지만 본질적으로 그런 일이 발생합니다). 파일의 나머지 블록은 변경되지 않은 상태로 유지됩니다.
질문의 inode 부분과 관련하여 ZFS에는 inode가 없습니다. 대신 "간접 차단"을 유지합니다. 이는 파일 데이터를 가리키는 디스크의 메타데이터 블록입니다. 파일 크기와 파일의 블록 크기에 따라 여러 수준의 간접 블록이 있을 수 있습니다. 수정된 블록을 가리키는 간접 블록은 업데이트되어야 하지만 나머지는 변경되지 않습니다.