나는 #btrfs IRC에 대한 질문을했는데, should be ok if your hw isn't "buggy"
"버기 ( burggy) "가 아닌 곳을 의미 한다고 말했다 your hw has correct flush/barrier semantics
.
TL; DR : 이는 ZFS와 유사한 방식으로 btrfs가 전원 손실로 인한 데이터 손상으로부터 보호됨을 의미합니다.
이유는 다음과 같습니다. ZFS와 btrfs의 일반적인 개념은 비슷합니다. 둘 다 머클 트리를 데이터 구조로 사용 합니다. 쓰기를하려면 디스크의 여러 블록을 업데이트해야합니다. 파일 시스템은 새로운 데이터를 빈 블록에 기록하고 (기존 파일을 수정하더라도 이전 상태를 반영하는 블록을 수정할 필요가 없음) 새로운 업데이트 된 트리를 작성하여이를 처리합니다. 모든 무거운 작업이 완료되고 데이터 + 업데이트 된 트리가 디스크에 기록되면 헤드 포인터가 새 트리로 업데이트되어 변경 사항이 표시됩니다.
파일에 쓸 때 어떻게 동작해야하는지 다음과 같습니다.
- 디스크의 사용 가능한 블록에 데이터를 씁니다.
- 머클 트리 *를 복사하여 (1)의 변경 사항에 따라 업데이트하십시오.
- 하드웨어에 데이터를 디스크로 플러시하도록 요청합니다. 하드웨어는 보류중인 모든 데이터를 씁니다.
- 새로운 머클 트리에 대한 헤드 포인터를 업데이트합니다.
- 더 이상 필요없는 무료 오래된 블록.
(4) 후에 전원이 끊기면 거래가 완료된 것입니다. 단계 (1) ~ (3) 동안 전원이 꺼지면 파일 시스템은 이전 상태가됩니다 (단계 (1)에서 작성된 데이터는 손실되지만 파일 시스템은 일관됩니다). 파일 시스템 오류를 확인할 필요가 없습니다. 즉, 파일 시스템을 즉시 사용할 수 있으므로 큰 파일 시스템을 확인하는 데 시간이 오래 걸릴 수 있습니다.
다음은 "버기 (Buggy)"하드웨어에서 문제가 발생할 수있는 예입니다.
- 디스크의 사용 가능한 블록에 데이터를 씁니다.
- 머클 트리 *를 복사하여 (1)의 변경 사항에 따라 업데이트하십시오.
- 하드웨어에 데이터를 디스크로 플러시하도록 요청-하드웨어가 완료를 확인하지만 완전히 플러시하지는 않습니다 (예 : 데이터가 디스크의 후기 입 캐시에 남아있을 수 있음).
- 새로운 머클 트리에 대한 헤드 포인터를 업데이트합니다. 이 데이터는 보류중인 다른 데이터보다 먼저 디스크에 기록됩니다 (예 : 디스크 헤드가 올바른 위치에 있기 때문에).
- 단계 (1) 및 (2)에서 작성된 데이터는 디스크에 기록됩니다.
- 더 이상 필요없는 무료 오래된 블록.
(4)와 (5) 사이에서 또는 단계 (5)를 수행하는 동안 전원이 끊기면 파일 시스템이 일치하지 않습니다. 결과적으로 Merkle 트리 및 / 또는 데이터가 부분적으로 만 작성되어 파일 시스템이 일치하지 않을 수 있습니다.
실제로 RAID 컨트롤러를 사용할 때는 특히주의해야합니다 . 일반적으로 디스크에서 후기 입 캐시를 비활성화하고 대신 자체 후기 입 캐시를 사용합니다. 문제가 발생하는 일반적인 두 가지 방법이 있습니다.
* 여기에서 단순화하고 있습니다. 실제로 전체 트리를 복사 할 필요는 없습니다. 변경된 부분 만 추가하면됩니다. 나머지 부분은 기존 트리와 새 트리간에 공유 할 수 있습니다 .
zpool clear -F
명령